From b67c1c6523fc1c7413be4c8270cc1ff00d0ecf02 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 19 Nov 2021 16:40:30 +0530 Subject: [PATCH 01/11] .conf CRUD support added --- lib/context.js | 14 + lib/http.js | 42 + lib/platform/node/node_http.js | 22 + lib/service.js | 119 +- ...40852eb3b30bc694a31ea4d853ea54b53a73249.js | 2876 +++++++++++++++++ ...84d81786a58e3cde0369210c14b0a65c62d3b58.js | 2875 ++++++++++++++++ tests/service_tests/configuration.js | 62 + 7 files changed, 6009 insertions(+), 1 deletion(-) create mode 100644 node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js create mode 100644 node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js diff --git a/lib/context.js b/lib/context.js index aa2980ba3..71c55427a 100644 --- a/lib/context.js +++ b/lib/context.js @@ -371,6 +371,20 @@ return this._requestWrapper(request, callback); }, + get_v2: function(path, params) { + var that = this; + // var request = function() { + return that.http.get_v2( + that.urlify(path), + that._headers(), + params, + that.timeout, + ); + // }; + + // return this._requestWrapper(request); + }, + /** * Performs a DELETE request. * diff --git a/lib/http.js b/lib/http.js index 36c52ba01..5f3bed530 100644 --- a/lib/http.js +++ b/lib/http.js @@ -144,6 +144,17 @@ return this.request(url, message, callback); }, + get_v2: function(url, headers, params, timeout) { + var message = { + method: "GET", + headers: headers, + timeout: timeout, + query: params + }; + + return this.request_v2(url, message); + }, + /** * Performs a POST request. * @@ -256,6 +267,37 @@ return this.makeRequest(encodedUrl, options, wrappedCallback); }, + request_v2: function(url, message) { + var that = this; + var query = utils.getWithVersion(this.version, queryBuilderMap)(message); + var post = message.post || {}; + + var encodedUrl = url + "?" + Http.encode(query); + var body = message.body ? message.body : Http.encode(post); + + var cookieString = that._getCookieString(); + + if (cookieString.length !== 0) { + message.headers["Cookie"] = cookieString; + + // Remove Authorization header + // Splunk will use Authorization header and ignore Cookies if Authorization header is sent + delete message.headers["Authorization"]; + } + + var options = { + method: message.method, + headers: message.headers, + timeout: message.timeout, + body: body + }; + + // Now we can invoke the user-provided HTTP class, + // var res_2 = await this.makeRequest_v2(encodedUrl, options); + // console.log(res_2.body.entry[0]); + return this.makeRequest_v2(encodedUrl, options); + }, + /** * Encapsulates the client-specific logic for performing a request. This * function is meant to be overriden by subclasses. diff --git a/lib/platform/node/node_http.js b/lib/platform/node/node_http.js index 292f4bfa5..4393b5bc2 100644 --- a/lib/platform/node/node_http.js +++ b/lib/platform/node/node_http.js @@ -85,6 +85,28 @@ return req; }, + makeRequest_v2: async function(url, message) { + var request_options = { + url: url, + method: message.method, + headers: message.headers || {}, + body: message.body || "", + timeout: message.timeout || 0, + jar: false, + followAllRedirects: true, + strictSSL: false, + rejectUnauthorized : false, + }; + + // Get the byte-length of the content, which adjusts for multi-byte characters + request_options.headers["Content-Length"] = Buffer.byteLength(request_options.body, "utf8"); + + var that = this; + var response = needle(request_options.method, request_options.url, request_options.body, request_options); + + return response; + }, + parseJson: function(json) { return JSON.parse(json); } diff --git a/lib/service.js b/lib/service.js index 6d88547a9..c6de116cf 100644 --- a/lib/service.js +++ b/lib/service.js @@ -733,6 +733,21 @@ ); }, + get_v2: function(relpath, params) { + var url = this.qualifiedPath; + + // If we have a relative path, we will append it with a preceding + // slash. + if (relpath) { + url = url + "/" + relpath; + } + + return this.service.get_v2( + url, + params, + ); + }, + /** * Performs a relative POST request on an endpoint's path, * combined with the parameters and a relative path if specified. @@ -1394,6 +1409,19 @@ return req; }, + + fetch_v2: async function(options) { + options = options || {}; + if (!options.count) { + options.count = 0; + } + + var that = this; + var response = await that.get_v2("", options); + // return response; + that._load(response.body); + return that; + }, /** * Returns a specific entity from the collection. @@ -3091,7 +3119,96 @@ }); return req; - } + }, + + doesFileExist: async function(filename) { + try { + var that = this; + + // 1. Fetch files list + var response = await this.get_v2("", {__conf: filename}); + + // 2. Filter the files + var files = response?.body?.entry?.filter(f => f.name === filename); + + // 2. Check if the file exists + if(files && files.length == 0) { + return { code:"FILE_NOT_FOUND", message: `File with the name '${filename}' does not exist.`}; + } + + // 3. Create a local instance + var configurationFile = new root.ConfigurationFile(that.service, filename); + + // 4. Load the file content + var fetchedFile = await configurationFile.fetch_v2(); + + return {file: fetchedFile}; + } + catch(error) { + return { errorCode:"SYSTEM_ERROR", errorMessage: error}; + } + }, + + doesStanzaExist: async function(file, stanza) { + try { + + // 1. check if the stanza exists + var fetchedStanza = file.item(stanza); + + if(!fetchedStanza) { + return { code:"STANZA_NOT_FOUND", message: `Stanza with the name '${stanza}' does not exist.`}; + } + else { + return {stanza: fetchedStanza}; + } + } + catch(error) { + return { errorCode:"SYSTEM_ERROR", errorMessage: error}; + } + }, + + create_v2: async function (configs, svc, filename, stanza, keyValueMap, callback) { + callback = callback || function() {}; + var that = this; + + // 1. Check if the file exists + var doesFileExistResponse = await this.doesFileExist(filename); + var configFile = doesFileExistResponse.file; + + // 2. If the file doesn't exist, create a new file + if(!configFile) { + console.log(doesFileExistResponse); + console.log("Creating a new configuration file..."); + + that.create( { __conf: filename }, + (err, newFile) => console.log(`Configuration File created: ${filename}`) ); + + configFile = new root.ConfigurationFile( that.service, filename ); + configFile = await configFile.fetch_v2(); + } + + // 2. Check if the stanza exists + var doesStanzaExistResponse = await this.doesStanzaExist(configFile, stanza); + var configStanza = doesStanzaExistResponse.stanza; + + // 3. If the stanza doesn't exist, create a new stanza with given keyValueMap + if(!configStanza) { + console.log(doesStanzaExistResponse); + console.log("Creating a new configuration stanza..."); + + configFile.create(stanza, keyValueMap, function (err, newStanza) { + console.log(`Configuration Stanza created: ${stanza}`); + callback(); + }); + } + // 4. If the stanza exists, update it with the keyValueMap + else { + configStanza.update(keyValueMap, (err, updatedStanza) => { + console.log(`Configuration Stanza updated: ${stanza}`); + callback(); + }); + } + }, }); /** diff --git a/node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js b/node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js new file mode 100644 index 000000000..e43a4157e --- /dev/null +++ b/node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js @@ -0,0 +1,2876 @@ +function cov_1ks4ntaci2(){var path="/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js";var hash="b527bc3bbffe3a4fee511c63590269cdc3ea500f";var global=new Function("return this")();var gcv="__coverage__";var coverageData={path:"/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js",statementMap:{"0":{start:{line:16,column:0},end:{line:5803,column:5}},"1":{start:{line:19,column:22},end:{line:19,column:42}},"2":{start:{line:20,column:22},end:{line:20,column:39}},"3":{start:{line:21,column:22},end:{line:21,column:40}},"4":{start:{line:22,column:22},end:{line:22,column:46}},"5":{start:{line:23,column:22},end:{line:23,column:53}},"6":{start:{line:24,column:22},end:{line:24,column:40}},"7":{start:{line:26,column:15},end:{line:26,column:30}},"8":{start:{line:27,column:18},end:{line:27,column:22}},"9":{start:{line:37,column:22},end:{line:41,column:6}},"10":{start:{line:39,column:12},end:{line:39,column:47}},"11":{start:{line:51,column:4},end:{line:664,column:7}},"12":{start:{line:73,column:12},end:{line:73,column:47}},"13":{start:{line:77,column:12},end:{line:77,column:72}},"14":{start:{line:78,column:12},end:{line:78,column:66}},"15":{start:{line:79,column:12},end:{line:79,column:76}},"16":{start:{line:80,column:12},end:{line:80,column:69}},"17":{start:{line:81,column:12},end:{line:81,column:75}},"18":{start:{line:82,column:12},end:{line:82,column:66}},"19":{start:{line:83,column:12},end:{line:83,column:67}},"20":{start:{line:84,column:12},end:{line:84,column:73}},"21":{start:{line:85,column:12},end:{line:85,column:67}},"22":{start:{line:86,column:12},end:{line:86,column:78}},"23":{start:{line:87,column:12},end:{line:87,column:72}},"24":{start:{line:106,column:12},end:{line:116,column:15}},"25":{start:{line:136,column:12},end:{line:136,column:47}},"26":{start:{line:164,column:12},end:{line:164,column:60}},"27":{start:{line:192,column:12},end:{line:192,column:53}},"28":{start:{line:218,column:12},end:{line:218,column:59}},"29":{start:{line:244,column:12},end:{line:244,column:62}},"30":{start:{line:271,column:12},end:{line:271,column:71}},"31":{start:{line:300,column:12},end:{line:300,column:50}},"32":{start:{line:312,column:12},end:{line:312,column:56}},"33":{start:{line:337,column:12},end:{line:337,column:40}},"34":{start:{line:366,column:12},end:{line:366,column:51}},"35":{start:{line:397,column:12},end:{line:400,column:13}},"36":{start:{line:398,column:16},end:{line:398,column:37}},"37":{start:{line:399,column:16},end:{line:399,column:33}},"38":{start:{line:402,column:23},end:{line:402,column:53}},"39":{start:{line:403,column:12},end:{line:403,column:56}},"40":{start:{line:420,column:12},end:{line:423,column:13}},"41":{start:{line:421,column:16},end:{line:421,column:37}},"42":{start:{line:422,column:16},end:{line:422,column:33}},"43":{start:{line:424,column:22},end:{line:424,column:56}},"44":{start:{line:425,column:12},end:{line:425,column:43}},"45":{start:{line:453,column:12},end:{line:456,column:13}},"46":{start:{line:454,column:16},end:{line:454,column:37}},"47":{start:{line:455,column:16},end:{line:455,column:33}},"48":{start:{line:458,column:23},end:{line:458,column:53}},"49":{start:{line:459,column:12},end:{line:459,column:63}},"50":{start:{line:478,column:12},end:{line:478,column:49}},"51":{start:{line:480,column:23},end:{line:480,column:27}},"52":{start:{line:481,column:22},end:{line:497,column:14}},"53":{start:{line:482,column:16},end:{line:496,column:17}},"54":{start:{line:483,column:20},end:{line:483,column:34}},"55":{start:{line:486,column:35},end:{line:486,column:74}},"56":{start:{line:487,column:31},end:{line:487,column:60}},"57":{start:{line:488,column:20},end:{line:495,column:23}},"58":{start:{line:489,column:24},end:{line:494,column:25}},"59":{start:{line:490,column:28},end:{line:490,column:35}},"60":{start:{line:493,column:28},end:{line:493,column:60}},"61":{start:{line:499,column:12},end:{line:499,column:23}},"62":{start:{line:517,column:12},end:{line:517,column:49}},"63":{start:{line:519,column:29},end:{line:519,column:54}},"64":{start:{line:520,column:12},end:{line:520,column:46}},"65":{start:{line:544,column:12},end:{line:547,column:13}},"66":{start:{line:545,column:16},end:{line:545,column:34}},"67":{start:{line:546,column:16},end:{line:546,column:28}},"68":{start:{line:549,column:12},end:{line:549,column:49}},"69":{start:{line:550,column:12},end:{line:550,column:34}},"70":{start:{line:552,column:12},end:{line:552,column:29}},"71":{start:{line:554,column:12},end:{line:561,column:15}},"72":{start:{line:555,column:16},end:{line:560,column:17}},"73":{start:{line:556,column:20},end:{line:556,column:34}},"74":{start:{line:559,column:20},end:{line:559,column:50}},"75":{start:{line:581,column:12},end:{line:584,column:13}},"76":{start:{line:582,column:16},end:{line:582,column:33}},"77":{start:{line:583,column:16},end:{line:583,column:27}},"78":{start:{line:586,column:12},end:{line:586,column:49}},"79":{start:{line:587,column:25},end:{line:590,column:13}},"80":{start:{line:592,column:12},end:{line:600,column:15}},"81":{start:{line:593,column:16},end:{line:599,column:17}},"82":{start:{line:594,column:20},end:{line:594,column:34}},"83":{start:{line:597,column:34},end:{line:597,column:63}},"84":{start:{line:598,column:20},end:{line:598,column:50}},"85":{start:{line:625,column:12},end:{line:628,column:13}},"86":{start:{line:626,column:16},end:{line:626,column:34}},"87":{start:{line:627,column:16},end:{line:627,column:28}},"88":{start:{line:630,column:12},end:{line:630,column:49}},"89":{start:{line:631,column:12},end:{line:631,column:34}},"90":{start:{line:634,column:12},end:{line:636,column:13}},"91":{start:{line:635,column:16},end:{line:635,column:46}},"92":{start:{line:638,column:23},end:{line:638,column:45}},"93":{start:{line:639,column:25},end:{line:639,column:31}},"94":{start:{line:640,column:26},end:{line:640,column:56}},"95":{start:{line:641,column:23},end:{line:641,column:28}},"96":{start:{line:642,column:22},end:{line:642,column:28}},"97":{start:{line:643,column:23},end:{line:643,column:25}},"98":{start:{line:645,column:22},end:{line:660,column:13}},"99":{start:{line:653,column:20},end:{line:658,column:21}},"100":{start:{line:654,column:24},end:{line:654,column:38}},"101":{start:{line:657,column:24},end:{line:657,column:54}},"102":{start:{line:662,column:12},end:{line:662,column:23}},"103":{start:{line:674,column:4},end:{line:815,column:7}},"104":{start:{line:686,column:12},end:{line:688,column:13}},"105":{start:{line:687,column:16},end:{line:687,column:61}},"106":{start:{line:690,column:12},end:{line:692,column:13}},"107":{start:{line:691,column:16},end:{line:691,column:60}},"108":{start:{line:694,column:12},end:{line:694,column:35}},"109":{start:{line:695,column:12},end:{line:695,column:47}},"110":{start:{line:699,column:12},end:{line:699,column:53}},"111":{start:{line:701,column:12},end:{line:701,column:54}},"112":{start:{line:702,column:12},end:{line:702,column:53}},"113":{start:{line:722,column:22},end:{line:722,column:40}},"114":{start:{line:726,column:12},end:{line:728,column:13}},"115":{start:{line:727,column:16},end:{line:727,column:42}},"116":{start:{line:730,column:12},end:{line:734,column:14}},"117":{start:{line:738,column:22},end:{line:738,column:40}},"118":{start:{line:742,column:12},end:{line:744,column:13}},"119":{start:{line:743,column:16},end:{line:743,column:42}},"120":{start:{line:746,column:12},end:{line:749,column:14}},"121":{start:{line:769,column:22},end:{line:769,column:40}},"122":{start:{line:773,column:12},end:{line:775,column:13}},"123":{start:{line:774,column:16},end:{line:774,column:42}},"124":{start:{line:777,column:12},end:{line:781,column:14}},"125":{start:{line:801,column:22},end:{line:801,column:40}},"126":{start:{line:805,column:12},end:{line:807,column:13}},"127":{start:{line:806,column:16},end:{line:806,column:42}},"128":{start:{line:809,column:12},end:{line:813,column:14}},"129":{start:{line:828,column:4},end:{line:916,column:7}},"130":{start:{line:844,column:27},end:{line:844,column:60}},"131":{start:{line:846,column:12},end:{line:846,column:43}},"132":{start:{line:847,column:12},end:{line:847,column:39}},"133":{start:{line:848,column:12},end:{line:848,column:34}},"134":{start:{line:849,column:12},end:{line:849,column:29}},"135":{start:{line:853,column:12},end:{line:853,column:60}},"136":{start:{line:854,column:12},end:{line:854,column:60}},"137":{start:{line:855,column:12},end:{line:855,column:65}},"138":{start:{line:856,column:12},end:{line:856,column:60}},"139":{start:{line:857,column:12},end:{line:857,column:59}},"140":{start:{line:866,column:12},end:{line:866,column:50}},"141":{start:{line:878,column:12},end:{line:878,column:48}},"142":{start:{line:879,column:12},end:{line:879,column:43}},"143":{start:{line:892,column:12},end:{line:892,column:50}},"144":{start:{line:903,column:12},end:{line:903,column:36}},"145":{start:{line:914,column:12},end:{line:914,column:31}},"146":{start:{line:929,column:4},end:{line:1238,column:7}},"147":{start:{line:954,column:12},end:{line:954,column:50}},"148":{start:{line:958,column:12},end:{line:958,column:58}},"149":{start:{line:959,column:12},end:{line:959,column:58}},"150":{start:{line:960,column:12},end:{line:960,column:59}},"151":{start:{line:961,column:12},end:{line:961,column:59}},"152":{start:{line:962,column:12},end:{line:962,column:59}},"153":{start:{line:963,column:12},end:{line:963,column:58}},"154":{start:{line:964,column:12},end:{line:964,column:56}},"155":{start:{line:965,column:12},end:{line:965,column:59}},"156":{start:{line:966,column:12},end:{line:966,column:60}},"157":{start:{line:967,column:12},end:{line:967,column:62}},"158":{start:{line:968,column:12},end:{line:968,column:59}},"159":{start:{line:969,column:12},end:{line:969,column:60}},"160":{start:{line:970,column:12},end:{line:970,column:59}},"161":{start:{line:973,column:12},end:{line:973,column:34}},"162":{start:{line:974,column:12},end:{line:974,column:34}},"163":{start:{line:975,column:12},end:{line:975,column:34}},"164":{start:{line:976,column:12},end:{line:976,column:34}},"165":{start:{line:988,column:12},end:{line:988,column:80}},"166":{start:{line:992,column:12},end:{line:997,column:14}},"167":{start:{line:999,column:12},end:{line:999,column:36}},"168":{start:{line:1002,column:12},end:{line:1002,column:58}},"169":{start:{line:1003,column:12},end:{line:1003,column:74}},"170":{start:{line:1004,column:12},end:{line:1004,column:58}},"171":{start:{line:1005,column:12},end:{line:1005,column:58}},"172":{start:{line:1006,column:12},end:{line:1006,column:60}},"173":{start:{line:1007,column:12},end:{line:1007,column:60}},"174":{start:{line:1008,column:12},end:{line:1008,column:60}},"175":{start:{line:1020,column:12},end:{line:1020,column:32}},"176":{start:{line:1032,column:12},end:{line:1032,column:29}},"177":{start:{line:1044,column:12},end:{line:1044,column:31}},"178":{start:{line:1055,column:12},end:{line:1055,column:32}},"179":{start:{line:1066,column:12},end:{line:1066,column:33}},"180":{start:{line:1077,column:12},end:{line:1077,column:35}},"181":{start:{line:1096,column:12},end:{line:1099,column:13}},"182":{start:{line:1097,column:16},end:{line:1097,column:35}},"183":{start:{line:1098,column:16},end:{line:1098,column:29}},"184":{start:{line:1100,column:12},end:{line:1100,column:49}},"185":{start:{line:1102,column:12},end:{line:1102,column:36}},"186":{start:{line:1104,column:23},end:{line:1104,column:27}},"187":{start:{line:1105,column:12},end:{line:1113,column:15}},"188":{start:{line:1106,column:16},end:{line:1112,column:17}},"189":{start:{line:1107,column:20},end:{line:1107,column:34}},"190":{start:{line:1110,column:20},end:{line:1110,column:75}},"191":{start:{line:1111,column:20},end:{line:1111,column:41}},"192":{start:{line:1125,column:12},end:{line:1125,column:49}},"193":{start:{line:1127,column:23},end:{line:1127,column:27}},"194":{start:{line:1128,column:12},end:{line:1130,column:15}},"195":{start:{line:1129,column:16},end:{line:1129,column:30}},"196":{start:{line:1143,column:12},end:{line:1143,column:49}},"197":{start:{line:1145,column:12},end:{line:1147,column:13}},"198":{start:{line:1146,column:16},end:{line:1146,column:71}},"199":{start:{line:1149,column:23},end:{line:1149,column:27}},"200":{start:{line:1150,column:22},end:{line:1168,column:14}},"201":{start:{line:1151,column:16},end:{line:1167,column:17}},"202":{start:{line:1152,column:20},end:{line:1152,column:52}},"203":{start:{line:1153,column:20},end:{line:1153,column:40}},"204":{start:{line:1155,column:21},end:{line:1167,column:17}},"205":{start:{line:1156,column:20},end:{line:1163,column:23}},"206":{start:{line:1157,column:24},end:{line:1162,column:25}},"207":{start:{line:1158,column:28},end:{line:1158,column:35}},"208":{start:{line:1161,column:28},end:{line:1161,column:60}},"209":{start:{line:1166,column:20},end:{line:1166,column:40}},"210":{start:{line:1170,column:12},end:{line:1170,column:23}},"211":{start:{line:1182,column:12},end:{line:1182,column:49}},"212":{start:{line:1184,column:23},end:{line:1184,column:27}},"213":{start:{line:1185,column:12},end:{line:1192,column:15}},"214":{start:{line:1186,column:16},end:{line:1191,column:17}},"215":{start:{line:1187,column:20},end:{line:1187,column:34}},"216":{start:{line:1190,column:20},end:{line:1190,column:41}},"217":{start:{line:1204,column:12},end:{line:1204,column:49}},"218":{start:{line:1206,column:23},end:{line:1206,column:27}},"219":{start:{line:1207,column:12},end:{line:1214,column:15}},"220":{start:{line:1208,column:16},end:{line:1213,column:17}},"221":{start:{line:1209,column:20},end:{line:1209,column:34}},"222":{start:{line:1212,column:20},end:{line:1212,column:41}},"223":{start:{line:1226,column:12},end:{line:1226,column:49}},"224":{start:{line:1228,column:23},end:{line:1228,column:27}},"225":{start:{line:1229,column:12},end:{line:1236,column:15}},"226":{start:{line:1230,column:16},end:{line:1235,column:17}},"227":{start:{line:1231,column:20},end:{line:1231,column:34}},"228":{start:{line:1234,column:20},end:{line:1234,column:41}},"229":{start:{line:1248,column:4},end:{line:1579,column:7}},"230":{start:{line:1273,column:12},end:{line:1273,column:50}},"231":{start:{line:1277,column:12},end:{line:1277,column:66}},"232":{start:{line:1278,column:12},end:{line:1278,column:66}},"233":{start:{line:1279,column:12},end:{line:1279,column:67}},"234":{start:{line:1280,column:12},end:{line:1280,column:65}},"235":{start:{line:1281,column:12},end:{line:1281,column:65}},"236":{start:{line:1282,column:12},end:{line:1282,column:78}},"237":{start:{line:1285,column:12},end:{line:1285,column:38}},"238":{start:{line:1286,column:12},end:{line:1286,column:38}},"239":{start:{line:1287,column:12},end:{line:1287,column:38}},"240":{start:{line:1288,column:12},end:{line:1288,column:38}},"241":{start:{line:1289,column:12},end:{line:1289,column:38}},"242":{start:{line:1301,column:12},end:{line:1301,column:50}},"243":{start:{line:1314,column:12},end:{line:1314,column:36}},"244":{start:{line:1316,column:27},end:{line:1316,column:29}},"245":{start:{line:1317,column:33},end:{line:1317,column:35}},"246":{start:{line:1318,column:37},end:{line:1318,column:59}},"247":{start:{line:1319,column:12},end:{line:1331,column:13}},"248":{start:{line:1319,column:24},end:{line:1319,column:25}},"249":{start:{line:1320,column:28},end:{line:1320,column:49}},"250":{start:{line:1321,column:29},end:{line:1321,column:58}},"251":{start:{line:1322,column:16},end:{line:1322,column:36}},"252":{start:{line:1323,column:16},end:{line:1323,column:38}},"253":{start:{line:1325,column:16},end:{line:1330,column:17}},"254":{start:{line:1326,column:20},end:{line:1326,column:61}},"255":{start:{line:1329,column:20},end:{line:1329,column:59}},"256":{start:{line:1332,column:12},end:{line:1332,column:44}},"257":{start:{line:1333,column:12},end:{line:1333,column:50}},"258":{start:{line:1334,column:12},end:{line:1334,column:62}},"259":{start:{line:1335,column:12},end:{line:1335,column:62}},"260":{start:{line:1336,column:12},end:{line:1336,column:64}},"261":{start:{line:1348,column:12},end:{line:1348,column:31}},"262":{start:{line:1359,column:12},end:{line:1359,column:32}},"263":{start:{line:1370,column:12},end:{line:1370,column:33}},"264":{start:{line:1389,column:12},end:{line:1392,column:13}},"265":{start:{line:1390,column:16},end:{line:1390,column:35}},"266":{start:{line:1391,column:16},end:{line:1391,column:29}},"267":{start:{line:1393,column:12},end:{line:1393,column:49}},"268":{start:{line:1395,column:12},end:{line:1395,column:36}},"269":{start:{line:1396,column:12},end:{line:1398,column:13}},"270":{start:{line:1397,column:16},end:{line:1397,column:34}},"271":{start:{line:1400,column:23},end:{line:1400,column:27}},"272":{start:{line:1401,column:22},end:{line:1409,column:14}},"273":{start:{line:1402,column:16},end:{line:1408,column:17}},"274":{start:{line:1403,column:20},end:{line:1403,column:34}},"275":{start:{line:1406,column:20},end:{line:1406,column:46}},"276":{start:{line:1407,column:20},end:{line:1407,column:41}},"277":{start:{line:1411,column:12},end:{line:1411,column:23}},"278":{start:{line:1415,column:12},end:{line:1415,column:36}},"279":{start:{line:1416,column:12},end:{line:1418,column:13}},"280":{start:{line:1417,column:16},end:{line:1417,column:34}},"281":{start:{line:1420,column:23},end:{line:1420,column:27}},"282":{start:{line:1421,column:27},end:{line:1421,column:57}},"283":{start:{line:1423,column:12},end:{line:1423,column:38}},"284":{start:{line:1424,column:12},end:{line:1424,column:24}},"285":{start:{line:1449,column:12},end:{line:1451,column:13}},"286":{start:{line:1450,column:16},end:{line:1450,column:33}},"287":{start:{line:1453,column:12},end:{line:1455,column:13}},"288":{start:{line:1454,column:16},end:{line:1454,column:64}},"289":{start:{line:1457,column:12},end:{line:1459,column:13}},"290":{start:{line:1458,column:16},end:{line:1458,column:136}},"291":{start:{line:1461,column:27},end:{line:1461,column:31}},"292":{start:{line:1462,column:12},end:{line:1504,column:13}},"293":{start:{line:1463,column:31},end:{line:1463,column:55}},"294":{start:{line:1465,column:16},end:{line:1500,column:17}},"295":{start:{line:1470,column:20},end:{line:1470,column:39}},"296":{start:{line:1472,column:21},end:{line:1500,column:17}},"297":{start:{line:1476,column:20},end:{line:1476,column:84}},"298":{start:{line:1477,column:20},end:{line:1482,column:21}},"299":{start:{line:1478,column:24},end:{line:1478,column:43}},"300":{start:{line:1481,column:24},end:{line:1481,column:36}},"301":{start:{line:1484,column:21},end:{line:1500,column:17}},"302":{start:{line:1488,column:20},end:{line:1488,column:77}},"303":{start:{line:1493,column:20},end:{line:1499,column:21}},"304":{start:{line:1493,column:32},end:{line:1493,column:33}},"305":{start:{line:1494,column:37},end:{line:1494,column:48}},"306":{start:{line:1495,column:24},end:{line:1495,column:88}},"307":{start:{line:1496,column:24},end:{line:1498,column:25}},"308":{start:{line:1497,column:28},end:{line:1497,column:42}},"309":{start:{line:1503,column:16},end:{line:1503,column:28}},"310":{start:{line:1525,column:12},end:{line:1525,column:49}},"311":{start:{line:1526,column:23},end:{line:1526,column:27}},"312":{start:{line:1527,column:22},end:{line:1554,column:14}},"313":{start:{line:1528,column:16},end:{line:1553,column:17}},"314":{start:{line:1529,column:20},end:{line:1529,column:34}},"315":{start:{line:1532,column:32},end:{line:1532,column:51}},"316":{start:{line:1533,column:20},end:{line:1535,column:21}},"317":{start:{line:1534,column:24},end:{line:1534,column:41}},"318":{start:{line:1537,column:33},end:{line:1537,column:62}},"319":{start:{line:1538,column:20},end:{line:1538,column:40}},"320":{start:{line:1540,column:20},end:{line:1552,column:21}},"321":{start:{line:1541,column:24},end:{line:1548,column:27}},"322":{start:{line:1542,column:28},end:{line:1547,column:29}},"323":{start:{line:1543,column:32},end:{line:1543,column:39}},"324":{start:{line:1546,column:32},end:{line:1546,column:64}},"325":{start:{line:1551,column:24},end:{line:1551,column:47}},"326":{start:{line:1556,column:12},end:{line:1556,column:23}},"327":{start:{line:1575,column:12},end:{line:1575,column:49}},"328":{start:{line:1577,column:12},end:{line:1577,column:47}},"329":{start:{line:1589,column:4},end:{line:1843,column:7}},"330":{start:{line:1596,column:12},end:{line:1596,column:77}},"331":{start:{line:1614,column:12},end:{line:1614,column:29}},"332":{start:{line:1615,column:12},end:{line:1615,column:57}},"333":{start:{line:1617,column:12},end:{line:1617,column:67}},"334":{start:{line:1618,column:12},end:{line:1618,column:64}},"335":{start:{line:1619,column:12},end:{line:1619,column:63}},"336":{start:{line:1620,column:12},end:{line:1620,column:68}},"337":{start:{line:1637,column:12},end:{line:1637,column:78}},"338":{start:{line:1657,column:12},end:{line:1657,column:49}},"339":{start:{line:1659,column:23},end:{line:1659,column:27}},"340":{start:{line:1660,column:22},end:{line:1662,column:14}},"341":{start:{line:1661,column:16},end:{line:1661,column:36}},"342":{start:{line:1664,column:12},end:{line:1664,column:23}},"343":{start:{line:1689,column:12},end:{line:1692,column:13}},"344":{start:{line:1690,column:16},end:{line:1690,column:35}},"345":{start:{line:1691,column:16},end:{line:1691,column:29}},"346":{start:{line:1694,column:12},end:{line:1694,column:49}},"347":{start:{line:1695,column:12},end:{line:1695,column:36}},"348":{start:{line:1697,column:23},end:{line:1697,column:27}},"349":{start:{line:1698,column:22},end:{line:1708,column:14}},"350":{start:{line:1699,column:16},end:{line:1702,column:17}},"351":{start:{line:1700,column:20},end:{line:1700,column:34}},"352":{start:{line:1701,column:20},end:{line:1701,column:27}},"353":{start:{line:1704,column:26},end:{line:1704,column:43}},"354":{start:{line:1705,column:26},end:{line:1705,column:73}},"355":{start:{line:1707,column:16},end:{line:1707,column:42}},"356":{start:{line:1710,column:12},end:{line:1710,column:23}},"357":{start:{line:1726,column:12},end:{line:1726,column:69}},"358":{start:{line:1749,column:12},end:{line:1752,column:13}},"359":{start:{line:1750,column:16},end:{line:1750,column:35}},"360":{start:{line:1751,column:16},end:{line:1751,column:29}},"361":{start:{line:1754,column:12},end:{line:1754,column:49}},"362":{start:{line:1755,column:12},end:{line:1755,column:36}},"363":{start:{line:1757,column:23},end:{line:1757,column:27}},"364":{start:{line:1758,column:12},end:{line:1776,column:15}},"365":{start:{line:1759,column:16},end:{line:1762,column:17}},"366":{start:{line:1760,column:20},end:{line:1760,column:34}},"367":{start:{line:1761,column:20},end:{line:1761,column:27}},"368":{start:{line:1764,column:27},end:{line:1764,column:29}},"369":{start:{line:1765,column:27},end:{line:1765,column:52}},"370":{start:{line:1766,column:16},end:{line:1773,column:17}},"371":{start:{line:1766,column:28},end:{line:1766,column:29}},"372":{start:{line:1767,column:34},end:{line:1767,column:56}},"373":{start:{line:1768,column:36},end:{line:1768,column:74}},"374":{start:{line:1769,column:30},end:{line:1769,column:81}},"375":{start:{line:1771,column:20},end:{line:1771,column:39}},"376":{start:{line:1772,column:20},end:{line:1772,column:35}},"377":{start:{line:1775,column:16},end:{line:1775,column:43}},"378":{start:{line:1795,column:12},end:{line:1795,column:49}},"379":{start:{line:1797,column:23},end:{line:1797,column:27}},"380":{start:{line:1798,column:12},end:{line:1800,column:15}},"381":{start:{line:1799,column:16},end:{line:1799,column:65}},"382":{start:{line:1816,column:12},end:{line:1816,column:34}},"383":{start:{line:1818,column:12},end:{line:1841,column:13}},"384":{start:{line:1819,column:29},end:{line:1819,column:40}},"385":{start:{line:1820,column:26},end:{line:1835,column:18}},"386":{start:{line:1821,column:20},end:{line:1834,column:21}},"387":{start:{line:1822,column:24},end:{line:1822,column:38}},"388":{start:{line:1825,column:24},end:{line:1825,column:67}},"389":{start:{line:1826,column:24},end:{line:1833,column:27}},"390":{start:{line:1827,column:28},end:{line:1832,column:29}},"391":{start:{line:1828,column:32},end:{line:1828,column:39}},"392":{start:{line:1831,column:32},end:{line:1831,column:64}},"393":{start:{line:1837,column:16},end:{line:1837,column:27}},"394":{start:{line:1840,column:16},end:{line:1840,column:53}},"395":{start:{line:1854,column:4},end:{line:1893,column:7}},"396":{start:{line:1861,column:12},end:{line:1861,column:39}},"397":{start:{line:1873,column:34},end:{line:1873,column:70}},"398":{start:{line:1874,column:12},end:{line:1874,column:83}},"399":{start:{line:1891,column:12},end:{line:1891,column:57}},"400":{start:{line:1903,column:4},end:{line:1931,column:7}},"401":{start:{line:1910,column:12},end:{line:1910,column:80}},"402":{start:{line:1928,column:12},end:{line:1928,column:29}},"403":{start:{line:1929,column:12},end:{line:1929,column:57}},"404":{start:{line:1941,column:4},end:{line:1991,column:7}},"405":{start:{line:1957,column:12},end:{line:1957,column:42}},"406":{start:{line:1971,column:34},end:{line:1971,column:70}},"407":{start:{line:1972,column:12},end:{line:1972,column:87}},"408":{start:{line:1989,column:12},end:{line:1989,column:57}},"409":{start:{line:2002,column:4},end:{line:2143,column:7}},"410":{start:{line:2009,column:12},end:{line:2009,column:75}},"411":{start:{line:2021,column:12},end:{line:2021,column:51}},"412":{start:{line:2031,column:12},end:{line:2031,column:56}},"413":{start:{line:2045,column:12},end:{line:2045,column:51}},"414":{start:{line:2057,column:12},end:{line:2057,column:70}},"415":{start:{line:2067,column:12},end:{line:2067,column:62}},"416":{start:{line:2078,column:12},end:{line:2078,column:66}},"417":{start:{line:2088,column:12},end:{line:2088,column:49}},"418":{start:{line:2098,column:12},end:{line:2098,column:58}},"419":{start:{line:2110,column:12},end:{line:2110,column:67}},"420":{start:{line:2122,column:12},end:{line:2122,column:74}},"421":{start:{line:2140,column:12},end:{line:2140,column:29}},"422":{start:{line:2141,column:12},end:{line:2141,column:57}},"423":{start:{line:2154,column:4},end:{line:2243,column:7}},"424":{start:{line:2161,column:12},end:{line:2161,column:75}},"425":{start:{line:2173,column:12},end:{line:2173,column:78}},"426":{start:{line:2194,column:12},end:{line:2197,column:13}},"427":{start:{line:2195,column:16},end:{line:2195,column:35}},"428":{start:{line:2196,column:16},end:{line:2196,column:29}},"429":{start:{line:2199,column:12},end:{line:2199,column:49}},"430":{start:{line:2200,column:12},end:{line:2200,column:36}},"431":{start:{line:2202,column:23},end:{line:2202,column:27}},"432":{start:{line:2203,column:12},end:{line:2220,column:15}},"433":{start:{line:2204,column:16},end:{line:2207,column:17}},"434":{start:{line:2205,column:20},end:{line:2205,column:34}},"435":{start:{line:2206,column:20},end:{line:2206,column:27}},"436":{start:{line:2209,column:34},end:{line:2209,column:36}},"437":{start:{line:2210,column:27},end:{line:2210,column:52}},"438":{start:{line:2211,column:16},end:{line:2217,column:17}},"439":{start:{line:2211,column:29},end:{line:2211,column:30}},"440":{start:{line:2212,column:41},end:{line:2212,column:63}},"441":{start:{line:2213,column:36},end:{line:2213,column:81}},"442":{start:{line:2214,column:37},end:{line:2214,column:102}},"443":{start:{line:2215,column:20},end:{line:2215,column:53}},"444":{start:{line:2216,column:20},end:{line:2216,column:49}},"445":{start:{line:2219,column:16},end:{line:2219,column:50}},"446":{start:{line:2238,column:12},end:{line:2238,column:29}},"447":{start:{line:2239,column:12},end:{line:2239,column:57}},"448":{start:{line:2241,column:12},end:{line:2241,column:52}},"449":{start:{line:2255,column:4},end:{line:2306,column:7}},"450":{start:{line:2262,column:12},end:{line:2262,column:37}},"451":{start:{line:2274,column:34},end:{line:2274,column:70}},"452":{start:{line:2275,column:12},end:{line:2275,column:87}},"453":{start:{line:2284,column:12},end:{line:2284,column:95}},"454":{start:{line:2301,column:12},end:{line:2301,column:57}},"455":{start:{line:2303,column:12},end:{line:2303,column:78}},"456":{start:{line:2304,column:12},end:{line:2304,column:56}},"457":{start:{line:2316,column:4},end:{line:2409,column:7}},"458":{start:{line:2331,column:12},end:{line:2331,column:68}},"459":{start:{line:2345,column:12},end:{line:2345,column:29}},"460":{start:{line:2346,column:12},end:{line:2346,column:50}},"461":{start:{line:2348,column:12},end:{line:2348,column:63}},"462":{start:{line:2349,column:12},end:{line:2349,column:64}},"463":{start:{line:2368,column:12},end:{line:2368,column:49}},"464":{start:{line:2370,column:23},end:{line:2370,column:27}},"465":{start:{line:2371,column:12},end:{line:2378,column:15}},"466":{start:{line:2372,column:16},end:{line:2377,column:17}},"467":{start:{line:2373,column:20},end:{line:2373,column:34}},"468":{start:{line:2376,column:20},end:{line:2376,column:70}},"469":{start:{line:2397,column:12},end:{line:2397,column:49}},"470":{start:{line:2399,column:23},end:{line:2399,column:27}},"471":{start:{line:2400,column:12},end:{line:2407,column:15}},"472":{start:{line:2401,column:16},end:{line:2406,column:17}},"473":{start:{line:2402,column:20},end:{line:2402,column:34}},"474":{start:{line:2405,column:20},end:{line:2405,column:70}},"475":{start:{line:2419,column:4},end:{line:2462,column:7}},"476":{start:{line:2435,column:12},end:{line:2435,column:30}},"477":{start:{line:2447,column:12},end:{line:2447,column:70}},"478":{start:{line:2460,column:12},end:{line:2460,column:50}},"479":{start:{line:2471,column:4},end:{line:2494,column:7}},"480":{start:{line:2478,column:12},end:{line:2478,column:30}},"481":{start:{line:2491,column:12},end:{line:2491,column:38}},"482":{start:{line:2492,column:12},end:{line:2492,column:50}},"483":{start:{line:2504,column:4},end:{line:2528,column:7}},"484":{start:{line:2511,column:12},end:{line:2511,column:69}},"485":{start:{line:2525,column:12},end:{line:2525,column:29}},"486":{start:{line:2526,column:12},end:{line:2526,column:50}},"487":{start:{line:2538,column:4},end:{line:2618,column:7}},"488":{start:{line:2554,column:12},end:{line:2554,column:31}},"489":{start:{line:2566,column:12},end:{line:2566,column:63}},"490":{start:{line:2579,column:12},end:{line:2579,column:50}},"491":{start:{line:2593,column:12},end:{line:2593,column:49}},"492":{start:{line:2595,column:23},end:{line:2595,column:27}},"493":{start:{line:2596,column:22},end:{line:2614,column:14}},"494":{start:{line:2597,column:16},end:{line:2613,column:17}},"495":{start:{line:2598,column:20},end:{line:2598,column:34}},"496":{start:{line:2602,column:32},end:{line:2602,column:51}},"497":{start:{line:2604,column:33},end:{line:2604,column:62}},"498":{start:{line:2605,column:20},end:{line:2612,column:23}},"499":{start:{line:2606,column:24},end:{line:2611,column:25}},"500":{start:{line:2607,column:28},end:{line:2607,column:35}},"501":{start:{line:2610,column:28},end:{line:2610,column:60}},"502":{start:{line:2616,column:12},end:{line:2616,column:23}},"503":{start:{line:2628,column:4},end:{line:2656,column:7}},"504":{start:{line:2635,column:12},end:{line:2635,column:69}},"505":{start:{line:2653,column:12},end:{line:2653,column:29}},"506":{start:{line:2654,column:12},end:{line:2654,column:57}},"507":{start:{line:2666,column:4},end:{line:2705,column:7}},"508":{start:{line:2673,column:12},end:{line:2673,column:31}},"509":{start:{line:2685,column:34},end:{line:2685,column:70}},"510":{start:{line:2686,column:12},end:{line:2686,column:76}},"511":{start:{line:2703,column:12},end:{line:2703,column:57}},"512":{start:{line:2714,column:4},end:{line:2792,column:7}},"513":{start:{line:2721,column:12},end:{line:2721,column:71}},"514":{start:{line:2739,column:12},end:{line:2739,column:29}},"515":{start:{line:2740,column:12},end:{line:2740,column:57}},"516":{start:{line:2742,column:12},end:{line:2742,column:66}},"517":{start:{line:2767,column:12},end:{line:2770,column:13}},"518":{start:{line:2768,column:16},end:{line:2768,column:34}},"519":{start:{line:2769,column:16},end:{line:2769,column:28}},"520":{start:{line:2772,column:12},end:{line:2772,column:49}},"521":{start:{line:2773,column:12},end:{line:2773,column:34}},"522":{start:{line:2776,column:12},end:{line:2776,column:40}},"523":{start:{line:2778,column:23},end:{line:2778,column:27}},"524":{start:{line:2779,column:12},end:{line:2781,column:15}},"525":{start:{line:2780,column:16},end:{line:2780,column:44}},"526":{start:{line:2785,column:12},end:{line:2790,column:13}},"527":{start:{line:2786,column:16},end:{line:2786,column:75}},"528":{start:{line:2789,column:16},end:{line:2789,column:45}},"529":{start:{line:2802,column:4},end:{line:2873,column:7}},"530":{start:{line:2809,column:12},end:{line:2809,column:33}},"531":{start:{line:2821,column:34},end:{line:2821,column:70}},"532":{start:{line:2822,column:12},end:{line:2822,column:77}},"533":{start:{line:2839,column:12},end:{line:2839,column:57}},"534":{start:{line:2862,column:12},end:{line:2866,column:13}},"535":{start:{line:2863,column:16},end:{line:2863,column:34}},"536":{start:{line:2864,column:16},end:{line:2864,column:30}},"537":{start:{line:2865,column:16},end:{line:2865,column:35}},"538":{start:{line:2868,column:12},end:{line:2868,column:34}},"539":{start:{line:2869,column:12},end:{line:2869,column:34}},"540":{start:{line:2871,column:12},end:{line:2871,column:49}},"541":{start:{line:2883,column:4},end:{line:2914,column:7}},"542":{start:{line:2890,column:23},end:{line:2890,column:67}},"543":{start:{line:2891,column:12},end:{line:2891,column:116}},"544":{start:{line:2910,column:12},end:{line:2910,column:29}},"545":{start:{line:2911,column:12},end:{line:2911,column:29}},"546":{start:{line:2912,column:12},end:{line:2912,column:57}},"547":{start:{line:2925,column:4},end:{line:3017,column:7}},"548":{start:{line:2932,column:12},end:{line:2932,column:83}},"549":{start:{line:2946,column:12},end:{line:2946,column:100}},"550":{start:{line:2958,column:34},end:{line:2958,column:70}},"551":{start:{line:2959,column:12},end:{line:2959,column:102}},"552":{start:{line:2977,column:12},end:{line:2977,column:29}},"553":{start:{line:2978,column:12},end:{line:2978,column:57}},"554":{start:{line:3001,column:12},end:{line:3005,column:13}},"555":{start:{line:3002,column:16},end:{line:3002,column:34}},"556":{start:{line:3003,column:16},end:{line:3003,column:36}},"557":{start:{line:3004,column:16},end:{line:3004,column:41}},"558":{start:{line:3007,column:12},end:{line:3010,column:13}},"559":{start:{line:3008,column:16},end:{line:3008,column:34}},"560":{start:{line:3009,column:16},end:{line:3009,column:28}},"561":{start:{line:3012,column:12},end:{line:3012,column:34}},"562":{start:{line:3013,column:12},end:{line:3013,column:40}},"563":{start:{line:3015,column:12},end:{line:3015,column:49}},"564":{start:{line:3027,column:4},end:{line:3213,column:7}},"565":{start:{line:3043,column:12},end:{line:3043,column:36}},"566":{start:{line:3055,column:12},end:{line:3055,column:88}},"567":{start:{line:3072,column:12},end:{line:3074,column:13}},"568":{start:{line:3073,column:16},end:{line:3073,column:84}},"569":{start:{line:3076,column:12},end:{line:3076,column:57}},"570":{start:{line:3098,column:12},end:{line:3100,column:13}},"571":{start:{line:3099,column:16},end:{line:3099,column:46}},"572":{start:{line:3102,column:12},end:{line:3102,column:49}},"573":{start:{line:3104,column:23},end:{line:3104,column:27}},"574":{start:{line:3105,column:22},end:{line:3120,column:14}},"575":{start:{line:3106,column:16},end:{line:3119,column:17}},"576":{start:{line:3107,column:20},end:{line:3107,column:34}},"577":{start:{line:3110,column:33},end:{line:3110,column:83}},"578":{start:{line:3111,column:20},end:{line:3118,column:23}},"579":{start:{line:3112,column:24},end:{line:3117,column:25}},"580":{start:{line:3113,column:28},end:{line:3113,column:35}},"581":{start:{line:3116,column:28},end:{line:3116,column:60}},"582":{start:{line:3122,column:12},end:{line:3122,column:23}},"583":{start:{line:3126,column:12},end:{line:3150,column:13}},"584":{start:{line:3127,column:27},end:{line:3127,column:31}},"585":{start:{line:3130,column:31},end:{line:3130,column:73}},"586":{start:{line:3133,column:28},end:{line:3133,column:83}},"587":{start:{line:3133,column:63},end:{line:3133,column:82}},"588":{start:{line:3136,column:16},end:{line:3138,column:17}},"589":{start:{line:3137,column:20},end:{line:3137,column:113}},"590":{start:{line:3141,column:40},end:{line:3141,column:90}},"591":{start:{line:3144,column:34},end:{line:3144,column:68}},"592":{start:{line:3146,column:16},end:{line:3146,column:43}},"593":{start:{line:3149,column:16},end:{line:3149,column:72}},"594":{start:{line:3154,column:12},end:{line:3168,column:13}},"595":{start:{line:3157,column:36},end:{line:3157,column:53}},"596":{start:{line:3159,column:16},end:{line:3164,column:17}},"597":{start:{line:3160,column:20},end:{line:3160,column:115}},"598":{start:{line:3163,column:20},end:{line:3163,column:51}},"599":{start:{line:3167,column:16},end:{line:3167,column:72}},"600":{start:{line:3172,column:12},end:{line:3172,column:49}},"601":{start:{line:3173,column:23},end:{line:3173,column:27}},"602":{start:{line:3176,column:40},end:{line:3176,column:74}},"603":{start:{line:3177,column:29},end:{line:3177,column:55}},"604":{start:{line:3180,column:12},end:{line:3189,column:13}},"605":{start:{line:3181,column:16},end:{line:3181,column:51}},"606":{start:{line:3182,column:16},end:{line:3182,column:68}},"607":{start:{line:3184,column:16},end:{line:3185,column:95}},"608":{start:{line:3185,column:38},end:{line:3185,column:92}},"609":{start:{line:3187,column:16},end:{line:3187,column:82}},"610":{start:{line:3188,column:16},end:{line:3188,column:57}},"611":{start:{line:3192,column:42},end:{line:3192,column:88}},"612":{start:{line:3193,column:31},end:{line:3193,column:61}},"613":{start:{line:3196,column:12},end:{line:3211,column:13}},"614":{start:{line:3197,column:16},end:{line:3197,column:53}},"615":{start:{line:3198,column:16},end:{line:3198,column:70}},"616":{start:{line:3200,column:16},end:{line:3203,column:19}},"617":{start:{line:3201,column:20},end:{line:3201,column:75}},"618":{start:{line:3202,column:20},end:{line:3202,column:31}},"619":{start:{line:3207,column:16},end:{line:3210,column:19}},"620":{start:{line:3208,column:20},end:{line:3208,column:75}},"621":{start:{line:3209,column:20},end:{line:3209,column:31}},"622":{start:{line:3223,column:4},end:{line:3814,column:7}},"623":{start:{line:3230,column:12},end:{line:3230,column:68}},"624":{start:{line:3248,column:12},end:{line:3248,column:28}},"625":{start:{line:3249,column:12},end:{line:3249,column:57}},"626":{start:{line:3250,column:12},end:{line:3250,column:27}},"627":{start:{line:3254,column:12},end:{line:3254,column:64}},"628":{start:{line:3255,column:12},end:{line:3255,column:72}},"629":{start:{line:3256,column:12},end:{line:3256,column:71}},"630":{start:{line:3257,column:12},end:{line:3257,column:64}},"631":{start:{line:3258,column:12},end:{line:3258,column:66}},"632":{start:{line:3259,column:12},end:{line:3259,column:63}},"633":{start:{line:3260,column:12},end:{line:3260,column:65}},"634":{start:{line:3261,column:12},end:{line:3261,column:65}},"635":{start:{line:3262,column:12},end:{line:3262,column:67}},"636":{start:{line:3263,column:12},end:{line:3263,column:69}},"637":{start:{line:3264,column:12},end:{line:3264,column:64}},"638":{start:{line:3265,column:12},end:{line:3265,column:65}},"639":{start:{line:3266,column:12},end:{line:3266,column:66}},"640":{start:{line:3267,column:12},end:{line:3267,column:63}},"641":{start:{line:3268,column:12},end:{line:3268,column:65}},"642":{start:{line:3287,column:22},end:{line:3287,column:72}},"643":{start:{line:3289,column:12},end:{line:3289,column:23}},"644":{start:{line:3308,column:12},end:{line:3308,column:49}},"645":{start:{line:3310,column:23},end:{line:3310,column:27}},"646":{start:{line:3311,column:22},end:{line:3313,column:14}},"647":{start:{line:3312,column:16},end:{line:3312,column:36}},"648":{start:{line:3315,column:12},end:{line:3315,column:23}},"649":{start:{line:3334,column:12},end:{line:3334,column:49}},"650":{start:{line:3336,column:23},end:{line:3336,column:27}},"651":{start:{line:3337,column:22},end:{line:3339,column:14}},"652":{start:{line:3338,column:16},end:{line:3338,column:36}},"653":{start:{line:3341,column:12},end:{line:3341,column:23}},"654":{start:{line:3361,column:12},end:{line:3361,column:49}},"655":{start:{line:3362,column:12},end:{line:3362,column:34}},"656":{start:{line:3363,column:12},end:{line:3363,column:67}},"657":{start:{line:3365,column:23},end:{line:3365,column:27}},"658":{start:{line:3366,column:12},end:{line:3373,column:15}},"659":{start:{line:3367,column:16},end:{line:3372,column:17}},"660":{start:{line:3368,column:20},end:{line:3368,column:34}},"661":{start:{line:3371,column:20},end:{line:3371,column:56}},"662":{start:{line:3392,column:12},end:{line:3392,column:49}},"663":{start:{line:3394,column:23},end:{line:3394,column:27}},"664":{start:{line:3395,column:22},end:{line:3397,column:14}},"665":{start:{line:3396,column:16},end:{line:3396,column:36}},"666":{start:{line:3399,column:12},end:{line:3399,column:23}},"667":{start:{line:3414,column:12},end:{line:3414,column:74}},"668":{start:{line:3433,column:12},end:{line:3433,column:49}},"669":{start:{line:3435,column:23},end:{line:3435,column:27}},"670":{start:{line:3436,column:22},end:{line:3438,column:14}},"671":{start:{line:3437,column:16},end:{line:3437,column:36}},"672":{start:{line:3440,column:12},end:{line:3440,column:23}},"673":{start:{line:3460,column:12},end:{line:3460,column:49}},"674":{start:{line:3461,column:12},end:{line:3461,column:34}},"675":{start:{line:3462,column:12},end:{line:3462,column:67}},"676":{start:{line:3464,column:23},end:{line:3464,column:27}},"677":{start:{line:3465,column:12},end:{line:3472,column:15}},"678":{start:{line:3466,column:16},end:{line:3471,column:17}},"679":{start:{line:3467,column:20},end:{line:3467,column:34}},"680":{start:{line:3470,column:20},end:{line:3470,column:56}},"681":{start:{line:3497,column:12},end:{line:3497,column:49}},"682":{start:{line:3498,column:12},end:{line:3498,column:34}},"683":{start:{line:3499,column:12},end:{line:3499,column:67}},"684":{start:{line:3501,column:23},end:{line:3501,column:27}},"685":{start:{line:3502,column:12},end:{line:3509,column:15}},"686":{start:{line:3503,column:16},end:{line:3508,column:17}},"687":{start:{line:3504,column:20},end:{line:3504,column:34}},"688":{start:{line:3507,column:20},end:{line:3507,column:56}},"689":{start:{line:3528,column:12},end:{line:3528,column:49}},"690":{start:{line:3530,column:23},end:{line:3530,column:27}},"691":{start:{line:3531,column:12},end:{line:3538,column:15}},"692":{start:{line:3532,column:16},end:{line:3537,column:17}},"693":{start:{line:3533,column:20},end:{line:3533,column:34}},"694":{start:{line:3536,column:20},end:{line:3536,column:56}},"695":{start:{line:3558,column:12},end:{line:3558,column:49}},"696":{start:{line:3560,column:23},end:{line:3560,column:27}},"697":{start:{line:3561,column:22},end:{line:3563,column:14}},"698":{start:{line:3562,column:16},end:{line:3562,column:36}},"699":{start:{line:3565,column:12},end:{line:3565,column:23}},"700":{start:{line:3586,column:12},end:{line:3586,column:49}},"701":{start:{line:3588,column:23},end:{line:3588,column:27}},"702":{start:{line:3589,column:22},end:{line:3591,column:14}},"703":{start:{line:3590,column:16},end:{line:3590,column:36}},"704":{start:{line:3593,column:12},end:{line:3593,column:23}},"705":{start:{line:3613,column:12},end:{line:3613,column:49}},"706":{start:{line:3615,column:23},end:{line:3615,column:27}},"707":{start:{line:3616,column:12},end:{line:3623,column:15}},"708":{start:{line:3617,column:16},end:{line:3622,column:17}},"709":{start:{line:3618,column:20},end:{line:3618,column:34}},"710":{start:{line:3621,column:20},end:{line:3621,column:56}},"711":{start:{line:3643,column:12},end:{line:3643,column:49}},"712":{start:{line:3645,column:23},end:{line:3645,column:27}},"713":{start:{line:3646,column:12},end:{line:3653,column:15}},"714":{start:{line:3647,column:16},end:{line:3652,column:17}},"715":{start:{line:3648,column:20},end:{line:3648,column:34}},"716":{start:{line:3651,column:20},end:{line:3651,column:56}},"717":{start:{line:3673,column:12},end:{line:3673,column:49}},"718":{start:{line:3675,column:23},end:{line:3675,column:27}},"719":{start:{line:3676,column:22},end:{line:3678,column:14}},"720":{start:{line:3677,column:16},end:{line:3677,column:36}},"721":{start:{line:3680,column:12},end:{line:3680,column:23}},"722":{start:{line:3700,column:25},end:{line:3700,column:46}},"723":{start:{line:3702,column:12},end:{line:3706,column:13}},"724":{start:{line:3703,column:16},end:{line:3705,column:18}},"725":{start:{line:3709,column:16},end:{line:3712,column:32}},"726":{start:{line:3715,column:12},end:{line:3715,column:63}},"727":{start:{line:3716,column:12},end:{line:3716,column:69}},"728":{start:{line:3717,column:12},end:{line:3717,column:61}},"729":{start:{line:3718,column:12},end:{line:3718,column:65}},"730":{start:{line:3719,column:12},end:{line:3719,column:63}},"731":{start:{line:3722,column:12},end:{line:3722,column:71}},"732":{start:{line:3723,column:12},end:{line:3723,column:89}},"733":{start:{line:3725,column:23},end:{line:3725,column:27}},"734":{start:{line:3726,column:31},end:{line:3726,column:36}},"735":{start:{line:3727,column:30},end:{line:3727,column:35}},"736":{start:{line:3728,column:12},end:{line:3786,column:14}},"737":{start:{line:3729,column:29},end:{line:3729,column:49}},"738":{start:{line:3731,column:20},end:{line:3779,column:23}},"739":{start:{line:3732,column:24},end:{line:3735,column:25}},"740":{start:{line:3733,column:28},end:{line:3733,column:47}},"741":{start:{line:3734,column:28},end:{line:3734,column:35}},"742":{start:{line:3737,column:44},end:{line:3737,column:74}},"743":{start:{line:3738,column:39},end:{line:3738,column:96}},"744":{start:{line:3739,column:24},end:{line:3776,column:25}},"745":{start:{line:3740,column:28},end:{line:3740,column:53}},"746":{start:{line:3743,column:28},end:{line:3756,column:29}},"747":{start:{line:3744,column:32},end:{line:3744,column:53}},"748":{start:{line:3745,column:32},end:{line:3745,column:52}},"749":{start:{line:3749,column:32},end:{line:3755,column:33}},"750":{start:{line:3750,column:36},end:{line:3750,column:70}},"751":{start:{line:3752,column:36},end:{line:3752,column:55}},"752":{start:{line:3753,column:36},end:{line:3753,column:52}},"753":{start:{line:3754,column:36},end:{line:3754,column:43}},"754":{start:{line:3758,column:28},end:{line:3758,column:52}},"755":{start:{line:3760,column:40},end:{line:3760,column:56}},"756":{start:{line:3762,column:28},end:{line:3775,column:29}},"757":{start:{line:3763,column:32},end:{line:3763,column:52}},"758":{start:{line:3765,column:32},end:{line:3765,column:51}},"759":{start:{line:3766,column:32},end:{line:3766,column:48}},"760":{start:{line:3767,column:32},end:{line:3767,column:39}},"761":{start:{line:3769,column:33},end:{line:3775,column:29}},"762":{start:{line:3770,column:32},end:{line:3770,column:54}},"763":{start:{line:3772,column:32},end:{line:3772,column:51}},"764":{start:{line:3773,column:32},end:{line:3773,column:48}},"765":{start:{line:3774,column:32},end:{line:3774,column:39}},"766":{start:{line:3778,column:24},end:{line:3778,column:59}},"767":{start:{line:3782,column:20},end:{line:3784,column:21}},"768":{start:{line:3783,column:24},end:{line:3783,column:45}},"769":{start:{line:3805,column:12},end:{line:3805,column:49}},"770":{start:{line:3807,column:23},end:{line:3807,column:27}},"771":{start:{line:3808,column:22},end:{line:3810,column:14}},"772":{start:{line:3809,column:16},end:{line:3809,column:36}},"773":{start:{line:3812,column:12},end:{line:3812,column:23}},"774":{start:{line:3824,column:4},end:{line:4015,column:7}},"775":{start:{line:3831,column:12},end:{line:3831,column:30}},"776":{start:{line:3843,column:22},end:{line:3843,column:39}},"777":{start:{line:3844,column:34},end:{line:3844,column:70}},"778":{start:{line:3845,column:12},end:{line:3845,column:68}},"779":{start:{line:3862,column:12},end:{line:3862,column:57}},"780":{start:{line:3866,column:12},end:{line:3866,column:60}},"781":{start:{line:3889,column:12},end:{line:3893,column:13}},"782":{start:{line:3890,column:16},end:{line:3890,column:34}},"783":{start:{line:3891,column:16},end:{line:3891,column:31}},"784":{start:{line:3892,column:16},end:{line:3892,column:38}},"785":{start:{line:3895,column:12},end:{line:3895,column:49}},"786":{start:{line:3896,column:12},end:{line:3896,column:34}},"787":{start:{line:3897,column:12},end:{line:3897,column:34}},"788":{start:{line:3899,column:12},end:{line:3901,column:13}},"789":{start:{line:3900,column:16},end:{line:3900,column:104}},"790":{start:{line:3903,column:12},end:{line:3906,column:13}},"791":{start:{line:3904,column:16},end:{line:3904,column:72}},"792":{start:{line:3905,column:16},end:{line:3905,column:23}},"793":{start:{line:3907,column:23},end:{line:3907,column:27}},"794":{start:{line:3908,column:12},end:{line:3916,column:15}},"795":{start:{line:3909,column:16},end:{line:3915,column:17}},"796":{start:{line:3910,column:20},end:{line:3910,column:34}},"797":{start:{line:3913,column:30},end:{line:3913,column:91}},"798":{start:{line:3914,column:20},end:{line:3914,column:40}},"799":{start:{line:3945,column:12},end:{line:3945,column:56}},"800":{start:{line:3972,column:12},end:{line:3976,column:13}},"801":{start:{line:3973,column:16},end:{line:3973,column:34}},"802":{start:{line:3974,column:16},end:{line:3974,column:31}},"803":{start:{line:3975,column:16},end:{line:3975,column:38}},"804":{start:{line:3978,column:12},end:{line:3978,column:49}},"805":{start:{line:3979,column:12},end:{line:3979,column:34}},"806":{start:{line:3980,column:12},end:{line:3980,column:34}},"807":{start:{line:3981,column:12},end:{line:3981,column:41}},"808":{start:{line:3983,column:12},end:{line:3985,column:13}},"809":{start:{line:3984,column:16},end:{line:3984,column:72}},"810":{start:{line:3987,column:29},end:{line:3987,column:62}},"811":{start:{line:3989,column:23},end:{line:3989,column:41}},"812":{start:{line:3990,column:25},end:{line:3990,column:31}},"813":{start:{line:3991,column:26},end:{line:3991,column:28}},"814":{start:{line:3992,column:23},end:{line:3992,column:29}},"815":{start:{line:3993,column:22},end:{line:3993,column:47}},"816":{start:{line:3994,column:23},end:{line:3994,column:27}},"817":{start:{line:3996,column:22},end:{line:4011,column:13}},"818":{start:{line:4004,column:20},end:{line:4009,column:21}},"819":{start:{line:4005,column:24},end:{line:4005,column:38}},"820":{start:{line:4008,column:24},end:{line:4008,column:54}},"821":{start:{line:4013,column:12},end:{line:4013,column:23}},"822":{start:{line:4047,column:4},end:{line:4164,column:7}},"823":{start:{line:4072,column:12},end:{line:4072,column:32}},"824":{start:{line:4073,column:12},end:{line:4073,column:44}},"825":{start:{line:4075,column:12},end:{line:4075,column:50}},"826":{start:{line:4076,column:12},end:{line:4076,column:52}},"827":{start:{line:4077,column:12},end:{line:4077,column:45}},"828":{start:{line:4078,column:12},end:{line:4078,column:51}},"829":{start:{line:4079,column:12},end:{line:4079,column:49}},"830":{start:{line:4080,column:12},end:{line:4080,column:47}},"831":{start:{line:4081,column:12},end:{line:4081,column:49}},"832":{start:{line:4082,column:12},end:{line:4082,column:56}},"833":{start:{line:4083,column:12},end:{line:4083,column:52}},"834":{start:{line:4084,column:12},end:{line:4084,column:57}},"835":{start:{line:4085,column:12},end:{line:4085,column:72}},"836":{start:{line:4096,column:12},end:{line:4096,column:42}},"837":{start:{line:4107,column:12},end:{line:4107,column:42}},"838":{start:{line:4118,column:12},end:{line:4118,column:45}},"839":{start:{line:4129,column:12},end:{line:4129,column:47}},"840":{start:{line:4140,column:12},end:{line:4140,column:46}},"841":{start:{line:4151,column:12},end:{line:4151,column:40}},"842":{start:{line:4162,column:12},end:{line:4162,column:43}},"843":{start:{line:4177,column:4},end:{line:4199,column:7}},"844":{start:{line:4192,column:12},end:{line:4192,column:32}},"845":{start:{line:4193,column:12},end:{line:4193,column:44}},"846":{start:{line:4195,column:12},end:{line:4195,column:40}},"847":{start:{line:4196,column:12},end:{line:4196,column:50}},"848":{start:{line:4197,column:12},end:{line:4197,column:65}},"849":{start:{line:4232,column:4},end:{line:4350,column:7}},"850":{start:{line:4258,column:12},end:{line:4258,column:32}},"851":{start:{line:4259,column:12},end:{line:4259,column:44}},"852":{start:{line:4261,column:12},end:{line:4261,column:54}},"853":{start:{line:4262,column:12},end:{line:4262,column:56}},"854":{start:{line:4263,column:12},end:{line:4263,column:56}},"855":{start:{line:4264,column:12},end:{line:4264,column:49}},"856":{start:{line:4265,column:12},end:{line:4265,column:57}},"857":{start:{line:4266,column:12},end:{line:4266,column:72}},"858":{start:{line:4268,column:12},end:{line:4268,column:35}},"859":{start:{line:4269,column:12},end:{line:4271,column:13}},"860":{start:{line:4269,column:25},end:{line:4269,column:26}},"861":{start:{line:4270,column:16},end:{line:4270,column:116}},"862":{start:{line:4273,column:12},end:{line:4275,column:13}},"863":{start:{line:4274,column:16},end:{line:4274,column:51}},"864":{start:{line:4276,column:12},end:{line:4278,column:13}},"865":{start:{line:4277,column:16},end:{line:4277,column:51}},"866":{start:{line:4279,column:12},end:{line:4282,column:13}},"867":{start:{line:4280,column:16},end:{line:4280,column:51}},"868":{start:{line:4281,column:16},end:{line:4281,column:64}},"869":{start:{line:4293,column:12},end:{line:4293,column:50}},"870":{start:{line:4304,column:12},end:{line:4304,column:35}},"871":{start:{line:4315,column:12},end:{line:4315,column:42}},"872":{start:{line:4326,column:12},end:{line:4326,column:40}},"873":{start:{line:4337,column:12},end:{line:4337,column:39}},"874":{start:{line:4348,column:12},end:{line:4348,column:41}},"875":{start:{line:4366,column:4},end:{line:4413,column:7}},"876":{start:{line:4383,column:12},end:{line:4383,column:35}},"877":{start:{line:4384,column:12},end:{line:4384,column:39}},"878":{start:{line:4385,column:12},end:{line:4385,column:58}},"879":{start:{line:4386,column:12},end:{line:4386,column:72}},"880":{start:{line:4387,column:12},end:{line:4387,column:50}},"881":{start:{line:4388,column:12},end:{line:4388,column:60}},"882":{start:{line:4390,column:12},end:{line:4390,column:50}},"883":{start:{line:4402,column:12},end:{line:4405,column:13}},"884":{start:{line:4403,column:16},end:{line:4403,column:32}},"885":{start:{line:4404,column:16},end:{line:4404,column:26}},"886":{start:{line:4406,column:12},end:{line:4408,column:13}},"887":{start:{line:4407,column:16},end:{line:4407,column:26}},"888":{start:{line:4411,column:12},end:{line:4411,column:87}},"889":{start:{line:4524,column:4},end:{line:5169,column:7}},"890":{start:{line:4544,column:12},end:{line:4544,column:51}},"891":{start:{line:4545,column:12},end:{line:4545,column:30}},"892":{start:{line:4546,column:12},end:{line:4546,column:27}},"893":{start:{line:4547,column:12},end:{line:4547,column:30}},"894":{start:{line:4548,column:12},end:{line:4548,column:28}},"895":{start:{line:4550,column:12},end:{line:4551,column:54}},"896":{start:{line:4553,column:12},end:{line:4553,column:52}},"897":{start:{line:4554,column:12},end:{line:4554,column:54}},"898":{start:{line:4570,column:12},end:{line:4572,column:13}},"899":{start:{line:4571,column:16},end:{line:4571,column:30}},"900":{start:{line:4574,column:12},end:{line:4576,column:13}},"901":{start:{line:4575,column:16},end:{line:4575,column:81}},"902":{start:{line:4578,column:12},end:{line:4578,column:54}},"903":{start:{line:4579,column:12},end:{line:4579,column:24}},"904":{start:{line:4595,column:12},end:{line:4597,column:13}},"905":{start:{line:4596,column:16},end:{line:4596,column:77}},"906":{start:{line:4598,column:12},end:{line:4604,column:13}},"907":{start:{line:4599,column:16},end:{line:4603,column:70}},"908":{start:{line:4605,column:12},end:{line:4610,column:13}},"909":{start:{line:4606,column:16},end:{line:4609,column:59}},"910":{start:{line:4612,column:22},end:{line:4616,column:13}},"911":{start:{line:4618,column:12},end:{line:4623,column:13}},"912":{start:{line:4619,column:16},end:{line:4622,column:18}},"913":{start:{line:4624,column:12},end:{line:4624,column:35}},"914":{start:{line:4626,column:12},end:{line:4626,column:24}},"915":{start:{line:4643,column:12},end:{line:4645,column:13}},"916":{start:{line:4644,column:16},end:{line:4644,column:83}},"917":{start:{line:4647,column:20},end:{line:4647,column:63}},"918":{start:{line:4649,column:12},end:{line:4651,column:13}},"919":{start:{line:4650,column:16},end:{line:4650,column:112}},"920":{start:{line:4653,column:12},end:{line:4656,column:13}},"921":{start:{line:4654,column:16},end:{line:4655,column:35}},"922":{start:{line:4658,column:12},end:{line:4661,column:13}},"923":{start:{line:4659,column:16},end:{line:4660,column:35}},"924":{start:{line:4663,column:12},end:{line:4665,column:13}},"925":{start:{line:4664,column:16},end:{line:4664,column:120}},"926":{start:{line:4667,column:25},end:{line:4676,column:13}},"927":{start:{line:4678,column:12},end:{line:4678,column:84}},"928":{start:{line:4679,column:12},end:{line:4679,column:38}},"929":{start:{line:4681,column:12},end:{line:4681,column:24}},"930":{start:{line:4694,column:12},end:{line:4696,column:13}},"931":{start:{line:4695,column:16},end:{line:4695,column:67}},"932":{start:{line:4697,column:20},end:{line:4697,column:63}},"933":{start:{line:4698,column:12},end:{line:4700,column:13}},"934":{start:{line:4699,column:16},end:{line:4699,column:96}},"935":{start:{line:4702,column:22},end:{line:4707,column:13}},"936":{start:{line:4709,column:12},end:{line:4711,column:13}},"937":{start:{line:4710,column:16},end:{line:4710,column:36}},"938":{start:{line:4713,column:12},end:{line:4713,column:32}},"939":{start:{line:4715,column:12},end:{line:4715,column:24}},"940":{start:{line:4738,column:12},end:{line:4740,column:13}},"941":{start:{line:4739,column:16},end:{line:4739,column:63}},"942":{start:{line:4741,column:20},end:{line:4741,column:59}},"943":{start:{line:4742,column:12},end:{line:4744,column:13}},"944":{start:{line:4743,column:16},end:{line:4743,column:86}},"945":{start:{line:4745,column:31},end:{line:4745,column:33}},"946":{start:{line:4746,column:12},end:{line:4748,column:13}},"947":{start:{line:4747,column:16},end:{line:4747,column:50}},"948":{start:{line:4749,column:12},end:{line:4751,column:13}},"949":{start:{line:4750,column:16},end:{line:4750,column:46}},"950":{start:{line:4752,column:12},end:{line:4754,column:13}},"951":{start:{line:4753,column:16},end:{line:4753,column:48}},"952":{start:{line:4755,column:12},end:{line:4757,column:13}},"953":{start:{line:4756,column:16},end:{line:4756,column:56}},"954":{start:{line:4759,column:12},end:{line:4766,column:15}},"955":{start:{line:4768,column:12},end:{line:4768,column:24}},"956":{start:{line:4783,column:12},end:{line:4785,column:13}},"957":{start:{line:4784,column:16},end:{line:4784,column:63}},"958":{start:{line:4786,column:20},end:{line:4786,column:59}},"959":{start:{line:4787,column:12},end:{line:4789,column:13}},"960":{start:{line:4788,column:16},end:{line:4788,column:87}},"961":{start:{line:4791,column:12},end:{line:4798,column:15}},"962":{start:{line:4800,column:12},end:{line:4800,column:24}},"963":{start:{line:4814,column:12},end:{line:4816,column:13}},"964":{start:{line:4815,column:16},end:{line:4815,column:63}},"965":{start:{line:4817,column:20},end:{line:4817,column:59}},"966":{start:{line:4818,column:12},end:{line:4820,column:13}},"967":{start:{line:4819,column:16},end:{line:4819,column:89}},"968":{start:{line:4821,column:12},end:{line:4823,column:13}},"969":{start:{line:4822,column:16},end:{line:4822,column:120}},"970":{start:{line:4825,column:12},end:{line:4831,column:15}},"971":{start:{line:4833,column:12},end:{line:4833,column:24}},"972":{start:{line:4846,column:12},end:{line:4848,column:13}},"973":{start:{line:4847,column:16},end:{line:4847,column:67}},"974":{start:{line:4849,column:20},end:{line:4849,column:63}},"975":{start:{line:4850,column:12},end:{line:4852,column:13}},"976":{start:{line:4851,column:16},end:{line:4851,column:96}},"977":{start:{line:4854,column:22},end:{line:4858,column:13}},"978":{start:{line:4860,column:12},end:{line:4862,column:13}},"979":{start:{line:4861,column:16},end:{line:4861,column:36}},"980":{start:{line:4864,column:12},end:{line:4864,column:35}},"981":{start:{line:4866,column:12},end:{line:4866,column:24}},"982":{start:{line:4883,column:12},end:{line:4885,column:13}},"983":{start:{line:4884,column:16},end:{line:4884,column:67}},"984":{start:{line:4886,column:20},end:{line:4886,column:63}},"985":{start:{line:4887,column:12},end:{line:4889,column:13}},"986":{start:{line:4888,column:16},end:{line:4888,column:86}},"987":{start:{line:4893,column:32},end:{line:4893,column:34}},"988":{start:{line:4894,column:12},end:{line:4896,column:13}},"989":{start:{line:4895,column:16},end:{line:4895,column:51}},"990":{start:{line:4897,column:12},end:{line:4899,column:13}},"991":{start:{line:4898,column:16},end:{line:4898,column:47}},"992":{start:{line:4900,column:12},end:{line:4902,column:13}},"993":{start:{line:4901,column:16},end:{line:4901,column:49}},"994":{start:{line:4903,column:12},end:{line:4905,column:13}},"995":{start:{line:4904,column:16},end:{line:4904,column:57}},"996":{start:{line:4907,column:12},end:{line:4913,column:15}},"997":{start:{line:4915,column:12},end:{line:4915,column:24}},"998":{start:{line:4929,column:12},end:{line:4931,column:13}},"999":{start:{line:4930,column:16},end:{line:4930,column:67}},"1000":{start:{line:4932,column:20},end:{line:4932,column:63}},"1001":{start:{line:4933,column:12},end:{line:4935,column:13}},"1002":{start:{line:4934,column:16},end:{line:4934,column:87}},"1003":{start:{line:4937,column:12},end:{line:4943,column:15}},"1004":{start:{line:4945,column:12},end:{line:4945,column:24}},"1005":{start:{line:4958,column:12},end:{line:4960,column:13}},"1006":{start:{line:4959,column:16},end:{line:4959,column:63}},"1007":{start:{line:4961,column:20},end:{line:4961,column:59}},"1008":{start:{line:4962,column:12},end:{line:4964,column:13}},"1009":{start:{line:4963,column:16},end:{line:4963,column:89}},"1010":{start:{line:4965,column:12},end:{line:4967,column:13}},"1011":{start:{line:4966,column:16},end:{line:4966,column:120}},"1012":{start:{line:4969,column:12},end:{line:4974,column:15}},"1013":{start:{line:4976,column:12},end:{line:4976,column:24}},"1014":{start:{line:4990,column:12},end:{line:4992,column:13}},"1015":{start:{line:4991,column:16},end:{line:4991,column:67}},"1016":{start:{line:4994,column:20},end:{line:4994,column:63}},"1017":{start:{line:4995,column:12},end:{line:5047,column:13}},"1018":{start:{line:5004,column:16},end:{line:5006,column:35}},"1019":{start:{line:5008,column:17},end:{line:5047,column:13}},"1020":{start:{line:5020,column:16},end:{line:5023,column:22}},"1021":{start:{line:5025,column:17},end:{line:5047,column:13}},"1022":{start:{line:5034,column:16},end:{line:5037,column:22}},"1023":{start:{line:5039,column:17},end:{line:5047,column:13}},"1024":{start:{line:5042,column:16},end:{line:5043,column:46}},"1025":{start:{line:5045,column:17},end:{line:5047,column:13}},"1026":{start:{line:5046,column:16},end:{line:5046,column:84}},"1027":{start:{line:5049,column:12},end:{line:5056,column:15}},"1028":{start:{line:5058,column:12},end:{line:5058,column:24}},"1029":{start:{line:5069,column:12},end:{line:5076,column:14}},"1030":{start:{line:5102,column:22},end:{line:5102,column:60}},"1031":{start:{line:5104,column:23},end:{line:5106,column:13}},"1032":{start:{line:5108,column:12},end:{line:5110,column:13}},"1033":{start:{line:5109,column:16},end:{line:5109,column:60}},"1034":{start:{line:5112,column:12},end:{line:5124,column:15}},"1035":{start:{line:5113,column:16},end:{line:5116,column:17}},"1036":{start:{line:5114,column:20},end:{line:5114,column:77}},"1037":{start:{line:5115,column:20},end:{line:5115,column:27}},"1038":{start:{line:5118,column:16},end:{line:5123,column:17}},"1039":{start:{line:5119,column:20},end:{line:5119,column:88}},"1040":{start:{line:5122,column:20},end:{line:5122,column:96}},"1041":{start:{line:5154,column:12},end:{line:5157,column:13}},"1042":{start:{line:5155,column:16},end:{line:5155,column:32}},"1043":{start:{line:5156,column:16},end:{line:5156,column:26}},"1044":{start:{line:5158,column:12},end:{line:5158,column:30}},"1045":{start:{line:5160,column:12},end:{line:5167,column:15}},"1046":{start:{line:5161,column:16},end:{line:5166,column:17}},"1047":{start:{line:5162,column:20},end:{line:5162,column:46}},"1048":{start:{line:5165,column:20},end:{line:5165,column:68}},"1049":{start:{line:5197,column:4},end:{line:5515,column:7}},"1050":{start:{line:5225,column:12},end:{line:5225,column:32}},"1051":{start:{line:5226,column:12},end:{line:5226,column:44}},"1052":{start:{line:5228,column:12},end:{line:5228,column:58}},"1053":{start:{line:5229,column:12},end:{line:5229,column:59}},"1054":{start:{line:5230,column:12},end:{line:5230,column:60}},"1055":{start:{line:5231,column:12},end:{line:5231,column:59}},"1056":{start:{line:5232,column:12},end:{line:5232,column:67}},"1057":{start:{line:5235,column:12},end:{line:5237,column:13}},"1058":{start:{line:5236,column:16},end:{line:5236,column:57}},"1059":{start:{line:5238,column:12},end:{line:5240,column:13}},"1060":{start:{line:5239,column:16},end:{line:5239,column:59}},"1061":{start:{line:5241,column:12},end:{line:5243,column:13}},"1062":{start:{line:5242,column:16},end:{line:5242,column:60}},"1063":{start:{line:5244,column:12},end:{line:5246,column:13}},"1064":{start:{line:5245,column:16},end:{line:5245,column:58}},"1065":{start:{line:5249,column:12},end:{line:5251,column:13}},"1066":{start:{line:5250,column:16},end:{line:5250,column:51}},"1067":{start:{line:5254,column:12},end:{line:5254,column:29}},"1068":{start:{line:5255,column:12},end:{line:5257,column:13}},"1069":{start:{line:5255,column:25},end:{line:5255,column:26}},"1070":{start:{line:5256,column:16},end:{line:5256,column:98}},"1071":{start:{line:5260,column:12},end:{line:5260,column:34}},"1072":{start:{line:5261,column:12},end:{line:5263,column:13}},"1073":{start:{line:5261,column:25},end:{line:5261,column:26}},"1074":{start:{line:5262,column:16},end:{line:5262,column:90}},"1075":{start:{line:5266,column:12},end:{line:5266,column:35}},"1076":{start:{line:5267,column:12},end:{line:5269,column:13}},"1077":{start:{line:5267,column:25},end:{line:5267,column:26}},"1078":{start:{line:5268,column:16},end:{line:5268,column:126}},"1079":{start:{line:5280,column:12},end:{line:5280,column:55}},"1080":{start:{line:5291,column:12},end:{line:5291,column:52}},"1081":{start:{line:5303,column:12},end:{line:5303,column:44}},"1082":{start:{line:5317,column:12},end:{line:5317,column:78}},"1083":{start:{line:5332,column:33},end:{line:5332,column:35}},"1084":{start:{line:5334,column:12},end:{line:5338,column:13}},"1085":{start:{line:5335,column:16},end:{line:5337,column:17}},"1086":{start:{line:5336,column:20},end:{line:5336,column:55}},"1087":{start:{line:5340,column:35},end:{line:5340,column:58}},"1088":{start:{line:5341,column:12},end:{line:5345,column:13}},"1089":{start:{line:5342,column:16},end:{line:5344,column:17}},"1090":{start:{line:5343,column:20},end:{line:5343,column:62}},"1091":{start:{line:5347,column:12},end:{line:5347,column:34}},"1092":{start:{line:5361,column:12},end:{line:5361,column:49}},"1093":{start:{line:5374,column:25},end:{line:5374,column:27}},"1094":{start:{line:5376,column:23},end:{line:5376,column:44}},"1095":{start:{line:5377,column:31},end:{line:5377,column:48}},"1096":{start:{line:5378,column:12},end:{line:5383,column:13}},"1097":{start:{line:5378,column:25},end:{line:5378,column:26}},"1098":{start:{line:5379,column:34},end:{line:5379,column:55}},"1099":{start:{line:5380,column:16},end:{line:5382,column:17}},"1100":{start:{line:5380,column:29},end:{line:5380,column:30}},"1101":{start:{line:5381,column:20},end:{line:5381,column:124}},"1102":{start:{line:5384,column:12},end:{line:5384,column:26}},"1103":{start:{line:5397,column:12},end:{line:5397,column:56}},"1104":{start:{line:5410,column:12},end:{line:5410,column:67}},"1105":{start:{line:5423,column:12},end:{line:5423,column:50}},"1106":{start:{line:5454,column:12},end:{line:5457,column:13}},"1107":{start:{line:5455,column:16},end:{line:5455,column:40}},"1108":{start:{line:5456,column:16},end:{line:5456,column:41}},"1109":{start:{line:5459,column:24},end:{line:5459,column:106}},"1110":{start:{line:5460,column:23},end:{line:5460,column:72}},"1111":{start:{line:5462,column:12},end:{line:5462,column:65}},"1112":{start:{line:5485,column:24},end:{line:5485,column:90}},"1113":{start:{line:5487,column:12},end:{line:5487,column:69}},"1114":{start:{line:5488,column:12},end:{line:5488,column:81}},"1115":{start:{line:5501,column:12},end:{line:5501,column:64}},"1116":{start:{line:5513,column:12},end:{line:5513,column:53}},"1117":{start:{line:5526,column:4},end:{line:5679,column:7}},"1118":{start:{line:5533,column:12},end:{line:5533,column:74}},"1119":{start:{line:5556,column:12},end:{line:5559,column:13}},"1120":{start:{line:5557,column:16},end:{line:5557,column:34}},"1121":{start:{line:5558,column:16},end:{line:5558,column:31}},"1122":{start:{line:5561,column:12},end:{line:5561,column:29}},"1123":{start:{line:5562,column:12},end:{line:5562,column:57}},"1124":{start:{line:5564,column:12},end:{line:5564,column:77}},"1125":{start:{line:5565,column:12},end:{line:5568,column:13}},"1126":{start:{line:5567,column:16},end:{line:5567,column:72}},"1127":{start:{line:5572,column:12},end:{line:5574,column:13}},"1128":{start:{line:5573,column:16},end:{line:5573,column:35}},"1129":{start:{line:5576,column:38},end:{line:5576,column:75}},"1130":{start:{line:5578,column:12},end:{line:5578,column:66}},"1131":{start:{line:5579,column:12},end:{line:5579,column:63}},"1132":{start:{line:5580,column:12},end:{line:5580,column:63}},"1133":{start:{line:5583,column:23},end:{line:5583,column:50}},"1134":{start:{line:5584,column:12},end:{line:5584,column:30}},"1135":{start:{line:5585,column:12},end:{line:5587,column:13}},"1136":{start:{line:5585,column:25},end:{line:5585,column:26}},"1137":{start:{line:5586,column:16},end:{line:5586,column:75}},"1138":{start:{line:5589,column:12},end:{line:5589,column:56}},"1139":{start:{line:5590,column:12},end:{line:5590,column:56}},"1140":{start:{line:5601,column:12},end:{line:5601,column:47}},"1141":{start:{line:5613,column:12},end:{line:5617,column:13}},"1142":{start:{line:5613,column:25},end:{line:5613,column:26}},"1143":{start:{line:5614,column:16},end:{line:5616,column:17}},"1144":{start:{line:5615,column:20},end:{line:5615,column:43}},"1145":{start:{line:5618,column:12},end:{line:5618,column:24}},"1146":{start:{line:5629,column:12},end:{line:5629,column:58}},"1147":{start:{line:5645,column:12},end:{line:5648,column:13}},"1148":{start:{line:5646,column:16},end:{line:5646,column:33}},"1149":{start:{line:5647,column:16},end:{line:5647,column:27}},"1150":{start:{line:5649,column:12},end:{line:5649,column:49}},"1151":{start:{line:5651,column:12},end:{line:5654,column:13}},"1152":{start:{line:5652,column:16},end:{line:5652,column:93}},"1153":{start:{line:5653,column:16},end:{line:5653,column:23}},"1154":{start:{line:5655,column:12},end:{line:5658,column:13}},"1155":{start:{line:5656,column:16},end:{line:5656,column:81}},"1156":{start:{line:5657,column:16},end:{line:5657,column:23}},"1157":{start:{line:5660,column:31},end:{line:5666,column:13}},"1158":{start:{line:5668,column:23},end:{line:5668,column:27}},"1159":{start:{line:5669,column:12},end:{line:5677,column:15}},"1160":{start:{line:5670,column:16},end:{line:5676,column:17}},"1161":{start:{line:5671,column:20},end:{line:5671,column:40}},"1162":{start:{line:5674,column:45},end:{line:5674,column:98}},"1163":{start:{line:5675,column:20},end:{line:5675,column:142}},"1164":{start:{line:5690,column:4},end:{line:5768,column:7}},"1165":{start:{line:5697,column:12},end:{line:5697,column:36}},"1166":{start:{line:5713,column:12},end:{line:5713,column:40}},"1167":{start:{line:5714,column:12},end:{line:5714,column:57}},"1168":{start:{line:5715,column:12},end:{line:5715,column:56}},"1169":{start:{line:5733,column:12},end:{line:5736,column:13}},"1170":{start:{line:5734,column:16},end:{line:5734,column:34}},"1171":{start:{line:5735,column:16},end:{line:5735,column:28}},"1172":{start:{line:5738,column:12},end:{line:5738,column:34}},"1173":{start:{line:5739,column:12},end:{line:5739,column:48}},"1174":{start:{line:5740,column:12},end:{line:5740,column:43}},"1175":{start:{line:5742,column:23},end:{line:5742,column:27}},"1176":{start:{line:5743,column:12},end:{line:5751,column:15}},"1177":{start:{line:5744,column:16},end:{line:5750,column:17}},"1178":{start:{line:5745,column:20},end:{line:5745,column:34}},"1179":{start:{line:5748,column:36},end:{line:5748,column:137}},"1180":{start:{line:5749,column:20},end:{line:5749,column:46}},"1181":{start:{line:5765,column:34},end:{line:5765,column:70}},"1182":{start:{line:5766,column:12},end:{line:5766,column:88}},"1183":{start:{line:5772,column:4},end:{line:5802,column:7}},"1184":{start:{line:5774,column:12},end:{line:5774,column:34}},"1185":{start:{line:5776,column:12},end:{line:5776,column:38}},"1186":{start:{line:5777,column:12},end:{line:5777,column:50}},"1187":{start:{line:5778,column:12},end:{line:5778,column:29}},"1188":{start:{line:5783,column:12},end:{line:5783,column:49}},"1189":{start:{line:5785,column:23},end:{line:5785,column:27}},"1190":{start:{line:5786,column:25},end:{line:5789,column:13}},"1191":{start:{line:5790,column:12},end:{line:5800,column:15}},"1192":{start:{line:5791,column:16},end:{line:5799,column:17}},"1193":{start:{line:5792,column:20},end:{line:5792,column:34}},"1194":{start:{line:5795,column:38},end:{line:5795,column:76}},"1195":{start:{line:5796,column:20},end:{line:5796,column:47}},"1196":{start:{line:5798,column:20},end:{line:5798,column:60}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:16,column:1},end:{line:16,column:2}},loc:{start:{line:16,column:12},end:{line:5803,column:1}},line:16},"1":{name:"(anonymous_1)",decl:{start:{line:38,column:14},end:{line:38,column:15}},loc:{start:{line:38,column:25},end:{line:40,column:9}},line:38},"2":{name:"(anonymous_2)",decl:{start:{line:72,column:14},end:{line:72,column:15}},loc:{start:{line:72,column:25},end:{line:88,column:9}},line:72},"3":{name:"(anonymous_3)",decl:{start:{line:105,column:20},end:{line:105,column:21}},loc:{start:{line:105,column:41},end:{line:117,column:9}},line:105},"4":{name:"(anonymous_4)",decl:{start:{line:135,column:14},end:{line:135,column:15}},loc:{start:{line:135,column:25},end:{line:137,column:9}},line:135},"5":{name:"(anonymous_5)",decl:{start:{line:163,column:24},end:{line:163,column:25}},loc:{start:{line:163,column:44},end:{line:165,column:9}},line:163},"6":{name:"(anonymous_6)",decl:{start:{line:191,column:17},end:{line:191,column:18}},loc:{start:{line:191,column:37},end:{line:193,column:9}},line:191},"7":{name:"(anonymous_7)",decl:{start:{line:217,column:23},end:{line:217,column:24}},loc:{start:{line:217,column:43},end:{line:219,column:9}},line:217},"8":{name:"(anonymous_8)",decl:{start:{line:243,column:26},end:{line:243,column:27}},loc:{start:{line:243,column:46},end:{line:245,column:9}},line:243},"9":{name:"(anonymous_9)",decl:{start:{line:270,column:26},end:{line:270,column:27}},loc:{start:{line:270,column:46},end:{line:272,column:9}},line:270},"10":{name:"(anonymous_10)",decl:{start:{line:299,column:14},end:{line:299,column:15}},loc:{start:{line:299,column:34},end:{line:301,column:9}},line:299},"11":{name:"(anonymous_11)",decl:{start:{line:311,column:20},end:{line:311,column:21}},loc:{start:{line:311,column:40},end:{line:313,column:9}},line:311},"12":{name:"(anonymous_12)",decl:{start:{line:336,column:15},end:{line:336,column:16}},loc:{start:{line:336,column:26},end:{line:338,column:9}},line:336},"13":{name:"(anonymous_13)",decl:{start:{line:365,column:15},end:{line:365,column:16}},loc:{start:{line:365,column:35},end:{line:367,column:9}},line:365},"14":{name:"(anonymous_14)",decl:{start:{line:396,column:16},end:{line:396,column:17}},loc:{start:{line:396,column:61},end:{line:404,column:9}},line:396},"15":{name:"(anonymous_15)",decl:{start:{line:419,column:16},end:{line:419,column:17}},loc:{start:{line:419,column:51},end:{line:426,column:9}},line:419},"16":{name:"(anonymous_16)",decl:{start:{line:452,column:23},end:{line:452,column:24}},loc:{start:{line:452,column:68},end:{line:460,column:9}},line:452},"17":{name:"(anonymous_17)",decl:{start:{line:477,column:21},end:{line:477,column:22}},loc:{start:{line:477,column:40},end:{line:500,column:9}},line:477},"18":{name:"(anonymous_18)",decl:{start:{line:478,column:35},end:{line:478,column:36}},loc:{start:{line:478,column:46},end:{line:478,column:48}},line:478},"19":{name:"(anonymous_19)",decl:{start:{line:481,column:54},end:{line:481,column:55}},loc:{start:{line:481,column:78},end:{line:497,column:13}},line:481},"20":{name:"(anonymous_20)",decl:{start:{line:488,column:31},end:{line:488,column:32}},loc:{start:{line:488,column:42},end:{line:495,column:21}},line:488},"21":{name:"(anonymous_21)",decl:{start:{line:516,column:20},end:{line:516,column:21}},loc:{start:{line:516,column:39},end:{line:521,column:9}},line:516},"22":{name:"(anonymous_22)",decl:{start:{line:517,column:35},end:{line:517,column:36}},loc:{start:{line:517,column:46},end:{line:517,column:48}},line:517},"23":{name:"(anonymous_23)",decl:{start:{line:543,column:15},end:{line:543,column:16}},loc:{start:{line:543,column:49},end:{line:562,column:9}},line:543},"24":{name:"(anonymous_24)",decl:{start:{line:549,column:35},end:{line:549,column:36}},loc:{start:{line:549,column:46},end:{line:549,column:48}},line:549},"25":{name:"(anonymous_25)",decl:{start:{line:554,column:50},end:{line:554,column:51}},loc:{start:{line:554,column:74},end:{line:561,column:13}},line:554},"26":{name:"(anonymous_26)",decl:{start:{line:580,column:19},end:{line:580,column:20}},loc:{start:{line:580,column:53},end:{line:601,column:9}},line:580},"27":{name:"(anonymous_27)",decl:{start:{line:586,column:35},end:{line:586,column:36}},loc:{start:{line:586,column:46},end:{line:586,column:48}},line:586},"28":{name:"(anonymous_28)",decl:{start:{line:592,column:53},end:{line:592,column:54}},loc:{start:{line:592,column:77},end:{line:600,column:13}},line:592},"29":{name:"(anonymous_29)",decl:{start:{line:624,column:13},end:{line:624,column:14}},loc:{start:{line:624,column:47},end:{line:663,column:9}},line:624},"30":{name:"(anonymous_30)",decl:{start:{line:630,column:35},end:{line:630,column:36}},loc:{start:{line:630,column:46},end:{line:630,column:48}},line:630},"31":{name:"(anonymous_31)",decl:{start:{line:652,column:16},end:{line:652,column:17}},loc:{start:{line:652,column:40},end:{line:659,column:17}},line:652},"32":{name:"(anonymous_32)",decl:{start:{line:685,column:14},end:{line:685,column:15}},loc:{start:{line:685,column:47},end:{line:703,column:9}},line:685},"33":{name:"(anonymous_33)",decl:{start:{line:721,column:13},end:{line:721,column:14}},loc:{start:{line:721,column:49},end:{line:735,column:9}},line:721},"34":{name:"(anonymous_34)",decl:{start:{line:737,column:16},end:{line:737,column:17}},loc:{start:{line:737,column:42},end:{line:750,column:9}},line:737},"35":{name:"(anonymous_35)",decl:{start:{line:768,column:14},end:{line:768,column:15}},loc:{start:{line:768,column:50},end:{line:782,column:9}},line:768},"36":{name:"(anonymous_36)",decl:{start:{line:800,column:13},end:{line:800,column:14}},loc:{start:{line:800,column:49},end:{line:814,column:9}},line:800},"37":{name:"(anonymous_37)",decl:{start:{line:843,column:14},end:{line:843,column:15}},loc:{start:{line:843,column:49},end:{line:858,column:9}},line:843},"38":{name:"(anonymous_38)",decl:{start:{line:865,column:14},end:{line:865,column:15}},loc:{start:{line:865,column:25},end:{line:867,column:9}},line:865},"39":{name:"(anonymous_39)",decl:{start:{line:877,column:15},end:{line:877,column:16}},loc:{start:{line:877,column:36},end:{line:880,column:9}},line:877},"40":{name:"(anonymous_40)",decl:{start:{line:891,column:15},end:{line:891,column:16}},loc:{start:{line:891,column:34},end:{line:893,column:9}},line:891},"41":{name:"(anonymous_41)",decl:{start:{line:902,column:20},end:{line:902,column:21}},loc:{start:{line:902,column:31},end:{line:904,column:9}},line:902},"42":{name:"(anonymous_42)",decl:{start:{line:913,column:15},end:{line:913,column:16}},loc:{start:{line:913,column:26},end:{line:915,column:9}},line:913},"43":{name:"(anonymous_43)",decl:{start:{line:953,column:14},end:{line:953,column:15}},loc:{start:{line:953,column:49},end:{line:977,column:9}},line:953},"44":{name:"(anonymous_44)",decl:{start:{line:987,column:15},end:{line:987,column:16}},loc:{start:{line:987,column:36},end:{line:1009,column:9}},line:987},"45":{name:"(anonymous_45)",decl:{start:{line:1019,column:16},end:{line:1019,column:17}},loc:{start:{line:1019,column:27},end:{line:1021,column:9}},line:1019},"46":{name:"(anonymous_46)",decl:{start:{line:1031,column:13},end:{line:1031,column:14}},loc:{start:{line:1031,column:24},end:{line:1033,column:9}},line:1031},"47":{name:"(anonymous_47)",decl:{start:{line:1043,column:15},end:{line:1043,column:16}},loc:{start:{line:1043,column:26},end:{line:1045,column:9}},line:1043},"48":{name:"(anonymous_48)",decl:{start:{line:1054,column:16},end:{line:1054,column:17}},loc:{start:{line:1054,column:27},end:{line:1056,column:9}},line:1054},"49":{name:"(anonymous_49)",decl:{start:{line:1065,column:17},end:{line:1065,column:18}},loc:{start:{line:1065,column:28},end:{line:1067,column:9}},line:1065},"50":{name:"(anonymous_50)",decl:{start:{line:1076,column:19},end:{line:1076,column:20}},loc:{start:{line:1076,column:30},end:{line:1078,column:9}},line:1076},"51":{name:"(anonymous_51)",decl:{start:{line:1095,column:15},end:{line:1095,column:16}},loc:{start:{line:1095,column:43},end:{line:1114,column:9}},line:1095},"52":{name:"(anonymous_52)",decl:{start:{line:1100,column:35},end:{line:1100,column:36}},loc:{start:{line:1100,column:46},end:{line:1100,column:48}},line:1100},"53":{name:"(anonymous_53)",decl:{start:{line:1105,column:41},end:{line:1105,column:42}},loc:{start:{line:1105,column:65},end:{line:1113,column:13}},line:1105},"54":{name:"(anonymous_54)",decl:{start:{line:1124,column:16},end:{line:1124,column:17}},loc:{start:{line:1124,column:35},end:{line:1131,column:9}},line:1124},"55":{name:"(anonymous_55)",decl:{start:{line:1125,column:35},end:{line:1125,column:36}},loc:{start:{line:1125,column:46},end:{line:1125,column:48}},line:1125},"56":{name:"(anonymous_56)",decl:{start:{line:1128,column:36},end:{line:1128,column:37}},loc:{start:{line:1128,column:50},end:{line:1130,column:13}},line:1128},"57":{name:"(anonymous_57)",decl:{start:{line:1142,column:16},end:{line:1142,column:17}},loc:{start:{line:1142,column:42},end:{line:1171,column:9}},line:1142},"58":{name:"(anonymous_58)",decl:{start:{line:1143,column:35},end:{line:1143,column:36}},loc:{start:{line:1143,column:46},end:{line:1143,column:48}},line:1143},"59":{name:"(anonymous_59)",decl:{start:{line:1150,column:43},end:{line:1150,column:44}},loc:{start:{line:1150,column:67},end:{line:1168,column:13}},line:1150},"60":{name:"(anonymous_60)",decl:{start:{line:1156,column:31},end:{line:1156,column:32}},loc:{start:{line:1156,column:42},end:{line:1163,column:21}},line:1156},"61":{name:"(anonymous_61)",decl:{start:{line:1181,column:17},end:{line:1181,column:18}},loc:{start:{line:1181,column:36},end:{line:1193,column:9}},line:1181},"62":{name:"(anonymous_62)",decl:{start:{line:1182,column:35},end:{line:1182,column:36}},loc:{start:{line:1182,column:46},end:{line:1182,column:48}},line:1182},"63":{name:"(anonymous_63)",decl:{start:{line:1185,column:37},end:{line:1185,column:38}},loc:{start:{line:1185,column:61},end:{line:1192,column:13}},line:1185},"64":{name:"(anonymous_64)",decl:{start:{line:1203,column:16},end:{line:1203,column:17}},loc:{start:{line:1203,column:35},end:{line:1215,column:9}},line:1203},"65":{name:"(anonymous_65)",decl:{start:{line:1204,column:35},end:{line:1204,column:36}},loc:{start:{line:1204,column:46},end:{line:1204,column:48}},line:1204},"66":{name:"(anonymous_66)",decl:{start:{line:1207,column:36},end:{line:1207,column:37}},loc:{start:{line:1207,column:60},end:{line:1214,column:13}},line:1207},"67":{name:"(anonymous_67)",decl:{start:{line:1225,column:16},end:{line:1225,column:17}},loc:{start:{line:1225,column:35},end:{line:1237,column:9}},line:1225},"68":{name:"(anonymous_68)",decl:{start:{line:1226,column:35},end:{line:1226,column:36}},loc:{start:{line:1226,column:46},end:{line:1226,column:48}},line:1226},"69":{name:"(anonymous_69)",decl:{start:{line:1229,column:37},end:{line:1229,column:38}},loc:{start:{line:1229,column:61},end:{line:1236,column:13}},line:1229},"70":{name:"(anonymous_70)",decl:{start:{line:1272,column:14},end:{line:1272,column:15}},loc:{start:{line:1272,column:49},end:{line:1290,column:9}},line:1272},"71":{name:"(anonymous_71)",decl:{start:{line:1300,column:27},end:{line:1300,column:28}},loc:{start:{line:1300,column:43},end:{line:1302,column:9}},line:1300},"72":{name:"(anonymous_72)",decl:{start:{line:1313,column:15},end:{line:1313,column:16}},loc:{start:{line:1313,column:36},end:{line:1337,column:9}},line:1313},"73":{name:"(anonymous_73)",decl:{start:{line:1347,column:15},end:{line:1347,column:16}},loc:{start:{line:1347,column:26},end:{line:1349,column:9}},line:1347},"74":{name:"(anonymous_74)",decl:{start:{line:1358,column:16},end:{line:1358,column:17}},loc:{start:{line:1358,column:27},end:{line:1360,column:9}},line:1358},"75":{name:"(anonymous_75)",decl:{start:{line:1369,column:17},end:{line:1369,column:18}},loc:{start:{line:1369,column:28},end:{line:1371,column:9}},line:1369},"76":{name:"(anonymous_76)",decl:{start:{line:1388,column:15},end:{line:1388,column:16}},loc:{start:{line:1388,column:43},end:{line:1412,column:9}},line:1388},"77":{name:"(anonymous_77)",decl:{start:{line:1393,column:35},end:{line:1393,column:36}},loc:{start:{line:1393,column:46},end:{line:1393,column:48}},line:1393},"78":{name:"(anonymous_78)",decl:{start:{line:1401,column:44},end:{line:1401,column:45}},loc:{start:{line:1401,column:68},end:{line:1409,column:13}},line:1401},"79":{name:"(anonymous_79)",decl:{start:{line:1414,column:18},end:{line:1414,column:19}},loc:{start:{line:1414,column:42},end:{line:1425,column:9}},line:1414},"80":{name:"(anonymous_80)",decl:{start:{line:1448,column:14},end:{line:1448,column:15}},loc:{start:{line:1448,column:38},end:{line:1505,column:9}},line:1448},"81":{name:"(anonymous_81)",decl:{start:{line:1524,column:16},end:{line:1524,column:17}},loc:{start:{line:1524,column:43},end:{line:1557,column:9}},line:1524},"82":{name:"(anonymous_82)",decl:{start:{line:1525,column:35},end:{line:1525,column:36}},loc:{start:{line:1525,column:46},end:{line:1525,column:48}},line:1525},"83":{name:"(anonymous_83)",decl:{start:{line:1527,column:44},end:{line:1527,column:45}},loc:{start:{line:1527,column:68},end:{line:1554,column:13}},line:1527},"84":{name:"(anonymous_84)",decl:{start:{line:1541,column:37},end:{line:1541,column:38}},loc:{start:{line:1541,column:48},end:{line:1548,column:25}},line:1541},"85":{name:"(anonymous_85)",decl:{start:{line:1574,column:14},end:{line:1574,column:15}},loc:{start:{line:1574,column:33},end:{line:1578,column:9}},line:1574},"86":{name:"(anonymous_86)",decl:{start:{line:1575,column:35},end:{line:1575,column:36}},loc:{start:{line:1575,column:46},end:{line:1575,column:48}},line:1575},"87":{name:"(anonymous_87)",decl:{start:{line:1595,column:14},end:{line:1595,column:15}},loc:{start:{line:1595,column:25},end:{line:1597,column:9}},line:1595},"88":{name:"(anonymous_88)",decl:{start:{line:1613,column:14},end:{line:1613,column:15}},loc:{start:{line:1613,column:49},end:{line:1621,column:9}},line:1613},"89":{name:"(anonymous_89)",decl:{start:{line:1636,column:20},end:{line:1636,column:21}},loc:{start:{line:1636,column:31},end:{line:1638,column:9}},line:1636},"90":{name:"(anonymous_90)",decl:{start:{line:1656,column:21},end:{line:1656,column:22}},loc:{start:{line:1656,column:40},end:{line:1665,column:9}},line:1656},"91":{name:"(anonymous_91)",decl:{start:{line:1657,column:35},end:{line:1657,column:36}},loc:{start:{line:1657,column:46},end:{line:1657,column:48}},line:1657},"92":{name:"(anonymous_92)",decl:{start:{line:1660,column:51},end:{line:1660,column:52}},loc:{start:{line:1660,column:65},end:{line:1662,column:13}},line:1660},"93":{name:"(anonymous_93)",decl:{start:{line:1688,column:18},end:{line:1688,column:19}},loc:{start:{line:1688,column:46},end:{line:1711,column:9}},line:1688},"94":{name:"(anonymous_94)",decl:{start:{line:1694,column:35},end:{line:1694,column:36}},loc:{start:{line:1694,column:46},end:{line:1694,column:48}},line:1694},"95":{name:"(anonymous_95)",decl:{start:{line:1698,column:53},end:{line:1698,column:54}},loc:{start:{line:1698,column:77},end:{line:1708,column:13}},line:1698},"96":{name:"(anonymous_96)",decl:{start:{line:1725,column:25},end:{line:1725,column:26}},loc:{start:{line:1725,column:36},end:{line:1727,column:9}},line:1725},"97":{name:"(anonymous_97)",decl:{start:{line:1748,column:17},end:{line:1748,column:18}},loc:{start:{line:1748,column:45},end:{line:1777,column:9}},line:1748},"98":{name:"(anonymous_98)",decl:{start:{line:1754,column:35},end:{line:1754,column:36}},loc:{start:{line:1754,column:46},end:{line:1754,column:48}},line:1754},"99":{name:"(anonymous_99)",decl:{start:{line:1758,column:48},end:{line:1758,column:49}},loc:{start:{line:1758,column:72},end:{line:1776,column:13}},line:1758},"100":{name:"(anonymous_100)",decl:{start:{line:1794,column:22},end:{line:1794,column:23}},loc:{start:{line:1794,column:41},end:{line:1801,column:9}},line:1794},"101":{name:"(anonymous_101)",decl:{start:{line:1795,column:35},end:{line:1795,column:36}},loc:{start:{line:1795,column:46},end:{line:1795,column:48}},line:1795},"102":{name:"(anonymous_102)",decl:{start:{line:1798,column:44},end:{line:1798,column:45}},loc:{start:{line:1798,column:68},end:{line:1800,column:13}},line:1798},"103":{name:"(anonymous_103)",decl:{start:{line:1815,column:16},end:{line:1815,column:17}},loc:{start:{line:1815,column:43},end:{line:1842,column:9}},line:1815},"104":{name:"(anonymous_104)",decl:{start:{line:1820,column:37},end:{line:1820,column:38}},loc:{start:{line:1820,column:59},end:{line:1835,column:17}},line:1820},"105":{name:"(anonymous_105)",decl:{start:{line:1826,column:52},end:{line:1826,column:53}},loc:{start:{line:1826,column:63},end:{line:1833,column:25}},line:1826},"106":{name:"(anonymous_106)",decl:{start:{line:1860,column:14},end:{line:1860,column:15}},loc:{start:{line:1860,column:25},end:{line:1862,column:9}},line:1860},"107":{name:"(anonymous_107)",decl:{start:{line:1872,column:27},end:{line:1872,column:28}},loc:{start:{line:1872,column:43},end:{line:1875,column:9}},line:1872},"108":{name:"(anonymous_108)",decl:{start:{line:1890,column:14},end:{line:1890,column:15}},loc:{start:{line:1890,column:43},end:{line:1892,column:9}},line:1890},"109":{name:"(anonymous_109)",decl:{start:{line:1909,column:14},end:{line:1909,column:15}},loc:{start:{line:1909,column:26},end:{line:1911,column:9}},line:1909},"110":{name:"(anonymous_110)",decl:{start:{line:1927,column:14},end:{line:1927,column:15}},loc:{start:{line:1927,column:50},end:{line:1930,column:9}},line:1927},"111":{name:"(anonymous_111)",decl:{start:{line:1956,column:14},end:{line:1956,column:15}},loc:{start:{line:1956,column:25},end:{line:1958,column:9}},line:1956},"112":{name:"(anonymous_112)",decl:{start:{line:1970,column:27},end:{line:1970,column:28}},loc:{start:{line:1970,column:43},end:{line:1973,column:9}},line:1970},"113":{name:"(anonymous_113)",decl:{start:{line:1988,column:14},end:{line:1988,column:15}},loc:{start:{line:1988,column:43},end:{line:1990,column:9}},line:1988},"114":{name:"(anonymous_114)",decl:{start:{line:2008,column:14},end:{line:2008,column:15}},loc:{start:{line:2008,column:25},end:{line:2010,column:9}},line:2008},"115":{name:"(anonymous_115)",decl:{start:{line:2020,column:17},end:{line:2020,column:18}},loc:{start:{line:2020,column:28},end:{line:2022,column:9}},line:2020},"116":{name:"(anonymous_116)",decl:{start:{line:2030,column:19},end:{line:2030,column:20}},loc:{start:{line:2030,column:30},end:{line:2032,column:9}},line:2030},"117":{name:"(anonymous_117)",decl:{start:{line:2043,column:22},end:{line:2043,column:23}},loc:{start:{line:2043,column:33},end:{line:2046,column:9}},line:2043},"118":{name:"(anonymous_118)",decl:{start:{line:2056,column:24},end:{line:2056,column:25}},loc:{start:{line:2056,column:35},end:{line:2058,column:9}},line:2056},"119":{name:"(anonymous_119)",decl:{start:{line:2066,column:25},end:{line:2066,column:26}},loc:{start:{line:2066,column:36},end:{line:2068,column:9}},line:2066},"120":{name:"(anonymous_120)",decl:{start:{line:2077,column:18},end:{line:2077,column:19}},loc:{start:{line:2077,column:29},end:{line:2079,column:9}},line:2077},"121":{name:"(anonymous_121)",decl:{start:{line:2087,column:13},end:{line:2087,column:14}},loc:{start:{line:2087,column:24},end:{line:2089,column:9}},line:2087},"122":{name:"(anonymous_122)",decl:{start:{line:2097,column:21},end:{line:2097,column:22}},loc:{start:{line:2097,column:32},end:{line:2099,column:9}},line:2097},"123":{name:"(anonymous_123)",decl:{start:{line:2109,column:29},end:{line:2109,column:30}},loc:{start:{line:2109,column:40},end:{line:2111,column:9}},line:2109},"124":{name:"(anonymous_124)",decl:{start:{line:2121,column:29},end:{line:2121,column:30}},loc:{start:{line:2121,column:40},end:{line:2123,column:9}},line:2121},"125":{name:"(anonymous_125)",decl:{start:{line:2139,column:14},end:{line:2139,column:15}},loc:{start:{line:2139,column:49},end:{line:2142,column:9}},line:2139},"126":{name:"(anonymous_126)",decl:{start:{line:2160,column:14},end:{line:2160,column:15}},loc:{start:{line:2160,column:25},end:{line:2162,column:9}},line:2160},"127":{name:"(anonymous_127)",decl:{start:{line:2172,column:15},end:{line:2172,column:16}},loc:{start:{line:2172,column:26},end:{line:2174,column:9}},line:2172},"128":{name:"(anonymous_128)",decl:{start:{line:2193,column:14},end:{line:2193,column:15}},loc:{start:{line:2193,column:42},end:{line:2221,column:9}},line:2193},"129":{name:"(anonymous_129)",decl:{start:{line:2199,column:35},end:{line:2199,column:36}},loc:{start:{line:2199,column:46},end:{line:2199,column:48}},line:2199},"130":{name:"(anonymous_130)",decl:{start:{line:2203,column:41},end:{line:2203,column:42}},loc:{start:{line:2203,column:65},end:{line:2220,column:13}},line:2203},"131":{name:"(anonymous_131)",decl:{start:{line:2237,column:14},end:{line:2237,column:15}},loc:{start:{line:2237,column:49},end:{line:2242,column:9}},line:2237},"132":{name:"(anonymous_132)",decl:{start:{line:2261,column:14},end:{line:2261,column:15}},loc:{start:{line:2261,column:25},end:{line:2263,column:9}},line:2261},"133":{name:"(anonymous_133)",decl:{start:{line:2273,column:27},end:{line:2273,column:28}},loc:{start:{line:2273,column:43},end:{line:2276,column:9}},line:2273},"134":{name:"(anonymous_134)",decl:{start:{line:2283,column:16},end:{line:2283,column:17}},loc:{start:{line:2283,column:27},end:{line:2285,column:9}},line:2283},"135":{name:"(anonymous_135)",decl:{start:{line:2300,column:14},end:{line:2300,column:15}},loc:{start:{line:2300,column:43},end:{line:2305,column:9}},line:2300},"136":{name:"(anonymous_136)",decl:{start:{line:2330,column:14},end:{line:2330,column:15}},loc:{start:{line:2330,column:25},end:{line:2332,column:9}},line:2330},"137":{name:"(anonymous_137)",decl:{start:{line:2344,column:14},end:{line:2344,column:15}},loc:{start:{line:2344,column:38},end:{line:2350,column:9}},line:2344},"138":{name:"(anonymous_138)",decl:{start:{line:2367,column:19},end:{line:2367,column:20}},loc:{start:{line:2367,column:38},end:{line:2379,column:9}},line:2367},"139":{name:"(anonymous_139)",decl:{start:{line:2368,column:35},end:{line:2368,column:36}},loc:{start:{line:2368,column:46},end:{line:2368,column:48}},line:2368},"140":{name:"(anonymous_140)",decl:{start:{line:2371,column:41},end:{line:2371,column:42}},loc:{start:{line:2371,column:65},end:{line:2378,column:13}},line:2371},"141":{name:"(anonymous_141)",decl:{start:{line:2396,column:20},end:{line:2396,column:21}},loc:{start:{line:2396,column:39},end:{line:2408,column:9}},line:2396},"142":{name:"(anonymous_142)",decl:{start:{line:2397,column:35},end:{line:2397,column:36}},loc:{start:{line:2397,column:46},end:{line:2397,column:48}},line:2397},"143":{name:"(anonymous_143)",decl:{start:{line:2400,column:42},end:{line:2400,column:43}},loc:{start:{line:2400,column:66},end:{line:2407,column:13}},line:2400},"144":{name:"(anonymous_144)",decl:{start:{line:2434,column:14},end:{line:2434,column:15}},loc:{start:{line:2434,column:25},end:{line:2436,column:9}},line:2434},"145":{name:"(anonymous_145)",decl:{start:{line:2446,column:27},end:{line:2446,column:28}},loc:{start:{line:2446,column:43},end:{line:2448,column:9}},line:2446},"146":{name:"(anonymous_146)",decl:{start:{line:2459,column:14},end:{line:2459,column:15}},loc:{start:{line:2459,column:32},end:{line:2461,column:9}},line:2459},"147":{name:"(anonymous_147)",decl:{start:{line:2477,column:14},end:{line:2477,column:15}},loc:{start:{line:2477,column:25},end:{line:2479,column:9}},line:2477},"148":{name:"(anonymous_148)",decl:{start:{line:2490,column:14},end:{line:2490,column:15}},loc:{start:{line:2490,column:32},end:{line:2493,column:9}},line:2490},"149":{name:"(anonymous_149)",decl:{start:{line:2510,column:14},end:{line:2510,column:15}},loc:{start:{line:2510,column:25},end:{line:2512,column:9}},line:2510},"150":{name:"(anonymous_150)",decl:{start:{line:2524,column:14},end:{line:2524,column:15}},loc:{start:{line:2524,column:38},end:{line:2527,column:9}},line:2524},"151":{name:"(anonymous_151)",decl:{start:{line:2553,column:14},end:{line:2553,column:15}},loc:{start:{line:2553,column:25},end:{line:2555,column:9}},line:2553},"152":{name:"(anonymous_152)",decl:{start:{line:2565,column:27},end:{line:2565,column:28}},loc:{start:{line:2565,column:43},end:{line:2567,column:9}},line:2565},"153":{name:"(anonymous_153)",decl:{start:{line:2578,column:14},end:{line:2578,column:15}},loc:{start:{line:2578,column:32},end:{line:2580,column:9}},line:2578},"154":{name:"(anonymous_154)",decl:{start:{line:2592,column:16},end:{line:2592,column:17}},loc:{start:{line:2592,column:43},end:{line:2617,column:9}},line:2592},"155":{name:"(anonymous_155)",decl:{start:{line:2593,column:35},end:{line:2593,column:36}},loc:{start:{line:2593,column:46},end:{line:2593,column:48}},line:2593},"156":{name:"(anonymous_156)",decl:{start:{line:2596,column:44},end:{line:2596,column:45}},loc:{start:{line:2596,column:68},end:{line:2614,column:13}},line:2596},"157":{name:"(anonymous_157)",decl:{start:{line:2605,column:33},end:{line:2605,column:34}},loc:{start:{line:2605,column:44},end:{line:2612,column:21}},line:2605},"158":{name:"(anonymous_158)",decl:{start:{line:2634,column:14},end:{line:2634,column:15}},loc:{start:{line:2634,column:25},end:{line:2636,column:9}},line:2634},"159":{name:"(anonymous_159)",decl:{start:{line:2652,column:14},end:{line:2652,column:15}},loc:{start:{line:2652,column:49},end:{line:2655,column:9}},line:2652},"160":{name:"(anonymous_160)",decl:{start:{line:2672,column:14},end:{line:2672,column:15}},loc:{start:{line:2672,column:25},end:{line:2674,column:9}},line:2672},"161":{name:"(anonymous_161)",decl:{start:{line:2684,column:27},end:{line:2684,column:28}},loc:{start:{line:2684,column:43},end:{line:2687,column:9}},line:2684},"162":{name:"(anonymous_162)",decl:{start:{line:2702,column:14},end:{line:2702,column:15}},loc:{start:{line:2702,column:43},end:{line:2704,column:9}},line:2702},"163":{name:"(anonymous_163)",decl:{start:{line:2720,column:14},end:{line:2720,column:15}},loc:{start:{line:2720,column:25},end:{line:2722,column:9}},line:2720},"164":{name:"(anonymous_164)",decl:{start:{line:2738,column:14},end:{line:2738,column:15}},loc:{start:{line:2738,column:49},end:{line:2743,column:9}},line:2738},"165":{name:"(anonymous_165)",decl:{start:{line:2766,column:21},end:{line:2766,column:22}},loc:{start:{line:2766,column:55},end:{line:2782,column:9}},line:2766},"166":{name:"(anonymous_166)",decl:{start:{line:2772,column:35},end:{line:2772,column:36}},loc:{start:{line:2772,column:46},end:{line:2772,column:48}},line:2772},"167":{name:"(anonymous_167)",decl:{start:{line:2779,column:51},end:{line:2779,column:52}},loc:{start:{line:2779,column:73},end:{line:2781,column:13}},line:2779},"168":{name:"(anonymous_168)",decl:{start:{line:2784,column:16},end:{line:2784,column:17}},loc:{start:{line:2784,column:35},end:{line:2791,column:9}},line:2784},"169":{name:"(anonymous_169)",decl:{start:{line:2808,column:14},end:{line:2808,column:15}},loc:{start:{line:2808,column:25},end:{line:2810,column:9}},line:2808},"170":{name:"(anonymous_170)",decl:{start:{line:2820,column:27},end:{line:2820,column:28}},loc:{start:{line:2820,column:43},end:{line:2823,column:9}},line:2820},"171":{name:"(anonymous_171)",decl:{start:{line:2838,column:14},end:{line:2838,column:15}},loc:{start:{line:2838,column:43},end:{line:2840,column:9}},line:2838},"172":{name:"(anonymous_172)",decl:{start:{line:2859,column:16},end:{line:2859,column:17}},loc:{start:{line:2859,column:49},end:{line:2872,column:9}},line:2859},"173":{name:"(anonymous_173)",decl:{start:{line:2889,column:14},end:{line:2889,column:15}},loc:{start:{line:2889,column:25},end:{line:2892,column:9}},line:2889},"174":{name:"(anonymous_174)",decl:{start:{line:2909,column:14},end:{line:2909,column:15}},loc:{start:{line:2909,column:55},end:{line:2913,column:9}},line:2909},"175":{name:"(anonymous_175)",decl:{start:{line:2931,column:14},end:{line:2931,column:15}},loc:{start:{line:2931,column:25},end:{line:2933,column:9}},line:2931},"176":{name:"(anonymous_176)",decl:{start:{line:2945,column:26},end:{line:2945,column:27}},loc:{start:{line:2945,column:37},end:{line:2947,column:9}},line:2945},"177":{name:"(anonymous_177)",decl:{start:{line:2957,column:27},end:{line:2957,column:28}},loc:{start:{line:2957,column:43},end:{line:2960,column:9}},line:2957},"178":{name:"(anonymous_178)",decl:{start:{line:2976,column:14},end:{line:2976,column:15}},loc:{start:{line:2976,column:49},end:{line:2979,column:9}},line:2976},"179":{name:"(anonymous_179)",decl:{start:{line:2998,column:16},end:{line:2998,column:17}},loc:{start:{line:2998,column:55},end:{line:3016,column:9}},line:2998},"180":{name:"(anonymous_180)",decl:{start:{line:3042,column:14},end:{line:3042,column:15}},loc:{start:{line:3042,column:25},end:{line:3044,column:9}},line:3042},"181":{name:"(anonymous_181)",decl:{start:{line:3054,column:27},end:{line:3054,column:28}},loc:{start:{line:3054,column:43},end:{line:3056,column:9}},line:3054},"182":{name:"(anonymous_182)",decl:{start:{line:3071,column:14},end:{line:3071,column:15}},loc:{start:{line:3071,column:43},end:{line:3077,column:9}},line:3071},"183":{name:"(anonymous_183)",decl:{start:{line:3095,column:16},end:{line:3095,column:17}},loc:{start:{line:3095,column:45},end:{line:3123,column:9}},line:3095},"184":{name:"(anonymous_184)",decl:{start:{line:3102,column:35},end:{line:3102,column:36}},loc:{start:{line:3102,column:46},end:{line:3102,column:48}},line:3102},"185":{name:"(anonymous_185)",decl:{start:{line:3105,column:56},end:{line:3105,column:57}},loc:{start:{line:3105,column:80},end:{line:3120,column:13}},line:3105},"186":{name:"(anonymous_186)",decl:{start:{line:3111,column:33},end:{line:3111,column:34}},loc:{start:{line:3111,column:44},end:{line:3118,column:21}},line:3111},"187":{name:"(anonymous_187)",decl:{start:{line:3125,column:23},end:{line:3125,column:24}},loc:{start:{line:3125,column:48},end:{line:3151,column:9}},line:3125},"188":{name:"(anonymous_188)",decl:{start:{line:3133,column:58},end:{line:3133,column:59}},loc:{start:{line:3133,column:63},end:{line:3133,column:82}},line:3133},"189":{name:"(anonymous_189)",decl:{start:{line:3153,column:25},end:{line:3153,column:26}},loc:{start:{line:3153,column:54},end:{line:3169,column:9}},line:3153},"190":{name:"(anonymous_190)",decl:{start:{line:3171,column:19},end:{line:3171,column:20}},loc:{start:{line:3171,column:90},end:{line:3212,column:9}},line:3171},"191":{name:"(anonymous_191)",decl:{start:{line:3172,column:35},end:{line:3172,column:36}},loc:{start:{line:3172,column:46},end:{line:3172,column:48}},line:3172},"192":{name:"(anonymous_192)",decl:{start:{line:3185,column:20},end:{line:3185,column:21}},loc:{start:{line:3185,column:38},end:{line:3185,column:92}},line:3185},"193":{name:"(anonymous_193)",decl:{start:{line:3200,column:55},end:{line:3200,column:56}},loc:{start:{line:3200,column:81},end:{line:3203,column:17}},line:3200},"194":{name:"(anonymous_194)",decl:{start:{line:3207,column:49},end:{line:3207,column:50}},loc:{start:{line:3207,column:73},end:{line:3210,column:17}},line:3207},"195":{name:"(anonymous_195)",decl:{start:{line:3229,column:14},end:{line:3229,column:15}},loc:{start:{line:3229,column:25},end:{line:3231,column:9}},line:3229},"196":{name:"(anonymous_196)",decl:{start:{line:3247,column:14},end:{line:3247,column:15}},loc:{start:{line:3247,column:48},end:{line:3269,column:9}},line:3247},"197":{name:"(anonymous_197)",decl:{start:{line:3286,column:16},end:{line:3286,column:17}},loc:{start:{line:3286,column:35},end:{line:3290,column:9}},line:3286},"198":{name:"(anonymous_198)",decl:{start:{line:3307,column:24},end:{line:3307,column:25}},loc:{start:{line:3307,column:43},end:{line:3316,column:9}},line:3307},"199":{name:"(anonymous_199)",decl:{start:{line:3308,column:35},end:{line:3308,column:36}},loc:{start:{line:3308,column:46},end:{line:3308,column:48}},line:3308},"200":{name:"(anonymous_200)",decl:{start:{line:3311,column:71},end:{line:3311,column:72}},loc:{start:{line:3311,column:85},end:{line:3313,column:13}},line:3311},"201":{name:"(anonymous_201)",decl:{start:{line:3333,column:23},end:{line:3333,column:24}},loc:{start:{line:3333,column:42},end:{line:3342,column:9}},line:3333},"202":{name:"(anonymous_202)",decl:{start:{line:3334,column:35},end:{line:3334,column:36}},loc:{start:{line:3334,column:46},end:{line:3334,column:48}},line:3334},"203":{name:"(anonymous_203)",decl:{start:{line:3337,column:70},end:{line:3337,column:71}},loc:{start:{line:3337,column:84},end:{line:3339,column:13}},line:3337},"204":{name:"(anonymous_204)",decl:{start:{line:3360,column:16},end:{line:3360,column:17}},loc:{start:{line:3360,column:43},end:{line:3374,column:9}},line:3360},"205":{name:"(anonymous_205)",decl:{start:{line:3361,column:35},end:{line:3361,column:36}},loc:{start:{line:3361,column:46},end:{line:3361,column:48}},line:3361},"206":{name:"(anonymous_206)",decl:{start:{line:3366,column:46},end:{line:3366,column:47}},loc:{start:{line:3366,column:70},end:{line:3373,column:13}},line:3366},"207":{name:"(anonymous_207)",decl:{start:{line:3391,column:18},end:{line:3391,column:19}},loc:{start:{line:3391,column:37},end:{line:3400,column:9}},line:3391},"208":{name:"(anonymous_208)",decl:{start:{line:3392,column:35},end:{line:3392,column:36}},loc:{start:{line:3392,column:46},end:{line:3392,column:48}},line:3392},"209":{name:"(anonymous_209)",decl:{start:{line:3395,column:65},end:{line:3395,column:66}},loc:{start:{line:3395,column:79},end:{line:3397,column:13}},line:3395},"210":{name:"(anonymous_210)",decl:{start:{line:3413,column:18},end:{line:3413,column:19}},loc:{start:{line:3413,column:41},end:{line:3415,column:9}},line:3413},"211":{name:"(anonymous_211)",decl:{start:{line:3432,column:15},end:{line:3432,column:16}},loc:{start:{line:3432,column:34},end:{line:3441,column:9}},line:3432},"212":{name:"(anonymous_212)",decl:{start:{line:3433,column:35},end:{line:3433,column:36}},loc:{start:{line:3433,column:46},end:{line:3433,column:48}},line:3433},"213":{name:"(anonymous_213)",decl:{start:{line:3436,column:62},end:{line:3436,column:63}},loc:{start:{line:3436,column:76},end:{line:3438,column:13}},line:3436},"214":{name:"(anonymous_214)",decl:{start:{line:3459,column:17},end:{line:3459,column:18}},loc:{start:{line:3459,column:44},end:{line:3473,column:9}},line:3459},"215":{name:"(anonymous_215)",decl:{start:{line:3460,column:35},end:{line:3460,column:36}},loc:{start:{line:3460,column:46},end:{line:3460,column:48}},line:3460},"216":{name:"(anonymous_216)",decl:{start:{line:3465,column:55},end:{line:3465,column:56}},loc:{start:{line:3465,column:79},end:{line:3472,column:13}},line:3465},"217":{name:"(anonymous_217)",decl:{start:{line:3496,column:17},end:{line:3496,column:18}},loc:{start:{line:3496,column:44},end:{line:3510,column:9}},line:3496},"218":{name:"(anonymous_218)",decl:{start:{line:3497,column:35},end:{line:3497,column:36}},loc:{start:{line:3497,column:46},end:{line:3497,column:48}},line:3497},"219":{name:"(anonymous_219)",decl:{start:{line:3502,column:47},end:{line:3502,column:48}},loc:{start:{line:3502,column:71},end:{line:3509,column:13}},line:3502},"220":{name:"(anonymous_220)",decl:{start:{line:3527,column:19},end:{line:3527,column:20}},loc:{start:{line:3527,column:38},end:{line:3539,column:9}},line:3527},"221":{name:"(anonymous_221)",decl:{start:{line:3528,column:35},end:{line:3528,column:36}},loc:{start:{line:3528,column:46},end:{line:3528,column:48}},line:3528},"222":{name:"(anonymous_222)",decl:{start:{line:3531,column:46},end:{line:3531,column:47}},loc:{start:{line:3531,column:70},end:{line:3538,column:13}},line:3531},"223":{name:"(anonymous_223)",decl:{start:{line:3557,column:21},end:{line:3557,column:22}},loc:{start:{line:3557,column:47},end:{line:3566,column:9}},line:3557},"224":{name:"(anonymous_224)",decl:{start:{line:3558,column:35},end:{line:3558,column:36}},loc:{start:{line:3558,column:46},end:{line:3558,column:48}},line:3558},"225":{name:"(anonymous_225)",decl:{start:{line:3561,column:85},end:{line:3561,column:86}},loc:{start:{line:3561,column:99},end:{line:3563,column:13}},line:3561},"226":{name:"(anonymous_226)",decl:{start:{line:3585,column:16},end:{line:3585,column:17}},loc:{start:{line:3585,column:42},end:{line:3594,column:9}},line:3585},"227":{name:"(anonymous_227)",decl:{start:{line:3586,column:35},end:{line:3586,column:36}},loc:{start:{line:3586,column:46},end:{line:3586,column:48}},line:3586},"228":{name:"(anonymous_228)",decl:{start:{line:3589,column:75},end:{line:3589,column:76}},loc:{start:{line:3589,column:89},end:{line:3591,column:13}},line:3589},"229":{name:"(anonymous_229)",decl:{start:{line:3612,column:17},end:{line:3612,column:18}},loc:{start:{line:3612,column:44},end:{line:3624,column:9}},line:3612},"230":{name:"(anonymous_230)",decl:{start:{line:3613,column:35},end:{line:3613,column:36}},loc:{start:{line:3613,column:46},end:{line:3613,column:48}},line:3613},"231":{name:"(anonymous_231)",decl:{start:{line:3616,column:47},end:{line:3616,column:48}},loc:{start:{line:3616,column:71},end:{line:3623,column:13}},line:3616},"232":{name:"(anonymous_232)",decl:{start:{line:3642,column:18},end:{line:3642,column:19}},loc:{start:{line:3642,column:45},end:{line:3654,column:9}},line:3642},"233":{name:"(anonymous_233)",decl:{start:{line:3643,column:35},end:{line:3643,column:36}},loc:{start:{line:3643,column:46},end:{line:3643,column:48}},line:3643},"234":{name:"(anonymous_234)",decl:{start:{line:3646,column:48},end:{line:3646,column:49}},loc:{start:{line:3646,column:72},end:{line:3653,column:13}},line:3646},"235":{name:"(anonymous_235)",decl:{start:{line:3672,column:15},end:{line:3672,column:16}},loc:{start:{line:3672,column:34},end:{line:3681,column:9}},line:3672},"236":{name:"(anonymous_236)",decl:{start:{line:3673,column:35},end:{line:3673,column:36}},loc:{start:{line:3673,column:46},end:{line:3673,column:48}},line:3673},"237":{name:"(anonymous_237)",decl:{start:{line:3676,column:62},end:{line:3676,column:63}},loc:{start:{line:3676,column:76},end:{line:3678,column:13}},line:3676},"238":{name:"(anonymous_238)",decl:{start:{line:3699,column:15},end:{line:3699,column:16}},loc:{start:{line:3699,column:44},end:{line:3787,column:9}},line:3699},"239":{name:"(anonymous_239)",decl:{start:{line:3715,column:49},end:{line:3715,column:50}},loc:{start:{line:3715,column:60},end:{line:3715,column:62}},line:3715},"240":{name:"(anonymous_240)",decl:{start:{line:3716,column:55},end:{line:3716,column:56}},loc:{start:{line:3716,column:66},end:{line:3716,column:68}},line:3716},"241":{name:"(anonymous_241)",decl:{start:{line:3717,column:47},end:{line:3717,column:48}},loc:{start:{line:3717,column:58},end:{line:3717,column:60}},line:3717},"242":{name:"(anonymous_242)",decl:{start:{line:3718,column:51},end:{line:3718,column:52}},loc:{start:{line:3718,column:62},end:{line:3718,column:64}},line:3718},"243":{name:"(anonymous_243)",decl:{start:{line:3719,column:49},end:{line:3719,column:50}},loc:{start:{line:3719,column:60},end:{line:3719,column:62}},line:3719},"244":{name:"(anonymous_244)",decl:{start:{line:3722,column:57},end:{line:3722,column:58}},loc:{start:{line:3722,column:68},end:{line:3722,column:70}},line:3722},"245":{name:"(anonymous_245)",decl:{start:{line:3723,column:75},end:{line:3723,column:76}},loc:{start:{line:3723,column:86},end:{line:3723,column:88}},line:3723},"246":{name:"(anonymous_246)",decl:{start:{line:3729,column:16},end:{line:3729,column:17}},loc:{start:{line:3729,column:27},end:{line:3729,column:51}},line:3729},"247":{name:"(anonymous_247)",decl:{start:{line:3730,column:16},end:{line:3730,column:17}},loc:{start:{line:3730,column:40},end:{line:3780,column:17}},line:3730},"248":{name:"(anonymous_248)",decl:{start:{line:3731,column:31},end:{line:3731,column:32}},loc:{start:{line:3731,column:50},end:{line:3779,column:21}},line:3731},"249":{name:"(anonymous_249)",decl:{start:{line:3781,column:16},end:{line:3781,column:17}},loc:{start:{line:3781,column:30},end:{line:3785,column:17}},line:3781},"250":{name:"(anonymous_250)",decl:{start:{line:3804,column:17},end:{line:3804,column:18}},loc:{start:{line:3804,column:36},end:{line:3813,column:9}},line:3804},"251":{name:"(anonymous_251)",decl:{start:{line:3805,column:35},end:{line:3805,column:36}},loc:{start:{line:3805,column:46},end:{line:3805,column:48}},line:3805},"252":{name:"(anonymous_252)",decl:{start:{line:3808,column:64},end:{line:3808,column:65}},loc:{start:{line:3808,column:78},end:{line:3810,column:13}},line:3808},"253":{name:"(anonymous_253)",decl:{start:{line:3830,column:14},end:{line:3830,column:15}},loc:{start:{line:3830,column:25},end:{line:3832,column:9}},line:3830},"254":{name:"(anonymous_254)",decl:{start:{line:3842,column:27},end:{line:3842,column:28}},loc:{start:{line:3842,column:43},end:{line:3846,column:9}},line:3842},"255":{name:"(anonymous_255)",decl:{start:{line:3861,column:14},end:{line:3861,column:15}},loc:{start:{line:3861,column:43},end:{line:3867,column:9}},line:3861},"256":{name:"(anonymous_256)",decl:{start:{line:3886,column:16},end:{line:3886,column:17}},loc:{start:{line:3886,column:50},end:{line:3917,column:9}},line:3886},"257":{name:"(anonymous_257)",decl:{start:{line:3895,column:35},end:{line:3895,column:36}},loc:{start:{line:3895,column:46},end:{line:3895,column:48}},line:3895},"258":{name:"(anonymous_258)",decl:{start:{line:3908,column:41},end:{line:3908,column:42}},loc:{start:{line:3908,column:65},end:{line:3916,column:13}},line:3908},"259":{name:"(anonymous_259)",decl:{start:{line:3944,column:16},end:{line:3944,column:17}},loc:{start:{line:3944,column:50},end:{line:3946,column:9}},line:3944},"260":{name:"(anonymous_260)",decl:{start:{line:3969,column:23},end:{line:3969,column:24}},loc:{start:{line:3969,column:57},end:{line:4014,column:9}},line:3969},"261":{name:"(anonymous_261)",decl:{start:{line:3978,column:35},end:{line:3978,column:36}},loc:{start:{line:3978,column:46},end:{line:3978,column:48}},line:3978},"262":{name:"(anonymous_262)",decl:{start:{line:4003,column:16},end:{line:4003,column:17}},loc:{start:{line:4003,column:40},end:{line:4010,column:17}},line:4003},"263":{name:"(anonymous_263)",decl:{start:{line:4071,column:14},end:{line:4071,column:15}},loc:{start:{line:4071,column:30},end:{line:4086,column:9}},line:4071},"264":{name:"(anonymous_264)",decl:{start:{line:4095,column:18},end:{line:4095,column:19}},loc:{start:{line:4095,column:29},end:{line:4097,column:9}},line:4095},"265":{name:"(anonymous_265)",decl:{start:{line:4106,column:18},end:{line:4106,column:19}},loc:{start:{line:4106,column:29},end:{line:4108,column:9}},line:4106},"266":{name:"(anonymous_266)",decl:{start:{line:4117,column:21},end:{line:4117,column:22}},loc:{start:{line:4117,column:32},end:{line:4119,column:9}},line:4117},"267":{name:"(anonymous_267)",decl:{start:{line:4128,column:23},end:{line:4128,column:24}},loc:{start:{line:4128,column:34},end:{line:4130,column:9}},line:4128},"268":{name:"(anonymous_268)",decl:{start:{line:4139,column:22},end:{line:4139,column:23}},loc:{start:{line:4139,column:33},end:{line:4141,column:9}},line:4139},"269":{name:"(anonymous_269)",decl:{start:{line:4150,column:16},end:{line:4150,column:17}},loc:{start:{line:4150,column:27},end:{line:4152,column:9}},line:4150},"270":{name:"(anonymous_270)",decl:{start:{line:4161,column:19},end:{line:4161,column:20}},loc:{start:{line:4161,column:30},end:{line:4163,column:9}},line:4161},"271":{name:"(anonymous_271)",decl:{start:{line:4191,column:14},end:{line:4191,column:15}},loc:{start:{line:4191,column:30},end:{line:4198,column:9}},line:4191},"272":{name:"(anonymous_272)",decl:{start:{line:4257,column:14},end:{line:4257,column:15}},loc:{start:{line:4257,column:30},end:{line:4283,column:9}},line:4257},"273":{name:"(anonymous_273)",decl:{start:{line:4292,column:26},end:{line:4292,column:27}},loc:{start:{line:4292,column:37},end:{line:4294,column:9}},line:4292},"274":{name:"(anonymous_274)",decl:{start:{line:4303,column:20},end:{line:4303,column:21}},loc:{start:{line:4303,column:31},end:{line:4305,column:9}},line:4303},"275":{name:"(anonymous_275)",decl:{start:{line:4314,column:18},end:{line:4314,column:19}},loc:{start:{line:4314,column:29},end:{line:4316,column:9}},line:4314},"276":{name:"(anonymous_276)",decl:{start:{line:4325,column:16},end:{line:4325,column:17}},loc:{start:{line:4325,column:27},end:{line:4327,column:9}},line:4325},"277":{name:"(anonymous_277)",decl:{start:{line:4336,column:15},end:{line:4336,column:16}},loc:{start:{line:4336,column:26},end:{line:4338,column:9}},line:4336},"278":{name:"(anonymous_278)",decl:{start:{line:4347,column:17},end:{line:4347,column:18}},loc:{start:{line:4347,column:28},end:{line:4349,column:9}},line:4347},"279":{name:"(anonymous_279)",decl:{start:{line:4382,column:14},end:{line:4382,column:15}},loc:{start:{line:4382,column:39},end:{line:4391,column:9}},line:4382},"280":{name:"(anonymous_280)",decl:{start:{line:4401,column:13},end:{line:4401,column:14}},loc:{start:{line:4401,column:38},end:{line:4412,column:9}},line:4401},"281":{name:"(anonymous_281)",decl:{start:{line:4543,column:14},end:{line:4543,column:15}},loc:{start:{line:4543,column:40},end:{line:4555,column:9}},line:4543},"282":{name:"(anonymous_282)",decl:{start:{line:4568,column:28},end:{line:4568,column:29}},loc:{start:{line:4568,column:42},end:{line:4580,column:9}},line:4568},"283":{name:"(anonymous_283)",decl:{start:{line:4594,column:19},end:{line:4594,column:20}},loc:{start:{line:4594,column:80},end:{line:4627,column:9}},line:4594},"284":{name:"(anonymous_284)",decl:{start:{line:4642,column:24},end:{line:4642,column:25}},loc:{start:{line:4642,column:96},end:{line:4682,column:9}},line:4642},"285":{name:"(anonymous_285)",decl:{start:{line:4693,column:21},end:{line:4693,column:22}},loc:{start:{line:4693,column:48},end:{line:4716,column:9}},line:4693},"286":{name:"(anonymous_286)",decl:{start:{line:4737,column:26},end:{line:4737,column:27}},loc:{start:{line:4737,column:57},end:{line:4769,column:9}},line:4737},"287":{name:"(anonymous_287)",decl:{start:{line:4782,column:28},end:{line:4782,column:29}},loc:{start:{line:4782,column:88},end:{line:4801,column:9}},line:4782},"288":{name:"(anonymous_288)",decl:{start:{line:4813,column:30},end:{line:4813,column:31}},loc:{start:{line:4813,column:62},end:{line:4834,column:9}},line:4813},"289":{name:"(anonymous_289)",decl:{start:{line:4845,column:24},end:{line:4845,column:25}},loc:{start:{line:4845,column:44},end:{line:4867,column:9}},line:4845},"290":{name:"(anonymous_290)",decl:{start:{line:4882,column:29},end:{line:4882,column:30}},loc:{start:{line:4882,column:57},end:{line:4916,column:9}},line:4882},"291":{name:"(anonymous_291)",decl:{start:{line:4928,column:31},end:{line:4928,column:32}},loc:{start:{line:4928,column:88},end:{line:4946,column:9}},line:4928},"292":{name:"(anonymous_292)",decl:{start:{line:4957,column:33},end:{line:4957,column:34}},loc:{start:{line:4957,column:58},end:{line:4977,column:9}},line:4957},"293":{name:"(anonymous_293)",decl:{start:{line:4989,column:22},end:{line:4989,column:23}},loc:{start:{line:4989,column:64},end:{line:5059,column:9}},line:4989},"294":{name:"(anonymous_294)",decl:{start:{line:5068,column:22},end:{line:5068,column:23}},loc:{start:{line:5068,column:33},end:{line:5077,column:9}},line:5068},"295":{name:"(anonymous_295)",decl:{start:{line:5101,column:15},end:{line:5101,column:16}},loc:{start:{line:5101,column:34},end:{line:5125,column:9}},line:5101},"296":{name:"(anonymous_296)",decl:{start:{line:5112,column:110},end:{line:5112,column:111}},loc:{start:{line:5112,column:134},end:{line:5124,column:13}},line:5112},"297":{name:"(anonymous_297)",decl:{start:{line:5153,column:13},end:{line:5153,column:14}},loc:{start:{line:5153,column:38},end:{line:5168,column:9}},line:5153},"298":{name:"(anonymous_298)",decl:{start:{line:5160,column:23},end:{line:5160,column:24}},loc:{start:{line:5160,column:44},end:{line:5167,column:13}},line:5160},"299":{name:"(anonymous_299)",decl:{start:{line:5224,column:14},end:{line:5224,column:15}},loc:{start:{line:5224,column:47},end:{line:5270,column:9}},line:5224},"300":{name:"(anonymous_300)",decl:{start:{line:5279,column:22},end:{line:5279,column:23}},loc:{start:{line:5279,column:33},end:{line:5281,column:9}},line:5279},"301":{name:"(anonymous_301)",decl:{start:{line:5290,column:27},end:{line:5290,column:28}},loc:{start:{line:5290,column:38},end:{line:5292,column:9}},line:5290},"302":{name:"(anonymous_302)",decl:{start:{line:5302,column:20},end:{line:5302,column:21}},loc:{start:{line:5302,column:31},end:{line:5304,column:9}},line:5302},"303":{name:"(anonymous_303)",decl:{start:{line:5316,column:21},end:{line:5316,column:22}},loc:{start:{line:5316,column:36},end:{line:5318,column:9}},line:5316},"304":{name:"(anonymous_304)",decl:{start:{line:5330,column:19},end:{line:5330,column:20}},loc:{start:{line:5330,column:30},end:{line:5348,column:9}},line:5330},"305":{name:"(anonymous_305)",decl:{start:{line:5360,column:23},end:{line:5360,column:24}},loc:{start:{line:5360,column:34},end:{line:5362,column:9}},line:5360},"306":{name:"(anonymous_306)",decl:{start:{line:5373,column:26},end:{line:5373,column:27}},loc:{start:{line:5373,column:36},end:{line:5385,column:9}},line:5373},"307":{name:"(anonymous_307)",decl:{start:{line:5396,column:30},end:{line:5396,column:31}},loc:{start:{line:5396,column:41},end:{line:5398,column:9}},line:5396},"308":{name:"(anonymous_308)",decl:{start:{line:5409,column:18},end:{line:5409,column:19}},loc:{start:{line:5409,column:38},end:{line:5411,column:9}},line:5409},"309":{name:"(anonymous_309)",decl:{start:{line:5422,column:24},end:{line:5422,column:25}},loc:{start:{line:5422,column:35},end:{line:5424,column:9}},line:5422},"310":{name:"(anonymous_310)",decl:{start:{line:5452,column:36},end:{line:5452,column:37}},loc:{start:{line:5452,column:69},end:{line:5463,column:9}},line:5452},"311":{name:"(anonymous_311)",decl:{start:{line:5484,column:21},end:{line:5484,column:22}},loc:{start:{line:5484,column:61},end:{line:5489,column:9}},line:5484},"312":{name:"(anonymous_312)",decl:{start:{line:5500,column:16},end:{line:5500,column:17}},loc:{start:{line:5500,column:27},end:{line:5502,column:9}},line:5500},"313":{name:"(anonymous_313)",decl:{start:{line:5511,column:34},end:{line:5511,column:35}},loc:{start:{line:5511,column:45},end:{line:5514,column:9}},line:5511},"314":{name:"(anonymous_314)",decl:{start:{line:5532,column:14},end:{line:5532,column:15}},loc:{start:{line:5532,column:25},end:{line:5534,column:9}},line:5532},"315":{name:"(anonymous_315)",decl:{start:{line:5554,column:14},end:{line:5554,column:15}},loc:{start:{line:5554,column:56},end:{line:5591,column:9}},line:5554},"316":{name:"(anonymous_316)",decl:{start:{line:5600,column:23},end:{line:5600,column:24}},loc:{start:{line:5600,column:34},end:{line:5602,column:9}},line:5600},"317":{name:"(anonymous_317)",decl:{start:{line:5612,column:22},end:{line:5612,column:23}},loc:{start:{line:5612,column:37},end:{line:5619,column:9}},line:5612},"318":{name:"(anonymous_318)",decl:{start:{line:5628,column:19},end:{line:5628,column:20}},loc:{start:{line:5628,column:34},end:{line:5630,column:9}},line:5628},"319":{name:"(anonymous_319)",decl:{start:{line:5644,column:16},end:{line:5644,column:17}},loc:{start:{line:5644,column:42},end:{line:5678,column:9}},line:5644},"320":{name:"(anonymous_320)",decl:{start:{line:5649,column:35},end:{line:5649,column:36}},loc:{start:{line:5649,column:46},end:{line:5649,column:48}},line:5649},"321":{name:"(anonymous_321)",decl:{start:{line:5669,column:47},end:{line:5669,column:48}},loc:{start:{line:5669,column:71},end:{line:5677,column:13}},line:5669},"322":{name:"(anonymous_322)",decl:{start:{line:5696,column:14},end:{line:5696,column:15}},loc:{start:{line:5696,column:25},end:{line:5698,column:9}},line:5696},"323":{name:"(anonymous_323)",decl:{start:{line:5712,column:14},end:{line:5712,column:15}},loc:{start:{line:5712,column:43},end:{line:5716,column:9}},line:5712},"324":{name:"(anonymous_324)",decl:{start:{line:5730,column:16},end:{line:5730,column:17}},loc:{start:{line:5730,column:49},end:{line:5752,column:9}},line:5730},"325":{name:"(anonymous_325)",decl:{start:{line:5739,column:35},end:{line:5739,column:36}},loc:{start:{line:5739,column:45},end:{line:5739,column:47}},line:5739},"326":{name:"(anonymous_326)",decl:{start:{line:5743,column:84},end:{line:5743,column:85}},loc:{start:{line:5743,column:108},end:{line:5751,column:13}},line:5743},"327":{name:"(anonymous_327)",decl:{start:{line:5764,column:27},end:{line:5764,column:28}},loc:{start:{line:5764,column:43},end:{line:5767,column:9}},line:5764},"328":{name:"(anonymous_328)",decl:{start:{line:5773,column:14},end:{line:5773,column:15}},loc:{start:{line:5773,column:41},end:{line:5779,column:9}},line:5773},"329":{name:"(anonymous_329)",decl:{start:{line:5782,column:14},end:{line:5782,column:15}},loc:{start:{line:5782,column:33},end:{line:5801,column:9}},line:5782},"330":{name:"(anonymous_330)",decl:{start:{line:5783,column:35},end:{line:5783,column:36}},loc:{start:{line:5783,column:46},end:{line:5783,column:48}},line:5783},"331":{name:"(anonymous_331)",decl:{start:{line:5790,column:42},end:{line:5790,column:43}},loc:{start:{line:5790,column:65},end:{line:5800,column:13}},line:5790}},branchMap:{"0":{loc:{start:{line:26,column:15},end:{line:26,column:30}},type:"binary-expr",locations:[{start:{line:26,column:15},end:{line:26,column:22}},{start:{line:26,column:26},end:{line:26,column:30}}],line:26},"1":{loc:{start:{line:397,column:12},end:{line:400,column:13}},type:"if",locations:[{start:{line:397,column:12},end:{line:400,column:13}},{start:{line:397,column:12},end:{line:400,column:13}}],line:397},"2":{loc:{start:{line:397,column:16},end:{line:397,column:56}},type:"binary-expr",locations:[{start:{line:397,column:16},end:{line:397,column:25}},{start:{line:397,column:29},end:{line:397,column:56}}],line:397},"3":{loc:{start:{line:420,column:12},end:{line:423,column:13}},type:"if",locations:[{start:{line:420,column:12},end:{line:423,column:13}},{start:{line:420,column:12},end:{line:423,column:13}}],line:420},"4":{loc:{start:{line:420,column:16},end:{line:420,column:56}},type:"binary-expr",locations:[{start:{line:420,column:16},end:{line:420,column:25}},{start:{line:420,column:29},end:{line:420,column:56}}],line:420},"5":{loc:{start:{line:453,column:12},end:{line:456,column:13}},type:"if",locations:[{start:{line:453,column:12},end:{line:456,column:13}},{start:{line:453,column:12},end:{line:456,column:13}}],line:453},"6":{loc:{start:{line:453,column:16},end:{line:453,column:56}},type:"binary-expr",locations:[{start:{line:453,column:16},end:{line:453,column:25}},{start:{line:453,column:29},end:{line:453,column:56}}],line:453},"7":{loc:{start:{line:478,column:23},end:{line:478,column:48}},type:"binary-expr",locations:[{start:{line:478,column:23},end:{line:478,column:31}},{start:{line:478,column:35},end:{line:478,column:48}}],line:478},"8":{loc:{start:{line:482,column:16},end:{line:496,column:17}},type:"if",locations:[{start:{line:482,column:16},end:{line:496,column:17}},{start:{line:482,column:16},end:{line:496,column:17}}],line:482},"9":{loc:{start:{line:489,column:24},end:{line:494,column:25}},type:"if",locations:[{start:{line:489,column:24},end:{line:494,column:25}},{start:{line:489,column:24},end:{line:494,column:25}}],line:489},"10":{loc:{start:{line:517,column:23},end:{line:517,column:48}},type:"binary-expr",locations:[{start:{line:517,column:23},end:{line:517,column:31}},{start:{line:517,column:35},end:{line:517,column:48}}],line:517},"11":{loc:{start:{line:544,column:12},end:{line:547,column:13}},type:"if",locations:[{start:{line:544,column:12},end:{line:547,column:13}},{start:{line:544,column:12},end:{line:547,column:13}}],line:544},"12":{loc:{start:{line:544,column:16},end:{line:544,column:53}},type:"binary-expr",locations:[{start:{line:544,column:16},end:{line:544,column:25}},{start:{line:544,column:29},end:{line:544,column:53}}],line:544},"13":{loc:{start:{line:549,column:23},end:{line:549,column:48}},type:"binary-expr",locations:[{start:{line:549,column:23},end:{line:549,column:31}},{start:{line:549,column:35},end:{line:549,column:48}}],line:549},"14":{loc:{start:{line:550,column:21},end:{line:550,column:33}},type:"binary-expr",locations:[{start:{line:550,column:21},end:{line:550,column:27}},{start:{line:550,column:31},end:{line:550,column:33}}],line:550},"15":{loc:{start:{line:555,column:16},end:{line:560,column:17}},type:"if",locations:[{start:{line:555,column:16},end:{line:560,column:17}},{start:{line:555,column:16},end:{line:560,column:17}}],line:555},"16":{loc:{start:{line:581,column:12},end:{line:584,column:13}},type:"if",locations:[{start:{line:581,column:12},end:{line:584,column:13}},{start:{line:581,column:12},end:{line:584,column:13}}],line:581},"17":{loc:{start:{line:581,column:16},end:{line:581,column:52}},type:"binary-expr",locations:[{start:{line:581,column:16},end:{line:581,column:25}},{start:{line:581,column:29},end:{line:581,column:52}}],line:581},"18":{loc:{start:{line:586,column:23},end:{line:586,column:48}},type:"binary-expr",locations:[{start:{line:586,column:23},end:{line:586,column:31}},{start:{line:586,column:35},end:{line:586,column:48}}],line:586},"19":{loc:{start:{line:588,column:23},end:{line:588,column:34}},type:"binary-expr",locations:[{start:{line:588,column:23},end:{line:588,column:28}},{start:{line:588,column:32},end:{line:588,column:34}}],line:588},"20":{loc:{start:{line:593,column:16},end:{line:599,column:17}},type:"if",locations:[{start:{line:593,column:16},end:{line:599,column:17}},{start:{line:593,column:16},end:{line:599,column:17}}],line:593},"21":{loc:{start:{line:597,column:35},end:{line:597,column:54}},type:"binary-expr",locations:[{start:{line:597,column:35},end:{line:597,column:48}},{start:{line:597,column:52},end:{line:597,column:54}}],line:597},"22":{loc:{start:{line:598,column:35},end:{line:598,column:48}},type:"binary-expr",locations:[{start:{line:598,column:35},end:{line:598,column:42}},{start:{line:598,column:46},end:{line:598,column:48}}],line:598},"23":{loc:{start:{line:625,column:12},end:{line:628,column:13}},type:"if",locations:[{start:{line:625,column:12},end:{line:628,column:13}},{start:{line:625,column:12},end:{line:628,column:13}}],line:625},"24":{loc:{start:{line:625,column:16},end:{line:625,column:53}},type:"binary-expr",locations:[{start:{line:625,column:16},end:{line:625,column:25}},{start:{line:625,column:29},end:{line:625,column:53}}],line:625},"25":{loc:{start:{line:630,column:23},end:{line:630,column:48}},type:"binary-expr",locations:[{start:{line:630,column:23},end:{line:630,column:31}},{start:{line:630,column:35},end:{line:630,column:48}}],line:630},"26":{loc:{start:{line:631,column:21},end:{line:631,column:33}},type:"binary-expr",locations:[{start:{line:631,column:21},end:{line:631,column:27}},{start:{line:631,column:31},end:{line:631,column:33}}],line:631},"27":{loc:{start:{line:634,column:12},end:{line:636,column:13}},type:"if",locations:[{start:{line:634,column:12},end:{line:636,column:13}},{start:{line:634,column:12},end:{line:636,column:13}}],line:634},"28":{loc:{start:{line:653,column:20},end:{line:658,column:21}},type:"if",locations:[{start:{line:653,column:20},end:{line:658,column:21}},{start:{line:653,column:20},end:{line:658,column:21}}],line:653},"29":{loc:{start:{line:686,column:12},end:{line:688,column:13}},type:"if",locations:[{start:{line:686,column:12},end:{line:688,column:13}},{start:{line:686,column:12},end:{line:688,column:13}}],line:686},"30":{loc:{start:{line:690,column:12},end:{line:692,column:13}},type:"if",locations:[{start:{line:690,column:12},end:{line:692,column:13}},{start:{line:690,column:12},end:{line:692,column:13}}],line:690},"31":{loc:{start:{line:726,column:12},end:{line:728,column:13}},type:"if",locations:[{start:{line:726,column:12},end:{line:728,column:13}},{start:{line:726,column:12},end:{line:728,column:13}}],line:726},"32":{loc:{start:{line:742,column:12},end:{line:744,column:13}},type:"if",locations:[{start:{line:742,column:12},end:{line:744,column:13}},{start:{line:742,column:12},end:{line:744,column:13}}],line:742},"33":{loc:{start:{line:773,column:12},end:{line:775,column:13}},type:"if",locations:[{start:{line:773,column:12},end:{line:775,column:13}},{start:{line:773,column:12},end:{line:775,column:13}}],line:773},"34":{loc:{start:{line:805,column:12},end:{line:807,column:13}},type:"if",locations:[{start:{line:805,column:12},end:{line:807,column:13}},{start:{line:805,column:12},end:{line:807,column:13}}],line:805},"35":{loc:{start:{line:878,column:31},end:{line:878,column:47}},type:"binary-expr",locations:[{start:{line:878,column:31},end:{line:878,column:41}},{start:{line:878,column:45},end:{line:878,column:47}}],line:878},"36":{loc:{start:{line:879,column:26},end:{line:879,column:42}},type:"binary-expr",locations:[{start:{line:879,column:26},end:{line:879,column:36}},{start:{line:879,column:40},end:{line:879,column:42}}],line:879},"37":{loc:{start:{line:988,column:25},end:{line:988,column:79}},type:"cond-expr",locations:[{start:{line:988,column:53},end:{line:988,column:66}},{start:{line:988,column:69},end:{line:988,column:79}}],line:988},"38":{loc:{start:{line:992,column:25},end:{line:997,column:13}},type:"binary-expr",locations:[{start:{line:992,column:25},end:{line:992,column:35}},{start:{line:992,column:39},end:{line:997,column:13}}],line:992},"39":{loc:{start:{line:1002,column:31},end:{line:1002,column:57}},type:"binary-expr",locations:[{start:{line:1002,column:31},end:{line:1002,column:49}},{start:{line:1002,column:55},end:{line:1002,column:57}}],line:1002},"40":{loc:{start:{line:1003,column:31},end:{line:1003,column:73}},type:"binary-expr",locations:[{start:{line:1003,column:31},end:{line:1003,column:48}},{start:{line:1003,column:55},end:{line:1003,column:67}},{start:{line:1003,column:71},end:{line:1003,column:73}}],line:1003},"41":{loc:{start:{line:1004,column:31},end:{line:1004,column:57}},type:"binary-expr",locations:[{start:{line:1004,column:31},end:{line:1004,column:45}},{start:{line:1004,column:55},end:{line:1004,column:57}}],line:1004},"42":{loc:{start:{line:1005,column:31},end:{line:1005,column:57}},type:"binary-expr",locations:[{start:{line:1005,column:31},end:{line:1005,column:47}},{start:{line:1005,column:55},end:{line:1005,column:57}}],line:1005},"43":{loc:{start:{line:1006,column:31},end:{line:1006,column:59}},type:"binary-expr",locations:[{start:{line:1006,column:31},end:{line:1006,column:48}},{start:{line:1006,column:55},end:{line:1006,column:59}}],line:1006},"44":{loc:{start:{line:1007,column:31},end:{line:1007,column:59}},type:"binary-expr",locations:[{start:{line:1007,column:31},end:{line:1007,column:49}},{start:{line:1007,column:55},end:{line:1007,column:59}}],line:1007},"45":{loc:{start:{line:1008,column:31},end:{line:1008,column:59}},type:"binary-expr",locations:[{start:{line:1008,column:31},end:{line:1008,column:51}},{start:{line:1008,column:55},end:{line:1008,column:59}}],line:1008},"46":{loc:{start:{line:1096,column:12},end:{line:1099,column:13}},type:"if",locations:[{start:{line:1096,column:12},end:{line:1099,column:13}},{start:{line:1096,column:12},end:{line:1099,column:13}}],line:1096},"47":{loc:{start:{line:1096,column:16},end:{line:1096,column:54}},type:"binary-expr",locations:[{start:{line:1096,column:16},end:{line:1096,column:25}},{start:{line:1096,column:29},end:{line:1096,column:54}}],line:1096},"48":{loc:{start:{line:1100,column:23},end:{line:1100,column:48}},type:"binary-expr",locations:[{start:{line:1100,column:23},end:{line:1100,column:31}},{start:{line:1100,column:35},end:{line:1100,column:48}}],line:1100},"49":{loc:{start:{line:1102,column:22},end:{line:1102,column:35}},type:"binary-expr",locations:[{start:{line:1102,column:22},end:{line:1102,column:29}},{start:{line:1102,column:33},end:{line:1102,column:35}}],line:1102},"50":{loc:{start:{line:1106,column:16},end:{line:1112,column:17}},type:"if",locations:[{start:{line:1106,column:16},end:{line:1112,column:17}},{start:{line:1106,column:16},end:{line:1112,column:17}}],line:1106},"51":{loc:{start:{line:1110,column:31},end:{line:1110,column:73}},type:"cond-expr",locations:[{start:{line:1110,column:47},end:{line:1110,column:66}},{start:{line:1110,column:69},end:{line:1110,column:73}}],line:1110},"52":{loc:{start:{line:1125,column:23},end:{line:1125,column:48}},type:"binary-expr",locations:[{start:{line:1125,column:23},end:{line:1125,column:31}},{start:{line:1125,column:35},end:{line:1125,column:48}}],line:1125},"53":{loc:{start:{line:1143,column:23},end:{line:1143,column:48}},type:"binary-expr",locations:[{start:{line:1143,column:23},end:{line:1143,column:31}},{start:{line:1143,column:35},end:{line:1143,column:48}}],line:1143},"54":{loc:{start:{line:1145,column:12},end:{line:1147,column:13}},type:"if",locations:[{start:{line:1145,column:12},end:{line:1147,column:13}},{start:{line:1145,column:12},end:{line:1147,column:13}}],line:1145},"55":{loc:{start:{line:1151,column:16},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1151,column:16},end:{line:1167,column:17}},{start:{line:1151,column:16},end:{line:1167,column:17}}],line:1151},"56":{loc:{start:{line:1151,column:20},end:{line:1151,column:47}},type:"binary-expr",locations:[{start:{line:1151,column:20},end:{line:1151,column:24}},{start:{line:1151,column:28},end:{line:1151,column:47}}],line:1151},"57":{loc:{start:{line:1155,column:21},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1155,column:21},end:{line:1167,column:17}},{start:{line:1155,column:21},end:{line:1167,column:17}}],line:1155},"58":{loc:{start:{line:1155,column:25},end:{line:1155,column:51}},type:"binary-expr",locations:[{start:{line:1155,column:25},end:{line:1155,column:29}},{start:{line:1155,column:33},end:{line:1155,column:51}}],line:1155},"59":{loc:{start:{line:1157,column:24},end:{line:1162,column:25}},type:"if",locations:[{start:{line:1157,column:24},end:{line:1162,column:25}},{start:{line:1157,column:24},end:{line:1162,column:25}}],line:1157},"60":{loc:{start:{line:1182,column:23},end:{line:1182,column:48}},type:"binary-expr",locations:[{start:{line:1182,column:23},end:{line:1182,column:31}},{start:{line:1182,column:35},end:{line:1182,column:48}}],line:1182},"61":{loc:{start:{line:1186,column:16},end:{line:1191,column:17}},type:"if",locations:[{start:{line:1186,column:16},end:{line:1191,column:17}},{start:{line:1186,column:16},end:{line:1191,column:17}}],line:1186},"62":{loc:{start:{line:1204,column:23},end:{line:1204,column:48}},type:"binary-expr",locations:[{start:{line:1204,column:23},end:{line:1204,column:31}},{start:{line:1204,column:35},end:{line:1204,column:48}}],line:1204},"63":{loc:{start:{line:1208,column:16},end:{line:1213,column:17}},type:"if",locations:[{start:{line:1208,column:16},end:{line:1213,column:17}},{start:{line:1208,column:16},end:{line:1213,column:17}}],line:1208},"64":{loc:{start:{line:1226,column:23},end:{line:1226,column:48}},type:"binary-expr",locations:[{start:{line:1226,column:23},end:{line:1226,column:31}},{start:{line:1226,column:35},end:{line:1226,column:48}}],line:1226},"65":{loc:{start:{line:1230,column:16},end:{line:1235,column:17}},type:"if",locations:[{start:{line:1230,column:16},end:{line:1235,column:17}},{start:{line:1230,column:16},end:{line:1235,column:17}}],line:1230},"66":{loc:{start:{line:1318,column:37},end:{line:1318,column:59}},type:"binary-expr",locations:[{start:{line:1318,column:37},end:{line:1318,column:53}},{start:{line:1318,column:57},end:{line:1318,column:59}}],line:1318},"67":{loc:{start:{line:1325,column:16},end:{line:1330,column:17}},type:"if",locations:[{start:{line:1325,column:16},end:{line:1330,column:17}},{start:{line:1325,column:16},end:{line:1330,column:17}}],line:1325},"68":{loc:{start:{line:1334,column:35},end:{line:1334,column:61}},type:"binary-expr",locations:[{start:{line:1334,column:35},end:{line:1334,column:52}},{start:{line:1334,column:59},end:{line:1334,column:61}}],line:1334},"69":{loc:{start:{line:1335,column:35},end:{line:1335,column:61}},type:"binary-expr",locations:[{start:{line:1335,column:35},end:{line:1335,column:51}},{start:{line:1335,column:59},end:{line:1335,column:61}}],line:1335},"70":{loc:{start:{line:1336,column:35},end:{line:1336,column:63}},type:"binary-expr",locations:[{start:{line:1336,column:35},end:{line:1336,column:53}},{start:{line:1336,column:59},end:{line:1336,column:63}}],line:1336},"71":{loc:{start:{line:1389,column:12},end:{line:1392,column:13}},type:"if",locations:[{start:{line:1389,column:12},end:{line:1392,column:13}},{start:{line:1389,column:12},end:{line:1392,column:13}}],line:1389},"72":{loc:{start:{line:1389,column:16},end:{line:1389,column:54}},type:"binary-expr",locations:[{start:{line:1389,column:16},end:{line:1389,column:25}},{start:{line:1389,column:29},end:{line:1389,column:54}}],line:1389},"73":{loc:{start:{line:1393,column:23},end:{line:1393,column:48}},type:"binary-expr",locations:[{start:{line:1393,column:23},end:{line:1393,column:31}},{start:{line:1393,column:35},end:{line:1393,column:48}}],line:1393},"74":{loc:{start:{line:1395,column:22},end:{line:1395,column:35}},type:"binary-expr",locations:[{start:{line:1395,column:22},end:{line:1395,column:29}},{start:{line:1395,column:33},end:{line:1395,column:35}}],line:1395},"75":{loc:{start:{line:1396,column:12},end:{line:1398,column:13}},type:"if",locations:[{start:{line:1396,column:12},end:{line:1398,column:13}},{start:{line:1396,column:12},end:{line:1398,column:13}}],line:1396},"76":{loc:{start:{line:1402,column:16},end:{line:1408,column:17}},type:"if",locations:[{start:{line:1402,column:16},end:{line:1408,column:17}},{start:{line:1402,column:16},end:{line:1408,column:17}}],line:1402},"77":{loc:{start:{line:1415,column:22},end:{line:1415,column:35}},type:"binary-expr",locations:[{start:{line:1415,column:22},end:{line:1415,column:29}},{start:{line:1415,column:33},end:{line:1415,column:35}}],line:1415},"78":{loc:{start:{line:1416,column:12},end:{line:1418,column:13}},type:"if",locations:[{start:{line:1416,column:12},end:{line:1418,column:13}},{start:{line:1416,column:12},end:{line:1418,column:13}}],line:1416},"79":{loc:{start:{line:1449,column:12},end:{line:1451,column:13}},type:"if",locations:[{start:{line:1449,column:12},end:{line:1451,column:13}},{start:{line:1449,column:12},end:{line:1451,column:13}}],line:1449},"80":{loc:{start:{line:1453,column:12},end:{line:1455,column:13}},type:"if",locations:[{start:{line:1453,column:12},end:{line:1455,column:13}},{start:{line:1453,column:12},end:{line:1455,column:13}}],line:1453},"81":{loc:{start:{line:1457,column:12},end:{line:1459,column:13}},type:"if",locations:[{start:{line:1457,column:12},end:{line:1459,column:13}},{start:{line:1457,column:12},end:{line:1459,column:13}}],line:1457},"82":{loc:{start:{line:1457,column:16},end:{line:1457,column:79}},type:"binary-expr",locations:[{start:{line:1457,column:16},end:{line:1457,column:25}},{start:{line:1457,column:30},end:{line:1457,column:51}},{start:{line:1457,column:55},end:{line:1457,column:78}}],line:1457},"83":{loc:{start:{line:1462,column:12},end:{line:1504,column:13}},type:"if",locations:[{start:{line:1462,column:12},end:{line:1504,column:13}},{start:{line:1462,column:12},end:{line:1504,column:13}}],line:1462},"84":{loc:{start:{line:1465,column:16},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1465,column:16},end:{line:1500,column:17}},{start:{line:1465,column:16},end:{line:1500,column:17}}],line:1465},"85":{loc:{start:{line:1465,column:20},end:{line:1465,column:55}},type:"binary-expr",locations:[{start:{line:1465,column:20},end:{line:1465,column:41}},{start:{line:1465,column:45},end:{line:1465,column:55}}],line:1465},"86":{loc:{start:{line:1472,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1472,column:21},end:{line:1500,column:17}},{start:{line:1472,column:21},end:{line:1500,column:17}}],line:1472},"87":{loc:{start:{line:1472,column:25},end:{line:1472,column:59}},type:"binary-expr",locations:[{start:{line:1472,column:25},end:{line:1472,column:46}},{start:{line:1472,column:50},end:{line:1472,column:59}}],line:1472},"88":{loc:{start:{line:1477,column:20},end:{line:1482,column:21}},type:"if",locations:[{start:{line:1477,column:20},end:{line:1482,column:21}},{start:{line:1477,column:20},end:{line:1482,column:21}}],line:1477},"89":{loc:{start:{line:1484,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1484,column:21},end:{line:1500,column:17}},{start:{line:1484,column:21},end:{line:1500,column:17}}],line:1484},"90":{loc:{start:{line:1484,column:25},end:{line:1484,column:58}},type:"binary-expr",locations:[{start:{line:1484,column:25},end:{line:1484,column:44}},{start:{line:1484,column:48},end:{line:1484,column:58}}],line:1484},"91":{loc:{start:{line:1496,column:24},end:{line:1498,column:25}},type:"if",locations:[{start:{line:1496,column:24},end:{line:1498,column:25}},{start:{line:1496,column:24},end:{line:1498,column:25}}],line:1496},"92":{loc:{start:{line:1525,column:23},end:{line:1525,column:48}},type:"binary-expr",locations:[{start:{line:1525,column:23},end:{line:1525,column:31}},{start:{line:1525,column:35},end:{line:1525,column:48}}],line:1525},"93":{loc:{start:{line:1528,column:16},end:{line:1553,column:17}},type:"if",locations:[{start:{line:1528,column:16},end:{line:1553,column:17}},{start:{line:1528,column:16},end:{line:1553,column:17}}],line:1528},"94":{loc:{start:{line:1533,column:20},end:{line:1535,column:21}},type:"if",locations:[{start:{line:1533,column:20},end:{line:1535,column:21}},{start:{line:1533,column:20},end:{line:1535,column:21}}],line:1533},"95":{loc:{start:{line:1540,column:20},end:{line:1552,column:21}},type:"if",locations:[{start:{line:1540,column:20},end:{line:1552,column:21}},{start:{line:1540,column:20},end:{line:1552,column:21}}],line:1540},"96":{loc:{start:{line:1542,column:28},end:{line:1547,column:29}},type:"if",locations:[{start:{line:1542,column:28},end:{line:1547,column:29}},{start:{line:1542,column:28},end:{line:1547,column:29}}],line:1542},"97":{loc:{start:{line:1575,column:23},end:{line:1575,column:48}},type:"binary-expr",locations:[{start:{line:1575,column:23},end:{line:1575,column:31}},{start:{line:1575,column:35},end:{line:1575,column:48}}],line:1575},"98":{loc:{start:{line:1637,column:19},end:{line:1637,column:77}},type:"binary-expr",locations:[{start:{line:1637,column:19},end:{line:1637,column:72}},{start:{line:1637,column:76},end:{line:1637,column:77}}],line:1637},"99":{loc:{start:{line:1657,column:23},end:{line:1657,column:48}},type:"binary-expr",locations:[{start:{line:1657,column:23},end:{line:1657,column:31}},{start:{line:1657,column:35},end:{line:1657,column:48}}],line:1657},"100":{loc:{start:{line:1689,column:12},end:{line:1692,column:13}},type:"if",locations:[{start:{line:1689,column:12},end:{line:1692,column:13}},{start:{line:1689,column:12},end:{line:1692,column:13}}],line:1689},"101":{loc:{start:{line:1689,column:16},end:{line:1689,column:54}},type:"binary-expr",locations:[{start:{line:1689,column:16},end:{line:1689,column:25}},{start:{line:1689,column:29},end:{line:1689,column:54}}],line:1689},"102":{loc:{start:{line:1694,column:23},end:{line:1694,column:48}},type:"binary-expr",locations:[{start:{line:1694,column:23},end:{line:1694,column:31}},{start:{line:1694,column:35},end:{line:1694,column:48}}],line:1694},"103":{loc:{start:{line:1695,column:22},end:{line:1695,column:35}},type:"binary-expr",locations:[{start:{line:1695,column:22},end:{line:1695,column:29}},{start:{line:1695,column:33},end:{line:1695,column:35}}],line:1695},"104":{loc:{start:{line:1699,column:16},end:{line:1702,column:17}},type:"if",locations:[{start:{line:1699,column:16},end:{line:1702,column:17}},{start:{line:1699,column:16},end:{line:1702,column:17}}],line:1699},"105":{loc:{start:{line:1749,column:12},end:{line:1752,column:13}},type:"if",locations:[{start:{line:1749,column:12},end:{line:1752,column:13}},{start:{line:1749,column:12},end:{line:1752,column:13}}],line:1749},"106":{loc:{start:{line:1749,column:16},end:{line:1749,column:54}},type:"binary-expr",locations:[{start:{line:1749,column:16},end:{line:1749,column:25}},{start:{line:1749,column:29},end:{line:1749,column:54}}],line:1749},"107":{loc:{start:{line:1754,column:23},end:{line:1754,column:48}},type:"binary-expr",locations:[{start:{line:1754,column:23},end:{line:1754,column:31}},{start:{line:1754,column:35},end:{line:1754,column:48}}],line:1754},"108":{loc:{start:{line:1755,column:22},end:{line:1755,column:35}},type:"binary-expr",locations:[{start:{line:1755,column:22},end:{line:1755,column:29}},{start:{line:1755,column:33},end:{line:1755,column:35}}],line:1755},"109":{loc:{start:{line:1759,column:16},end:{line:1762,column:17}},type:"if",locations:[{start:{line:1759,column:16},end:{line:1762,column:17}},{start:{line:1759,column:16},end:{line:1762,column:17}}],line:1759},"110":{loc:{start:{line:1765,column:27},end:{line:1765,column:52}},type:"binary-expr",locations:[{start:{line:1765,column:27},end:{line:1765,column:46}},{start:{line:1765,column:50},end:{line:1765,column:52}}],line:1765},"111":{loc:{start:{line:1795,column:23},end:{line:1795,column:48}},type:"binary-expr",locations:[{start:{line:1795,column:23},end:{line:1795,column:31}},{start:{line:1795,column:35},end:{line:1795,column:48}}],line:1795},"112":{loc:{start:{line:1816,column:21},end:{line:1816,column:33}},type:"binary-expr",locations:[{start:{line:1816,column:21},end:{line:1816,column:27}},{start:{line:1816,column:31},end:{line:1816,column:33}}],line:1816},"113":{loc:{start:{line:1818,column:12},end:{line:1841,column:13}},type:"if",locations:[{start:{line:1818,column:12},end:{line:1841,column:13}},{start:{line:1818,column:12},end:{line:1841,column:13}}],line:1818},"114":{loc:{start:{line:1821,column:20},end:{line:1834,column:21}},type:"if",locations:[{start:{line:1821,column:20},end:{line:1834,column:21}},{start:{line:1821,column:20},end:{line:1834,column:21}}],line:1821},"115":{loc:{start:{line:1827,column:28},end:{line:1832,column:29}},type:"if",locations:[{start:{line:1827,column:28},end:{line:1832,column:29}},{start:{line:1827,column:28},end:{line:1832,column:29}}],line:1827},"116":{loc:{start:{line:2021,column:19},end:{line:2021,column:50}},type:"binary-expr",locations:[{start:{line:2021,column:19},end:{line:2021,column:44}},{start:{line:2021,column:48},end:{line:2021,column:50}}],line:2021},"117":{loc:{start:{line:2031,column:19},end:{line:2031,column:55}},type:"binary-expr",locations:[{start:{line:2031,column:19},end:{line:2031,column:47}},{start:{line:2031,column:51},end:{line:2031,column:55}}],line:2031},"118":{loc:{start:{line:2057,column:19},end:{line:2057,column:69}},type:"binary-expr",locations:[{start:{line:2057,column:19},end:{line:2057,column:61}},{start:{line:2057,column:65},end:{line:2057,column:69}}],line:2057},"119":{loc:{start:{line:2067,column:19},end:{line:2067,column:61}},type:"binary-expr",locations:[{start:{line:2067,column:19},end:{line:2067,column:53}},{start:{line:2067,column:57},end:{line:2067,column:61}}],line:2067},"120":{loc:{start:{line:2078,column:19},end:{line:2078,column:65}},type:"binary-expr",locations:[{start:{line:2078,column:19},end:{line:2078,column:59}},{start:{line:2078,column:63},end:{line:2078,column:65}}],line:2078},"121":{loc:{start:{line:2088,column:19},end:{line:2088,column:48}},type:"binary-expr",locations:[{start:{line:2088,column:19},end:{line:2088,column:40}},{start:{line:2088,column:44},end:{line:2088,column:48}}],line:2088},"122":{loc:{start:{line:2098,column:19},end:{line:2098,column:57}},type:"binary-expr",locations:[{start:{line:2098,column:19},end:{line:2098,column:49}},{start:{line:2098,column:53},end:{line:2098,column:57}}],line:2098},"123":{loc:{start:{line:2110,column:19},end:{line:2110,column:66}},type:"binary-expr",locations:[{start:{line:2110,column:19},end:{line:2110,column:58}},{start:{line:2110,column:62},end:{line:2110,column:66}}],line:2110},"124":{loc:{start:{line:2122,column:19},end:{line:2122,column:73}},type:"binary-expr",locations:[{start:{line:2122,column:19},end:{line:2122,column:67}},{start:{line:2122,column:71},end:{line:2122,column:73}}],line:2122},"125":{loc:{start:{line:2173,column:19},end:{line:2173,column:77}},type:"binary-expr",locations:[{start:{line:2173,column:19},end:{line:2173,column:72}},{start:{line:2173,column:76},end:{line:2173,column:77}}],line:2173},"126":{loc:{start:{line:2194,column:12},end:{line:2197,column:13}},type:"if",locations:[{start:{line:2194,column:12},end:{line:2197,column:13}},{start:{line:2194,column:12},end:{line:2197,column:13}}],line:2194},"127":{loc:{start:{line:2194,column:16},end:{line:2194,column:54}},type:"binary-expr",locations:[{start:{line:2194,column:16},end:{line:2194,column:25}},{start:{line:2194,column:29},end:{line:2194,column:54}}],line:2194},"128":{loc:{start:{line:2199,column:23},end:{line:2199,column:48}},type:"binary-expr",locations:[{start:{line:2199,column:23},end:{line:2199,column:31}},{start:{line:2199,column:35},end:{line:2199,column:48}}],line:2199},"129":{loc:{start:{line:2200,column:22},end:{line:2200,column:35}},type:"binary-expr",locations:[{start:{line:2200,column:22},end:{line:2200,column:29}},{start:{line:2200,column:33},end:{line:2200,column:35}}],line:2200},"130":{loc:{start:{line:2204,column:16},end:{line:2207,column:17}},type:"if",locations:[{start:{line:2204,column:16},end:{line:2207,column:17}},{start:{line:2204,column:16},end:{line:2207,column:17}}],line:2204},"131":{loc:{start:{line:2210,column:27},end:{line:2210,column:52}},type:"binary-expr",locations:[{start:{line:2210,column:27},end:{line:2210,column:46}},{start:{line:2210,column:50},end:{line:2210,column:52}}],line:2210},"132":{loc:{start:{line:2368,column:23},end:{line:2368,column:48}},type:"binary-expr",locations:[{start:{line:2368,column:23},end:{line:2368,column:31}},{start:{line:2368,column:35},end:{line:2368,column:48}}],line:2368},"133":{loc:{start:{line:2372,column:16},end:{line:2377,column:17}},type:"if",locations:[{start:{line:2372,column:16},end:{line:2377,column:17}},{start:{line:2372,column:16},end:{line:2377,column:17}}],line:2372},"134":{loc:{start:{line:2397,column:23},end:{line:2397,column:48}},type:"binary-expr",locations:[{start:{line:2397,column:23},end:{line:2397,column:31}},{start:{line:2397,column:35},end:{line:2397,column:48}}],line:2397},"135":{loc:{start:{line:2401,column:16},end:{line:2406,column:17}},type:"if",locations:[{start:{line:2401,column:16},end:{line:2406,column:17}},{start:{line:2401,column:16},end:{line:2406,column:17}}],line:2401},"136":{loc:{start:{line:2593,column:23},end:{line:2593,column:48}},type:"binary-expr",locations:[{start:{line:2593,column:23},end:{line:2593,column:31}},{start:{line:2593,column:35},end:{line:2593,column:48}}],line:2593},"137":{loc:{start:{line:2597,column:16},end:{line:2613,column:17}},type:"if",locations:[{start:{line:2597,column:16},end:{line:2613,column:17}},{start:{line:2597,column:16},end:{line:2613,column:17}}],line:2597},"138":{loc:{start:{line:2606,column:24},end:{line:2611,column:25}},type:"if",locations:[{start:{line:2606,column:24},end:{line:2611,column:25}},{start:{line:2606,column:24},end:{line:2611,column:25}}],line:2606},"139":{loc:{start:{line:2767,column:12},end:{line:2770,column:13}},type:"if",locations:[{start:{line:2767,column:12},end:{line:2770,column:13}},{start:{line:2767,column:12},end:{line:2770,column:13}}],line:2767},"140":{loc:{start:{line:2767,column:16},end:{line:2767,column:53}},type:"binary-expr",locations:[{start:{line:2767,column:16},end:{line:2767,column:25}},{start:{line:2767,column:29},end:{line:2767,column:53}}],line:2767},"141":{loc:{start:{line:2772,column:23},end:{line:2772,column:48}},type:"binary-expr",locations:[{start:{line:2772,column:23},end:{line:2772,column:31}},{start:{line:2772,column:35},end:{line:2772,column:48}}],line:2772},"142":{loc:{start:{line:2773,column:21},end:{line:2773,column:33}},type:"binary-expr",locations:[{start:{line:2773,column:21},end:{line:2773,column:27}},{start:{line:2773,column:31},end:{line:2773,column:33}}],line:2773},"143":{loc:{start:{line:2785,column:12},end:{line:2790,column:13}},type:"if",locations:[{start:{line:2785,column:12},end:{line:2790,column:13}},{start:{line:2785,column:12},end:{line:2790,column:13}}],line:2785},"144":{loc:{start:{line:2862,column:12},end:{line:2866,column:13}},type:"if",locations:[{start:{line:2862,column:12},end:{line:2866,column:13}},{start:{line:2862,column:12},end:{line:2866,column:13}}],line:2862},"145":{loc:{start:{line:2862,column:16},end:{line:2862,column:77}},type:"binary-expr",locations:[{start:{line:2862,column:16},end:{line:2862,column:36}},{start:{line:2862,column:40},end:{line:2862,column:64}},{start:{line:2862,column:68},end:{line:2862,column:77}}],line:2862},"146":{loc:{start:{line:2868,column:21},end:{line:2868,column:33}},type:"binary-expr",locations:[{start:{line:2868,column:21},end:{line:2868,column:27}},{start:{line:2868,column:31},end:{line:2868,column:33}}],line:2868},"147":{loc:{start:{line:2890,column:23},end:{line:2890,column:67}},type:"cond-expr",locations:[{start:{line:2890,column:49},end:{line:2890,column:55}},{start:{line:2890,column:58},end:{line:2890,column:67}}],line:2890},"148":{loc:{start:{line:3001,column:12},end:{line:3005,column:13}},type:"if",locations:[{start:{line:3001,column:12},end:{line:3005,column:13}},{start:{line:3001,column:12},end:{line:3005,column:13}}],line:3001},"149":{loc:{start:{line:3001,column:16},end:{line:3001,column:83}},type:"binary-expr",locations:[{start:{line:3001,column:16},end:{line:3001,column:42}},{start:{line:3001,column:46},end:{line:3001,column:70}},{start:{line:3001,column:74},end:{line:3001,column:83}}],line:3001},"150":{loc:{start:{line:3007,column:12},end:{line:3010,column:13}},type:"if",locations:[{start:{line:3007,column:12},end:{line:3010,column:13}},{start:{line:3007,column:12},end:{line:3010,column:13}}],line:3007},"151":{loc:{start:{line:3007,column:16},end:{line:3007,column:53}},type:"binary-expr",locations:[{start:{line:3007,column:16},end:{line:3007,column:40}},{start:{line:3007,column:44},end:{line:3007,column:53}}],line:3007},"152":{loc:{start:{line:3012,column:21},end:{line:3012,column:33}},type:"binary-expr",locations:[{start:{line:3012,column:21},end:{line:3012,column:27}},{start:{line:3012,column:31},end:{line:3012,column:33}}],line:3012},"153":{loc:{start:{line:3072,column:12},end:{line:3074,column:13}},type:"if",locations:[{start:{line:3072,column:12},end:{line:3074,column:13}},{start:{line:3072,column:12},end:{line:3074,column:13}}],line:3072},"154":{loc:{start:{line:3072,column:16},end:{line:3072,column:78}},type:"binary-expr",locations:[{start:{line:3072,column:16},end:{line:3072,column:26}},{start:{line:3072,column:30},end:{line:3072,column:53}},{start:{line:3072,column:57},end:{line:3072,column:78}}],line:3072},"155":{loc:{start:{line:3098,column:12},end:{line:3100,column:13}},type:"if",locations:[{start:{line:3098,column:12},end:{line:3100,column:13}},{start:{line:3098,column:12},end:{line:3100,column:13}}],line:3098},"156":{loc:{start:{line:3102,column:23},end:{line:3102,column:48}},type:"binary-expr",locations:[{start:{line:3102,column:23},end:{line:3102,column:31}},{start:{line:3102,column:35},end:{line:3102,column:48}}],line:3102},"157":{loc:{start:{line:3106,column:16},end:{line:3119,column:17}},type:"if",locations:[{start:{line:3106,column:16},end:{line:3119,column:17}},{start:{line:3106,column:16},end:{line:3119,column:17}}],line:3106},"158":{loc:{start:{line:3112,column:24},end:{line:3117,column:25}},type:"if",locations:[{start:{line:3112,column:24},end:{line:3117,column:25}},{start:{line:3112,column:24},end:{line:3117,column:25}}],line:3112},"159":{loc:{start:{line:3136,column:16},end:{line:3138,column:17}},type:"if",locations:[{start:{line:3136,column:16},end:{line:3138,column:17}},{start:{line:3136,column:16},end:{line:3138,column:17}}],line:3136},"160":{loc:{start:{line:3136,column:19},end:{line:3136,column:45}},type:"binary-expr",locations:[{start:{line:3136,column:19},end:{line:3136,column:24}},{start:{line:3136,column:28},end:{line:3136,column:45}}],line:3136},"161":{loc:{start:{line:3159,column:16},end:{line:3164,column:17}},type:"if",locations:[{start:{line:3159,column:16},end:{line:3164,column:17}},{start:{line:3159,column:16},end:{line:3164,column:17}}],line:3159},"162":{loc:{start:{line:3172,column:23},end:{line:3172,column:48}},type:"binary-expr",locations:[{start:{line:3172,column:23},end:{line:3172,column:31}},{start:{line:3172,column:35},end:{line:3172,column:48}}],line:3172},"163":{loc:{start:{line:3180,column:12},end:{line:3189,column:13}},type:"if",locations:[{start:{line:3180,column:12},end:{line:3189,column:13}},{start:{line:3180,column:12},end:{line:3189,column:13}}],line:3180},"164":{loc:{start:{line:3196,column:12},end:{line:3211,column:13}},type:"if",locations:[{start:{line:3196,column:12},end:{line:3211,column:13}},{start:{line:3196,column:12},end:{line:3211,column:13}}],line:3196},"165":{loc:{start:{line:3308,column:23},end:{line:3308,column:48}},type:"binary-expr",locations:[{start:{line:3308,column:23},end:{line:3308,column:31}},{start:{line:3308,column:35},end:{line:3308,column:48}}],line:3308},"166":{loc:{start:{line:3334,column:23},end:{line:3334,column:48}},type:"binary-expr",locations:[{start:{line:3334,column:23},end:{line:3334,column:31}},{start:{line:3334,column:35},end:{line:3334,column:48}}],line:3334},"167":{loc:{start:{line:3361,column:23},end:{line:3361,column:48}},type:"binary-expr",locations:[{start:{line:3361,column:23},end:{line:3361,column:31}},{start:{line:3361,column:35},end:{line:3361,column:48}}],line:3361},"168":{loc:{start:{line:3362,column:21},end:{line:3362,column:33}},type:"binary-expr",locations:[{start:{line:3362,column:21},end:{line:3362,column:27}},{start:{line:3362,column:31},end:{line:3362,column:33}}],line:3362},"169":{loc:{start:{line:3363,column:33},end:{line:3363,column:66}},type:"binary-expr",locations:[{start:{line:3363,column:33},end:{line:3363,column:51}},{start:{line:3363,column:55},end:{line:3363,column:66}}],line:3363},"170":{loc:{start:{line:3367,column:16},end:{line:3372,column:17}},type:"if",locations:[{start:{line:3367,column:16},end:{line:3372,column:17}},{start:{line:3367,column:16},end:{line:3372,column:17}}],line:3367},"171":{loc:{start:{line:3392,column:23},end:{line:3392,column:48}},type:"binary-expr",locations:[{start:{line:3392,column:23},end:{line:3392,column:31}},{start:{line:3392,column:35},end:{line:3392,column:48}}],line:3392},"172":{loc:{start:{line:3433,column:23},end:{line:3433,column:48}},type:"binary-expr",locations:[{start:{line:3433,column:23},end:{line:3433,column:31}},{start:{line:3433,column:35},end:{line:3433,column:48}}],line:3433},"173":{loc:{start:{line:3460,column:23},end:{line:3460,column:48}},type:"binary-expr",locations:[{start:{line:3460,column:23},end:{line:3460,column:31}},{start:{line:3460,column:35},end:{line:3460,column:48}}],line:3460},"174":{loc:{start:{line:3461,column:21},end:{line:3461,column:33}},type:"binary-expr",locations:[{start:{line:3461,column:21},end:{line:3461,column:27}},{start:{line:3461,column:31},end:{line:3461,column:33}}],line:3461},"175":{loc:{start:{line:3462,column:33},end:{line:3462,column:66}},type:"binary-expr",locations:[{start:{line:3462,column:33},end:{line:3462,column:51}},{start:{line:3462,column:55},end:{line:3462,column:66}}],line:3462},"176":{loc:{start:{line:3466,column:16},end:{line:3471,column:17}},type:"if",locations:[{start:{line:3466,column:16},end:{line:3471,column:17}},{start:{line:3466,column:16},end:{line:3471,column:17}}],line:3466},"177":{loc:{start:{line:3497,column:23},end:{line:3497,column:48}},type:"binary-expr",locations:[{start:{line:3497,column:23},end:{line:3497,column:31}},{start:{line:3497,column:35},end:{line:3497,column:48}}],line:3497},"178":{loc:{start:{line:3498,column:21},end:{line:3498,column:33}},type:"binary-expr",locations:[{start:{line:3498,column:21},end:{line:3498,column:27}},{start:{line:3498,column:31},end:{line:3498,column:33}}],line:3498},"179":{loc:{start:{line:3499,column:33},end:{line:3499,column:66}},type:"binary-expr",locations:[{start:{line:3499,column:33},end:{line:3499,column:51}},{start:{line:3499,column:55},end:{line:3499,column:66}}],line:3499},"180":{loc:{start:{line:3503,column:16},end:{line:3508,column:17}},type:"if",locations:[{start:{line:3503,column:16},end:{line:3508,column:17}},{start:{line:3503,column:16},end:{line:3508,column:17}}],line:3503},"181":{loc:{start:{line:3528,column:23},end:{line:3528,column:48}},type:"binary-expr",locations:[{start:{line:3528,column:23},end:{line:3528,column:31}},{start:{line:3528,column:35},end:{line:3528,column:48}}],line:3528},"182":{loc:{start:{line:3532,column:16},end:{line:3537,column:17}},type:"if",locations:[{start:{line:3532,column:16},end:{line:3537,column:17}},{start:{line:3532,column:16},end:{line:3537,column:17}}],line:3532},"183":{loc:{start:{line:3558,column:23},end:{line:3558,column:48}},type:"binary-expr",locations:[{start:{line:3558,column:23},end:{line:3558,column:31}},{start:{line:3558,column:35},end:{line:3558,column:48}}],line:3558},"184":{loc:{start:{line:3586,column:23},end:{line:3586,column:48}},type:"binary-expr",locations:[{start:{line:3586,column:23},end:{line:3586,column:31}},{start:{line:3586,column:35},end:{line:3586,column:48}}],line:3586},"185":{loc:{start:{line:3613,column:23},end:{line:3613,column:48}},type:"binary-expr",locations:[{start:{line:3613,column:23},end:{line:3613,column:31}},{start:{line:3613,column:35},end:{line:3613,column:48}}],line:3613},"186":{loc:{start:{line:3617,column:16},end:{line:3622,column:17}},type:"if",locations:[{start:{line:3617,column:16},end:{line:3622,column:17}},{start:{line:3617,column:16},end:{line:3622,column:17}}],line:3617},"187":{loc:{start:{line:3643,column:23},end:{line:3643,column:48}},type:"binary-expr",locations:[{start:{line:3643,column:23},end:{line:3643,column:31}},{start:{line:3643,column:35},end:{line:3643,column:48}}],line:3643},"188":{loc:{start:{line:3647,column:16},end:{line:3652,column:17}},type:"if",locations:[{start:{line:3647,column:16},end:{line:3652,column:17}},{start:{line:3647,column:16},end:{line:3652,column:17}}],line:3647},"189":{loc:{start:{line:3673,column:23},end:{line:3673,column:48}},type:"binary-expr",locations:[{start:{line:3673,column:23},end:{line:3673,column:31}},{start:{line:3673,column:35},end:{line:3673,column:48}}],line:3673},"190":{loc:{start:{line:3700,column:25},end:{line:3700,column:46}},type:"binary-expr",locations:[{start:{line:3700,column:25},end:{line:3700,column:39}},{start:{line:3700,column:43},end:{line:3700,column:46}}],line:3700},"191":{loc:{start:{line:3702,column:12},end:{line:3706,column:13}},type:"if",locations:[{start:{line:3702,column:12},end:{line:3706,column:13}},{start:{line:3702,column:12},end:{line:3706,column:13}}],line:3702},"192":{loc:{start:{line:3709,column:16},end:{line:3712,column:32}},type:"binary-expr",locations:[{start:{line:3709,column:16},end:{line:3709,column:35}},{start:{line:3710,column:16},end:{line:3710,column:31}},{start:{line:3711,column:16},end:{line:3711,column:33}},{start:{line:3712,column:16},end:{line:3712,column:32}}],line:3709},"193":{loc:{start:{line:3715,column:30},end:{line:3715,column:62}},type:"binary-expr",locations:[{start:{line:3715,column:30},end:{line:3715,column:45}},{start:{line:3715,column:49},end:{line:3715,column:62}}],line:3715},"194":{loc:{start:{line:3716,column:33},end:{line:3716,column:68}},type:"binary-expr",locations:[{start:{line:3716,column:33},end:{line:3716,column:51}},{start:{line:3716,column:55},end:{line:3716,column:68}}],line:3716},"195":{loc:{start:{line:3717,column:29},end:{line:3717,column:60}},type:"binary-expr",locations:[{start:{line:3717,column:29},end:{line:3717,column:43}},{start:{line:3717,column:47},end:{line:3717,column:60}}],line:3717},"196":{loc:{start:{line:3718,column:31},end:{line:3718,column:64}},type:"binary-expr",locations:[{start:{line:3718,column:31},end:{line:3718,column:47}},{start:{line:3718,column:51},end:{line:3718,column:64}}],line:3718},"197":{loc:{start:{line:3719,column:30},end:{line:3719,column:62}},type:"binary-expr",locations:[{start:{line:3719,column:30},end:{line:3719,column:45}},{start:{line:3719,column:49},end:{line:3719,column:62}}],line:3719},"198":{loc:{start:{line:3722,column:34},end:{line:3722,column:70}},type:"binary-expr",locations:[{start:{line:3722,column:34},end:{line:3722,column:53}},{start:{line:3722,column:57},end:{line:3722,column:70}}],line:3722},"199":{loc:{start:{line:3723,column:43},end:{line:3723,column:88}},type:"binary-expr",locations:[{start:{line:3723,column:43},end:{line:3723,column:71}},{start:{line:3723,column:75},end:{line:3723,column:88}}],line:3723},"200":{loc:{start:{line:3732,column:24},end:{line:3735,column:25}},type:"if",locations:[{start:{line:3732,column:24},end:{line:3735,column:25}},{start:{line:3732,column:24},end:{line:3735,column:25}}],line:3732},"201":{loc:{start:{line:3738,column:39},end:{line:3738,column:96}},type:"binary-expr",locations:[{start:{line:3738,column:39},end:{line:3738,column:65}},{start:{line:3738,column:69},end:{line:3738,column:96}}],line:3738},"202":{loc:{start:{line:3739,column:24},end:{line:3776,column:25}},type:"if",locations:[{start:{line:3739,column:24},end:{line:3776,column:25}},{start:{line:3739,column:24},end:{line:3776,column:25}}],line:3739},"203":{loc:{start:{line:3743,column:28},end:{line:3756,column:29}},type:"if",locations:[{start:{line:3743,column:28},end:{line:3756,column:29}},{start:{line:3743,column:28},end:{line:3756,column:29}}],line:3743},"204":{loc:{start:{line:3749,column:32},end:{line:3755,column:33}},type:"if",locations:[{start:{line:3749,column:32},end:{line:3755,column:33}},{start:{line:3749,column:32},end:{line:3755,column:33}}],line:3749},"205":{loc:{start:{line:3762,column:28},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3762,column:28},end:{line:3775,column:29}},{start:{line:3762,column:28},end:{line:3775,column:29}}],line:3762},"206":{loc:{start:{line:3762,column:32},end:{line:3762,column:72}},type:"binary-expr",locations:[{start:{line:3762,column:32},end:{line:3762,column:56}},{start:{line:3762,column:60},end:{line:3762,column:72}}],line:3762},"207":{loc:{start:{line:3769,column:33},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3769,column:33},end:{line:3775,column:29}},{start:{line:3769,column:33},end:{line:3775,column:29}}],line:3769},"208":{loc:{start:{line:3769,column:37},end:{line:3769,column:81}},type:"binary-expr",locations:[{start:{line:3769,column:37},end:{line:3769,column:63}},{start:{line:3769,column:67},end:{line:3769,column:81}}],line:3769},"209":{loc:{start:{line:3782,column:20},end:{line:3784,column:21}},type:"if",locations:[{start:{line:3782,column:20},end:{line:3784,column:21}},{start:{line:3782,column:20},end:{line:3784,column:21}}],line:3782},"210":{loc:{start:{line:3805,column:23},end:{line:3805,column:48}},type:"binary-expr",locations:[{start:{line:3805,column:23},end:{line:3805,column:31}},{start:{line:3805,column:35},end:{line:3805,column:48}}],line:3805},"211":{loc:{start:{line:3889,column:12},end:{line:3893,column:13}},type:"if",locations:[{start:{line:3889,column:12},end:{line:3893,column:13}},{start:{line:3889,column:12},end:{line:3893,column:13}}],line:3889},"212":{loc:{start:{line:3889,column:16},end:{line:3889,column:78}},type:"binary-expr",locations:[{start:{line:3889,column:16},end:{line:3889,column:37}},{start:{line:3889,column:41},end:{line:3889,column:65}},{start:{line:3889,column:69},end:{line:3889,column:78}}],line:3889},"213":{loc:{start:{line:3895,column:23},end:{line:3895,column:48}},type:"binary-expr",locations:[{start:{line:3895,column:23},end:{line:3895,column:31}},{start:{line:3895,column:35},end:{line:3895,column:48}}],line:3895},"214":{loc:{start:{line:3896,column:21},end:{line:3896,column:33}},type:"binary-expr",locations:[{start:{line:3896,column:21},end:{line:3896,column:27}},{start:{line:3896,column:31},end:{line:3896,column:33}}],line:3896},"215":{loc:{start:{line:3899,column:12},end:{line:3901,column:13}},type:"if",locations:[{start:{line:3899,column:12},end:{line:3901,column:13}},{start:{line:3899,column:12},end:{line:3901,column:13}}],line:3899},"216":{loc:{start:{line:3899,column:17},end:{line:3899,column:39}},type:"binary-expr",locations:[{start:{line:3899,column:17},end:{line:3899,column:33}},{start:{line:3899,column:37},end:{line:3899,column:39}}],line:3899},"217":{loc:{start:{line:3903,column:12},end:{line:3906,column:13}},type:"if",locations:[{start:{line:3903,column:12},end:{line:3906,column:13}},{start:{line:3903,column:12},end:{line:3906,column:13}}],line:3903},"218":{loc:{start:{line:3909,column:16},end:{line:3915,column:17}},type:"if",locations:[{start:{line:3909,column:16},end:{line:3915,column:17}},{start:{line:3909,column:16},end:{line:3915,column:17}}],line:3909},"219":{loc:{start:{line:3972,column:12},end:{line:3976,column:13}},type:"if",locations:[{start:{line:3972,column:12},end:{line:3976,column:13}},{start:{line:3972,column:12},end:{line:3976,column:13}}],line:3972},"220":{loc:{start:{line:3972,column:16},end:{line:3972,column:78}},type:"binary-expr",locations:[{start:{line:3972,column:16},end:{line:3972,column:37}},{start:{line:3972,column:41},end:{line:3972,column:65}},{start:{line:3972,column:69},end:{line:3972,column:78}}],line:3972},"221":{loc:{start:{line:3978,column:23},end:{line:3978,column:48}},type:"binary-expr",locations:[{start:{line:3978,column:23},end:{line:3978,column:31}},{start:{line:3978,column:35},end:{line:3978,column:48}}],line:3978},"222":{loc:{start:{line:3979,column:21},end:{line:3979,column:33}},type:"binary-expr",locations:[{start:{line:3979,column:21},end:{line:3979,column:27}},{start:{line:3979,column:31},end:{line:3979,column:33}}],line:3979},"223":{loc:{start:{line:3983,column:12},end:{line:3985,column:13}},type:"if",locations:[{start:{line:3983,column:12},end:{line:3985,column:13}},{start:{line:3983,column:12},end:{line:3985,column:13}}],line:3983},"224":{loc:{start:{line:3987,column:29},end:{line:3987,column:62}},type:"binary-expr",locations:[{start:{line:3987,column:29},end:{line:3987,column:47}},{start:{line:3987,column:51},end:{line:3987,column:62}}],line:3987},"225":{loc:{start:{line:4004,column:20},end:{line:4009,column:21}},type:"if",locations:[{start:{line:4004,column:20},end:{line:4009,column:21}},{start:{line:4004,column:20},end:{line:4009,column:21}}],line:4004},"226":{loc:{start:{line:4072,column:20},end:{line:4072,column:31}},type:"binary-expr",locations:[{start:{line:4072,column:20},end:{line:4072,column:25}},{start:{line:4072,column:29},end:{line:4072,column:31}}],line:4072},"227":{loc:{start:{line:4073,column:26},end:{line:4073,column:43}},type:"binary-expr",locations:[{start:{line:4073,column:26},end:{line:4073,column:37}},{start:{line:4073,column:41},end:{line:4073,column:43}}],line:4073},"228":{loc:{start:{line:4082,column:34},end:{line:4082,column:55}},type:"binary-expr",locations:[{start:{line:4082,column:34},end:{line:4082,column:47}},{start:{line:4082,column:51},end:{line:4082,column:55}}],line:4082},"229":{loc:{start:{line:4192,column:20},end:{line:4192,column:31}},type:"binary-expr",locations:[{start:{line:4192,column:20},end:{line:4192,column:25}},{start:{line:4192,column:29},end:{line:4192,column:31}}],line:4192},"230":{loc:{start:{line:4193,column:26},end:{line:4193,column:43}},type:"binary-expr",locations:[{start:{line:4193,column:26},end:{line:4193,column:37}},{start:{line:4193,column:41},end:{line:4193,column:43}}],line:4193},"231":{loc:{start:{line:4258,column:20},end:{line:4258,column:31}},type:"binary-expr",locations:[{start:{line:4258,column:20},end:{line:4258,column:25}},{start:{line:4258,column:29},end:{line:4258,column:31}}],line:4258},"232":{loc:{start:{line:4259,column:26},end:{line:4259,column:43}},type:"binary-expr",locations:[{start:{line:4259,column:26},end:{line:4259,column:37}},{start:{line:4259,column:41},end:{line:4259,column:43}}],line:4259},"233":{loc:{start:{line:4263,column:34},end:{line:4263,column:55}},type:"binary-expr",locations:[{start:{line:4263,column:34},end:{line:4263,column:47}},{start:{line:4263,column:51},end:{line:4263,column:55}}],line:4263},"234":{loc:{start:{line:4273,column:12},end:{line:4275,column:13}},type:"if",locations:[{start:{line:4273,column:12},end:{line:4275,column:13}},{start:{line:4273,column:12},end:{line:4275,column:13}}],line:4273},"235":{loc:{start:{line:4273,column:16},end:{line:4273,column:59}},type:"binary-expr",locations:[{start:{line:4273,column:16},end:{line:4273,column:36}},{start:{line:4273,column:40},end:{line:4273,column:59}}],line:4273},"236":{loc:{start:{line:4276,column:12},end:{line:4278,column:13}},type:"if",locations:[{start:{line:4276,column:12},end:{line:4278,column:13}},{start:{line:4276,column:12},end:{line:4278,column:13}}],line:4276},"237":{loc:{start:{line:4276,column:16},end:{line:4276,column:60}},type:"binary-expr",locations:[{start:{line:4276,column:16},end:{line:4276,column:37}},{start:{line:4276,column:41},end:{line:4276,column:60}}],line:4276},"238":{loc:{start:{line:4279,column:12},end:{line:4282,column:13}},type:"if",locations:[{start:{line:4279,column:12},end:{line:4282,column:13}},{start:{line:4279,column:12},end:{line:4282,column:13}}],line:4279},"239":{loc:{start:{line:4388,column:32},end:{line:4388,column:59}},type:"binary-expr",locations:[{start:{line:4388,column:32},end:{line:4388,column:51}},{start:{line:4388,column:55},end:{line:4388,column:59}}],line:4388},"240":{loc:{start:{line:4402,column:12},end:{line:4405,column:13}},type:"if",locations:[{start:{line:4402,column:12},end:{line:4405,column:13}},{start:{line:4402,column:12},end:{line:4405,column:13}}],line:4402},"241":{loc:{start:{line:4406,column:12},end:{line:4408,column:13}},type:"if",locations:[{start:{line:4406,column:12},end:{line:4408,column:13}},{start:{line:4406,column:12},end:{line:4408,column:13}}],line:4406},"242":{loc:{start:{line:4406,column:16},end:{line:4406,column:55}},type:"binary-expr",locations:[{start:{line:4406,column:16},end:{line:4406,column:21}},{start:{line:4406,column:25},end:{line:4406,column:55}}],line:4406},"243":{loc:{start:{line:4411,column:32},end:{line:4411,column:69}},type:"binary-expr",locations:[{start:{line:4411,column:32},end:{line:4411,column:49}},{start:{line:4411,column:53},end:{line:4411,column:69}}],line:4411},"244":{loc:{start:{line:4550,column:41},end:{line:4551,column:53}},type:"cond-expr",locations:[{start:{line:4551,column:16},end:{line:4551,column:46}},{start:{line:4551,column:49},end:{line:4551,column:53}}],line:4550},"245":{loc:{start:{line:4570,column:12},end:{line:4572,column:13}},type:"if",locations:[{start:{line:4570,column:12},end:{line:4572,column:13}},{start:{line:4570,column:12},end:{line:4572,column:13}}],line:4570},"246":{loc:{start:{line:4570,column:16},end:{line:4570,column:49}},type:"binary-expr",locations:[{start:{line:4570,column:16},end:{line:4570,column:19}},{start:{line:4570,column:23},end:{line:4570,column:49}}],line:4570},"247":{loc:{start:{line:4574,column:12},end:{line:4576,column:13}},type:"if",locations:[{start:{line:4574,column:12},end:{line:4576,column:13}},{start:{line:4574,column:12},end:{line:4576,column:13}}],line:4574},"248":{loc:{start:{line:4595,column:12},end:{line:4597,column:13}},type:"if",locations:[{start:{line:4595,column:12},end:{line:4597,column:13}},{start:{line:4595,column:12},end:{line:4597,column:13}}],line:4595},"249":{loc:{start:{line:4598,column:12},end:{line:4604,column:13}},type:"if",locations:[{start:{line:4598,column:12},end:{line:4604,column:13}},{start:{line:4598,column:12},end:{line:4604,column:13}}],line:4598},"250":{loc:{start:{line:4605,column:12},end:{line:4610,column:13}},type:"if",locations:[{start:{line:4605,column:12},end:{line:4610,column:13}},{start:{line:4605,column:12},end:{line:4610,column:13}}],line:4605},"251":{loc:{start:{line:4618,column:12},end:{line:4623,column:13}},type:"if",locations:[{start:{line:4618,column:12},end:{line:4623,column:13}},{start:{line:4618,column:12},end:{line:4623,column:13}}],line:4618},"252":{loc:{start:{line:4643,column:12},end:{line:4645,column:13}},type:"if",locations:[{start:{line:4643,column:12},end:{line:4645,column:13}},{start:{line:4643,column:12},end:{line:4645,column:13}}],line:4643},"253":{loc:{start:{line:4649,column:12},end:{line:4651,column:13}},type:"if",locations:[{start:{line:4649,column:12},end:{line:4651,column:13}},{start:{line:4649,column:12},end:{line:4651,column:13}}],line:4649},"254":{loc:{start:{line:4653,column:12},end:{line:4656,column:13}},type:"if",locations:[{start:{line:4653,column:12},end:{line:4656,column:13}},{start:{line:4653,column:12},end:{line:4656,column:13}}],line:4653},"255":{loc:{start:{line:4653,column:16},end:{line:4653,column:86}},type:"binary-expr",locations:[{start:{line:4653,column:16},end:{line:4653,column:35}},{start:{line:4653,column:39},end:{line:4653,column:86}}],line:4653},"256":{loc:{start:{line:4658,column:12},end:{line:4661,column:13}},type:"if",locations:[{start:{line:4658,column:12},end:{line:4661,column:13}},{start:{line:4658,column:12},end:{line:4661,column:13}}],line:4658},"257":{loc:{start:{line:4658,column:16},end:{line:4658,column:104}},type:"binary-expr",locations:[{start:{line:4658,column:16},end:{line:4658,column:35}},{start:{line:4658,column:39},end:{line:4658,column:104}}],line:4658},"258":{loc:{start:{line:4663,column:12},end:{line:4665,column:13}},type:"if",locations:[{start:{line:4663,column:12},end:{line:4665,column:13}},{start:{line:4663,column:12},end:{line:4665,column:13}}],line:4663},"259":{loc:{start:{line:4663,column:16},end:{line:4663,column:85}},type:"binary-expr",locations:[{start:{line:4663,column:16},end:{line:4663,column:40}},{start:{line:4663,column:44},end:{line:4663,column:85}}],line:4663},"260":{loc:{start:{line:4678,column:31},end:{line:4678,column:83}},type:"cond-expr",locations:[{start:{line:4678,column:63},end:{line:4678,column:71}},{start:{line:4678,column:74},end:{line:4678,column:83}}],line:4678},"261":{loc:{start:{line:4694,column:12},end:{line:4696,column:13}},type:"if",locations:[{start:{line:4694,column:12},end:{line:4696,column:13}},{start:{line:4694,column:12},end:{line:4696,column:13}}],line:4694},"262":{loc:{start:{line:4698,column:12},end:{line:4700,column:13}},type:"if",locations:[{start:{line:4698,column:12},end:{line:4700,column:13}},{start:{line:4698,column:12},end:{line:4700,column:13}}],line:4698},"263":{loc:{start:{line:4709,column:12},end:{line:4711,column:13}},type:"if",locations:[{start:{line:4709,column:12},end:{line:4711,column:13}},{start:{line:4709,column:12},end:{line:4711,column:13}}],line:4709},"264":{loc:{start:{line:4738,column:12},end:{line:4740,column:13}},type:"if",locations:[{start:{line:4738,column:12},end:{line:4740,column:13}},{start:{line:4738,column:12},end:{line:4740,column:13}}],line:4738},"265":{loc:{start:{line:4742,column:12},end:{line:4744,column:13}},type:"if",locations:[{start:{line:4742,column:12},end:{line:4744,column:13}},{start:{line:4742,column:12},end:{line:4744,column:13}}],line:4742},"266":{loc:{start:{line:4746,column:12},end:{line:4748,column:13}},type:"if",locations:[{start:{line:4746,column:12},end:{line:4748,column:13}},{start:{line:4746,column:12},end:{line:4748,column:13}}],line:4746},"267":{loc:{start:{line:4746,column:16},end:{line:4746,column:73}},type:"binary-expr",locations:[{start:{line:4746,column:16},end:{line:4746,column:48}},{start:{line:4746,column:52},end:{line:4746,column:73}}],line:4746},"268":{loc:{start:{line:4749,column:12},end:{line:4751,column:13}},type:"if",locations:[{start:{line:4749,column:12},end:{line:4751,column:13}},{start:{line:4749,column:12},end:{line:4751,column:13}}],line:4749},"269":{loc:{start:{line:4749,column:16},end:{line:4749,column:69}},type:"binary-expr",locations:[{start:{line:4749,column:16},end:{line:4749,column:46}},{start:{line:4749,column:50},end:{line:4749,column:69}}],line:4749},"270":{loc:{start:{line:4752,column:12},end:{line:4754,column:13}},type:"if",locations:[{start:{line:4752,column:12},end:{line:4754,column:13}},{start:{line:4752,column:12},end:{line:4754,column:13}}],line:4752},"271":{loc:{start:{line:4752,column:16},end:{line:4752,column:71}},type:"binary-expr",locations:[{start:{line:4752,column:16},end:{line:4752,column:47}},{start:{line:4752,column:51},end:{line:4752,column:71}}],line:4752},"272":{loc:{start:{line:4755,column:12},end:{line:4757,column:13}},type:"if",locations:[{start:{line:4755,column:12},end:{line:4757,column:13}},{start:{line:4755,column:12},end:{line:4757,column:13}}],line:4755},"273":{loc:{start:{line:4755,column:16},end:{line:4755,column:73}},type:"binary-expr",locations:[{start:{line:4755,column:16},end:{line:4755,column:48}},{start:{line:4755,column:52},end:{line:4755,column:73}}],line:4755},"274":{loc:{start:{line:4783,column:12},end:{line:4785,column:13}},type:"if",locations:[{start:{line:4783,column:12},end:{line:4785,column:13}},{start:{line:4783,column:12},end:{line:4785,column:13}}],line:4783},"275":{loc:{start:{line:4787,column:12},end:{line:4789,column:13}},type:"if",locations:[{start:{line:4787,column:12},end:{line:4789,column:13}},{start:{line:4787,column:12},end:{line:4789,column:13}}],line:4787},"276":{loc:{start:{line:4814,column:12},end:{line:4816,column:13}},type:"if",locations:[{start:{line:4814,column:12},end:{line:4816,column:13}},{start:{line:4814,column:12},end:{line:4816,column:13}}],line:4814},"277":{loc:{start:{line:4818,column:12},end:{line:4820,column:13}},type:"if",locations:[{start:{line:4818,column:12},end:{line:4820,column:13}},{start:{line:4818,column:12},end:{line:4820,column:13}}],line:4818},"278":{loc:{start:{line:4821,column:12},end:{line:4823,column:13}},type:"if",locations:[{start:{line:4821,column:12},end:{line:4823,column:13}},{start:{line:4821,column:12},end:{line:4823,column:13}}],line:4821},"279":{loc:{start:{line:4846,column:12},end:{line:4848,column:13}},type:"if",locations:[{start:{line:4846,column:12},end:{line:4848,column:13}},{start:{line:4846,column:12},end:{line:4848,column:13}}],line:4846},"280":{loc:{start:{line:4850,column:12},end:{line:4852,column:13}},type:"if",locations:[{start:{line:4850,column:12},end:{line:4852,column:13}},{start:{line:4850,column:12},end:{line:4852,column:13}}],line:4850},"281":{loc:{start:{line:4860,column:12},end:{line:4862,column:13}},type:"if",locations:[{start:{line:4860,column:12},end:{line:4862,column:13}},{start:{line:4860,column:12},end:{line:4862,column:13}}],line:4860},"282":{loc:{start:{line:4883,column:12},end:{line:4885,column:13}},type:"if",locations:[{start:{line:4883,column:12},end:{line:4885,column:13}},{start:{line:4883,column:12},end:{line:4885,column:13}}],line:4883},"283":{loc:{start:{line:4887,column:12},end:{line:4889,column:13}},type:"if",locations:[{start:{line:4887,column:12},end:{line:4889,column:13}},{start:{line:4887,column:12},end:{line:4889,column:13}}],line:4887},"284":{loc:{start:{line:4894,column:12},end:{line:4896,column:13}},type:"if",locations:[{start:{line:4894,column:12},end:{line:4896,column:13}},{start:{line:4894,column:12},end:{line:4896,column:13}}],line:4894},"285":{loc:{start:{line:4894,column:16},end:{line:4894,column:73}},type:"binary-expr",locations:[{start:{line:4894,column:16},end:{line:4894,column:48}},{start:{line:4894,column:52},end:{line:4894,column:73}}],line:4894},"286":{loc:{start:{line:4897,column:12},end:{line:4899,column:13}},type:"if",locations:[{start:{line:4897,column:12},end:{line:4899,column:13}},{start:{line:4897,column:12},end:{line:4899,column:13}}],line:4897},"287":{loc:{start:{line:4897,column:16},end:{line:4897,column:69}},type:"binary-expr",locations:[{start:{line:4897,column:16},end:{line:4897,column:46}},{start:{line:4897,column:50},end:{line:4897,column:69}}],line:4897},"288":{loc:{start:{line:4900,column:12},end:{line:4902,column:13}},type:"if",locations:[{start:{line:4900,column:12},end:{line:4902,column:13}},{start:{line:4900,column:12},end:{line:4902,column:13}}],line:4900},"289":{loc:{start:{line:4900,column:16},end:{line:4900,column:71}},type:"binary-expr",locations:[{start:{line:4900,column:16},end:{line:4900,column:47}},{start:{line:4900,column:51},end:{line:4900,column:71}}],line:4900},"290":{loc:{start:{line:4903,column:12},end:{line:4905,column:13}},type:"if",locations:[{start:{line:4903,column:12},end:{line:4905,column:13}},{start:{line:4903,column:12},end:{line:4905,column:13}}],line:4903},"291":{loc:{start:{line:4903,column:16},end:{line:4903,column:73}},type:"binary-expr",locations:[{start:{line:4903,column:16},end:{line:4903,column:48}},{start:{line:4903,column:52},end:{line:4903,column:73}}],line:4903},"292":{loc:{start:{line:4929,column:12},end:{line:4931,column:13}},type:"if",locations:[{start:{line:4929,column:12},end:{line:4931,column:13}},{start:{line:4929,column:12},end:{line:4931,column:13}}],line:4929},"293":{loc:{start:{line:4933,column:12},end:{line:4935,column:13}},type:"if",locations:[{start:{line:4933,column:12},end:{line:4935,column:13}},{start:{line:4933,column:12},end:{line:4935,column:13}}],line:4933},"294":{loc:{start:{line:4958,column:12},end:{line:4960,column:13}},type:"if",locations:[{start:{line:4958,column:12},end:{line:4960,column:13}},{start:{line:4958,column:12},end:{line:4960,column:13}}],line:4958},"295":{loc:{start:{line:4962,column:12},end:{line:4964,column:13}},type:"if",locations:[{start:{line:4962,column:12},end:{line:4964,column:13}},{start:{line:4962,column:12},end:{line:4964,column:13}}],line:4962},"296":{loc:{start:{line:4965,column:12},end:{line:4967,column:13}},type:"if",locations:[{start:{line:4965,column:12},end:{line:4967,column:13}},{start:{line:4965,column:12},end:{line:4967,column:13}}],line:4965},"297":{loc:{start:{line:4990,column:12},end:{line:4992,column:13}},type:"if",locations:[{start:{line:4990,column:12},end:{line:4992,column:13}},{start:{line:4990,column:12},end:{line:4992,column:13}}],line:4990},"298":{loc:{start:{line:4995,column:12},end:{line:5047,column:13}},type:"if",locations:[{start:{line:4995,column:12},end:{line:5047,column:13}},{start:{line:4995,column:12},end:{line:5047,column:13}}],line:4995},"299":{loc:{start:{line:4995,column:16},end:{line:5002,column:41}},type:"binary-expr",locations:[{start:{line:4995,column:16},end:{line:4995,column:58}},{start:{line:4996,column:16},end:{line:5002,column:41}}],line:4995},"300":{loc:{start:{line:5008,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5008,column:17},end:{line:5047,column:13}},{start:{line:5008,column:17},end:{line:5047,column:13}}],line:5008},"301":{loc:{start:{line:5008,column:21},end:{line:5018,column:37}},type:"binary-expr",locations:[{start:{line:5008,column:21},end:{line:5008,column:40}},{start:{line:5009,column:16},end:{line:5018,column:37}}],line:5008},"302":{loc:{start:{line:5025,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5025,column:17},end:{line:5047,column:13}},{start:{line:5025,column:17},end:{line:5047,column:13}}],line:5025},"303":{loc:{start:{line:5025,column:21},end:{line:5032,column:37}},type:"binary-expr",locations:[{start:{line:5025,column:21},end:{line:5025,column:43}},{start:{line:5026,column:16},end:{line:5032,column:37}}],line:5025},"304":{loc:{start:{line:5039,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5039,column:17},end:{line:5047,column:13}},{start:{line:5039,column:17},end:{line:5047,column:13}}],line:5039},"305":{loc:{start:{line:5039,column:21},end:{line:5040,column:41}},type:"binary-expr",locations:[{start:{line:5039,column:21},end:{line:5039,column:74}},{start:{line:5040,column:16},end:{line:5040,column:41}}],line:5039},"306":{loc:{start:{line:5045,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5045,column:17},end:{line:5047,column:13}},{start:{line:5045,column:17},end:{line:5047,column:13}}],line:5045},"307":{loc:{start:{line:5108,column:12},end:{line:5110,column:13}},type:"if",locations:[{start:{line:5108,column:12},end:{line:5110,column:13}},{start:{line:5108,column:12},end:{line:5110,column:13}}],line:5108},"308":{loc:{start:{line:5113,column:16},end:{line:5116,column:17}},type:"if",locations:[{start:{line:5113,column:16},end:{line:5116,column:17}},{start:{line:5113,column:16},end:{line:5116,column:17}}],line:5113},"309":{loc:{start:{line:5118,column:16},end:{line:5123,column:17}},type:"if",locations:[{start:{line:5118,column:16},end:{line:5123,column:17}},{start:{line:5118,column:16},end:{line:5123,column:17}}],line:5118},"310":{loc:{start:{line:5118,column:20},end:{line:5118,column:65}},type:"binary-expr",locations:[{start:{line:5118,column:20},end:{line:5118,column:39}},{start:{line:5118,column:43},end:{line:5118,column:65}}],line:5118},"311":{loc:{start:{line:5154,column:12},end:{line:5157,column:13}},type:"if",locations:[{start:{line:5154,column:12},end:{line:5157,column:13}},{start:{line:5154,column:12},end:{line:5157,column:13}}],line:5154},"312":{loc:{start:{line:5158,column:19},end:{line:5158,column:29}},type:"binary-expr",locations:[{start:{line:5158,column:19},end:{line:5158,column:23}},{start:{line:5158,column:27},end:{line:5158,column:29}}],line:5158},"313":{loc:{start:{line:5161,column:16},end:{line:5166,column:17}},type:"if",locations:[{start:{line:5161,column:16},end:{line:5166,column:17}},{start:{line:5161,column:16},end:{line:5166,column:17}}],line:5161},"314":{loc:{start:{line:5225,column:20},end:{line:5225,column:31}},type:"binary-expr",locations:[{start:{line:5225,column:20},end:{line:5225,column:25}},{start:{line:5225,column:29},end:{line:5225,column:31}}],line:5225},"315":{loc:{start:{line:5226,column:26},end:{line:5226,column:43}},type:"binary-expr",locations:[{start:{line:5226,column:26},end:{line:5226,column:37}},{start:{line:5226,column:41},end:{line:5226,column:43}}],line:5226},"316":{loc:{start:{line:5235,column:12},end:{line:5237,column:13}},type:"if",locations:[{start:{line:5235,column:12},end:{line:5237,column:13}},{start:{line:5235,column:12},end:{line:5237,column:13}}],line:5235},"317":{loc:{start:{line:5238,column:12},end:{line:5240,column:13}},type:"if",locations:[{start:{line:5238,column:12},end:{line:5240,column:13}},{start:{line:5238,column:12},end:{line:5240,column:13}}],line:5238},"318":{loc:{start:{line:5241,column:12},end:{line:5243,column:13}},type:"if",locations:[{start:{line:5241,column:12},end:{line:5243,column:13}},{start:{line:5241,column:12},end:{line:5243,column:13}}],line:5241},"319":{loc:{start:{line:5244,column:12},end:{line:5246,column:13}},type:"if",locations:[{start:{line:5244,column:12},end:{line:5246,column:13}},{start:{line:5244,column:12},end:{line:5246,column:13}}],line:5244},"320":{loc:{start:{line:5249,column:12},end:{line:5251,column:13}},type:"if",locations:[{start:{line:5249,column:12},end:{line:5251,column:13}},{start:{line:5249,column:12},end:{line:5251,column:13}}],line:5249},"321":{loc:{start:{line:5317,column:19},end:{line:5317,column:77}},type:"binary-expr",locations:[{start:{line:5317,column:19},end:{line:5317,column:48}},{start:{line:5317,column:52},end:{line:5317,column:69}},{start:{line:5317,column:73},end:{line:5317,column:77}}],line:5317},"322":{loc:{start:{line:5335,column:16},end:{line:5337,column:17}},type:"if",locations:[{start:{line:5335,column:16},end:{line:5337,column:17}},{start:{line:5335,column:16},end:{line:5337,column:17}}],line:5335},"323":{loc:{start:{line:5342,column:16},end:{line:5344,column:17}},type:"if",locations:[{start:{line:5342,column:16},end:{line:5344,column:17}},{start:{line:5342,column:16},end:{line:5344,column:17}}],line:5342},"324":{loc:{start:{line:5454,column:12},end:{line:5457,column:13}},type:"if",locations:[{start:{line:5454,column:12},end:{line:5457,column:13}},{start:{line:5454,column:12},end:{line:5457,column:13}}],line:5454},"325":{loc:{start:{line:5454,column:16},end:{line:5454,column:59}},type:"binary-expr",locations:[{start:{line:5454,column:16},end:{line:5454,column:25}},{start:{line:5454,column:29},end:{line:5454,column:59}}],line:5454},"326":{loc:{start:{line:5460,column:23},end:{line:5460,column:72}},type:"cond-expr",locations:[{start:{line:5460,column:38},end:{line:5460,column:67}},{start:{line:5460,column:70},end:{line:5460,column:72}}],line:5460},"327":{loc:{start:{line:5487,column:26},end:{line:5487,column:68}},type:"cond-expr",locations:[{start:{line:5487,column:43},end:{line:5487,column:60}},{start:{line:5487,column:65},end:{line:5487,column:67}}],line:5487},"328":{loc:{start:{line:5556,column:12},end:{line:5559,column:13}},type:"if",locations:[{start:{line:5556,column:12},end:{line:5559,column:13}},{start:{line:5556,column:12},end:{line:5559,column:13}}],line:5556},"329":{loc:{start:{line:5564,column:32},end:{line:5564,column:76}},type:"binary-expr",locations:[{start:{line:5564,column:32},end:{line:5564,column:70}},{start:{line:5564,column:74},end:{line:5564,column:76}}],line:5564},"330":{loc:{start:{line:5565,column:12},end:{line:5568,column:13}},type:"if",locations:[{start:{line:5565,column:12},end:{line:5568,column:13}},{start:{line:5565,column:12},end:{line:5568,column:13}}],line:5565},"331":{loc:{start:{line:5572,column:12},end:{line:5574,column:13}},type:"if",locations:[{start:{line:5572,column:12},end:{line:5574,column:13}},{start:{line:5572,column:12},end:{line:5574,column:13}}],line:5572},"332":{loc:{start:{line:5572,column:16},end:{line:5572,column:84}},type:"binary-expr",locations:[{start:{line:5572,column:16},end:{line:5572,column:48}},{start:{line:5572,column:52},end:{line:5572,column:84}}],line:5572},"333":{loc:{start:{line:5614,column:16},end:{line:5616,column:17}},type:"if",locations:[{start:{line:5614,column:16},end:{line:5616,column:17}},{start:{line:5614,column:16},end:{line:5616,column:17}}],line:5614},"334":{loc:{start:{line:5645,column:12},end:{line:5648,column:13}},type:"if",locations:[{start:{line:5645,column:12},end:{line:5648,column:13}},{start:{line:5645,column:12},end:{line:5648,column:13}}],line:5645},"335":{loc:{start:{line:5649,column:23},end:{line:5649,column:48}},type:"binary-expr",locations:[{start:{line:5649,column:23},end:{line:5649,column:31}},{start:{line:5649,column:35},end:{line:5649,column:48}}],line:5649},"336":{loc:{start:{line:5651,column:12},end:{line:5654,column:13}},type:"if",locations:[{start:{line:5651,column:12},end:{line:5654,column:13}},{start:{line:5651,column:12},end:{line:5654,column:13}}],line:5651},"337":{loc:{start:{line:5655,column:12},end:{line:5658,column:13}},type:"if",locations:[{start:{line:5655,column:12},end:{line:5658,column:13}},{start:{line:5655,column:12},end:{line:5658,column:13}}],line:5655},"338":{loc:{start:{line:5662,column:29},end:{line:5662,column:107}},type:"binary-expr",locations:[{start:{line:5662,column:29},end:{line:5662,column:48}},{start:{line:5662,column:52},end:{line:5662,column:78}},{start:{line:5662,column:82},end:{line:5662,column:107}}],line:5662},"339":{loc:{start:{line:5663,column:35},end:{line:5663,column:123}},type:"binary-expr",locations:[{start:{line:5663,column:35},end:{line:5663,column:54}},{start:{line:5663,column:58},end:{line:5663,column:89}},{start:{line:5663,column:93},end:{line:5663,column:123}}],line:5663},"340":{loc:{start:{line:5664,column:35},end:{line:5664,column:123}},type:"binary-expr",locations:[{start:{line:5664,column:35},end:{line:5664,column:54}},{start:{line:5664,column:58},end:{line:5664,column:89}},{start:{line:5664,column:93},end:{line:5664,column:123}}],line:5664},"341":{loc:{start:{line:5670,column:16},end:{line:5676,column:17}},type:"if",locations:[{start:{line:5670,column:16},end:{line:5676,column:17}},{start:{line:5670,column:16},end:{line:5676,column:17}}],line:5670},"342":{loc:{start:{line:5713,column:24},end:{line:5713,column:39}},type:"binary-expr",locations:[{start:{line:5713,column:24},end:{line:5713,column:33}},{start:{line:5713,column:37},end:{line:5713,column:39}}],line:5713},"343":{loc:{start:{line:5733,column:12},end:{line:5736,column:13}},type:"if",locations:[{start:{line:5733,column:12},end:{line:5736,column:13}},{start:{line:5733,column:12},end:{line:5736,column:13}}],line:5733},"344":{loc:{start:{line:5733,column:16},end:{line:5733,column:53}},type:"binary-expr",locations:[{start:{line:5733,column:16},end:{line:5733,column:40}},{start:{line:5733,column:44},end:{line:5733,column:53}}],line:5733},"345":{loc:{start:{line:5738,column:21},end:{line:5738,column:33}},type:"binary-expr",locations:[{start:{line:5738,column:21},end:{line:5738,column:27}},{start:{line:5738,column:31},end:{line:5738,column:33}}],line:5738},"346":{loc:{start:{line:5739,column:23},end:{line:5739,column:47}},type:"binary-expr",locations:[{start:{line:5739,column:23},end:{line:5739,column:31}},{start:{line:5739,column:35},end:{line:5739,column:47}}],line:5739},"347":{loc:{start:{line:5744,column:16},end:{line:5750,column:17}},type:"if",locations:[{start:{line:5744,column:16},end:{line:5750,column:17}},{start:{line:5744,column:16},end:{line:5750,column:17}}],line:5744},"348":{loc:{start:{line:5774,column:21},end:{line:5774,column:33}},type:"binary-expr",locations:[{start:{line:5774,column:21},end:{line:5774,column:27}},{start:{line:5774,column:31},end:{line:5774,column:33}}],line:5774},"349":{loc:{start:{line:5777,column:29},end:{line:5777,column:49}},type:"binary-expr",locations:[{start:{line:5777,column:29},end:{line:5777,column:44}},{start:{line:5777,column:48},end:{line:5777,column:49}}],line:5777},"350":{loc:{start:{line:5783,column:23},end:{line:5783,column:48}},type:"binary-expr",locations:[{start:{line:5783,column:23},end:{line:5783,column:31}},{start:{line:5783,column:35},end:{line:5783,column:48}}],line:5783},"351":{loc:{start:{line:5791,column:16},end:{line:5799,column:17}},type:"if",locations:[{start:{line:5791,column:16},end:{line:5799,column:17}},{start:{line:5791,column:16},end:{line:5799,column:17}}],line:5791},"352":{loc:{start:{line:5795,column:38},end:{line:5795,column:76}},type:"cond-expr",locations:[{start:{line:5795,column:53},end:{line:5795,column:72}},{start:{line:5795,column:75},end:{line:5795,column:76}}],line:5795}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0},b:{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,0],"53":[0,0],"54":[0,0],"55":[0,0],"56":[0,0],"57":[0,0],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,0],"63":[0,0],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0,0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0,0],"83":[0,0],"84":[0,0],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0,0],"89":[0,0],"90":[0,0],"91":[0,0],"92":[0,0],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0,0],"97":[0,0],"98":[0,0],"99":[0,0],"100":[0,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[0,0],"105":[0,0],"106":[0,0],"107":[0,0],"108":[0,0],"109":[0,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[0,0],"114":[0,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[0,0],"119":[0,0],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[0,0],"127":[0,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[0,0],"134":[0,0],"135":[0,0],"136":[0,0],"137":[0,0],"138":[0,0],"139":[0,0],"140":[0,0],"141":[0,0],"142":[0,0],"143":[0,0],"144":[0,0],"145":[0,0,0],"146":[0,0],"147":[0,0],"148":[0,0],"149":[0,0,0],"150":[0,0],"151":[0,0],"152":[0,0],"153":[0,0],"154":[0,0,0],"155":[0,0],"156":[0,0],"157":[0,0],"158":[0,0],"159":[0,0],"160":[0,0],"161":[0,0],"162":[0,0],"163":[0,0],"164":[0,0],"165":[0,0],"166":[0,0],"167":[0,0],"168":[0,0],"169":[0,0],"170":[0,0],"171":[0,0],"172":[0,0],"173":[0,0],"174":[0,0],"175":[0,0],"176":[0,0],"177":[0,0],"178":[0,0],"179":[0,0],"180":[0,0],"181":[0,0],"182":[0,0],"183":[0,0],"184":[0,0],"185":[0,0],"186":[0,0],"187":[0,0],"188":[0,0],"189":[0,0],"190":[0,0],"191":[0,0],"192":[0,0,0,0],"193":[0,0],"194":[0,0],"195":[0,0],"196":[0,0],"197":[0,0],"198":[0,0],"199":[0,0],"200":[0,0],"201":[0,0],"202":[0,0],"203":[0,0],"204":[0,0],"205":[0,0],"206":[0,0],"207":[0,0],"208":[0,0],"209":[0,0],"210":[0,0],"211":[0,0],"212":[0,0,0],"213":[0,0],"214":[0,0],"215":[0,0],"216":[0,0],"217":[0,0],"218":[0,0],"219":[0,0],"220":[0,0,0],"221":[0,0],"222":[0,0],"223":[0,0],"224":[0,0],"225":[0,0],"226":[0,0],"227":[0,0],"228":[0,0],"229":[0,0],"230":[0,0],"231":[0,0],"232":[0,0],"233":[0,0],"234":[0,0],"235":[0,0],"236":[0,0],"237":[0,0],"238":[0,0],"239":[0,0],"240":[0,0],"241":[0,0],"242":[0,0],"243":[0,0],"244":[0,0],"245":[0,0],"246":[0,0],"247":[0,0],"248":[0,0],"249":[0,0],"250":[0,0],"251":[0,0],"252":[0,0],"253":[0,0],"254":[0,0],"255":[0,0],"256":[0,0],"257":[0,0],"258":[0,0],"259":[0,0],"260":[0,0],"261":[0,0],"262":[0,0],"263":[0,0],"264":[0,0],"265":[0,0],"266":[0,0],"267":[0,0],"268":[0,0],"269":[0,0],"270":[0,0],"271":[0,0],"272":[0,0],"273":[0,0],"274":[0,0],"275":[0,0],"276":[0,0],"277":[0,0],"278":[0,0],"279":[0,0],"280":[0,0],"281":[0,0],"282":[0,0],"283":[0,0],"284":[0,0],"285":[0,0],"286":[0,0],"287":[0,0],"288":[0,0],"289":[0,0],"290":[0,0],"291":[0,0],"292":[0,0],"293":[0,0],"294":[0,0],"295":[0,0],"296":[0,0],"297":[0,0],"298":[0,0],"299":[0,0],"300":[0,0],"301":[0,0],"302":[0,0],"303":[0,0],"304":[0,0],"305":[0,0],"306":[0,0],"307":[0,0],"308":[0,0],"309":[0,0],"310":[0,0],"311":[0,0],"312":[0,0],"313":[0,0],"314":[0,0],"315":[0,0],"316":[0,0],"317":[0,0],"318":[0,0],"319":[0,0],"320":[0,0],"321":[0,0,0],"322":[0,0],"323":[0,0],"324":[0,0],"325":[0,0],"326":[0,0],"327":[0,0],"328":[0,0],"329":[0,0],"330":[0,0],"331":[0,0],"332":[0,0],"333":[0,0],"334":[0,0],"335":[0,0],"336":[0,0],"337":[0,0],"338":[0,0,0],"339":[0,0,0],"340":[0,0,0],"341":[0,0],"342":[0,0],"343":[0,0],"344":[0,0],"345":[0,0],"346":[0,0],"347":[0,0],"348":[0,0],"349":[0,0],"350":[0,0],"351":[0,0],"352":[0,0]},_coverageSchema:"1a1c01bbd47fc00a2c39e90264f33305004495a9",hash:"b527bc3bbffe3a4fee511c63590269cdc3ea500f"};var coverage=global[gcv]||(global[gcv]={});if(!coverage[path]||coverage[path].hash!==hash){coverage[path]=coverageData;}var actualCoverage=coverage[path];{// @ts-ignore +cov_1ks4ntaci2=function(){return actualCoverage;};}return actualCoverage;}cov_1ks4ntaci2();cov_1ks4ntaci2().s[0]++;/*!*/ // Copyright 2014 Splunk, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +(function(){"use strict";cov_1ks4ntaci2().f[0]++;var Context=(cov_1ks4ntaci2().s[1]++,require('./context'));var Http=(cov_1ks4ntaci2().s[2]++,require('./http'));var Async=(cov_1ks4ntaci2().s[3]++,require('./async'));var Paths=(cov_1ks4ntaci2().s[4]++,require('./paths').Paths);var Class=(cov_1ks4ntaci2().s[5]++,require('./jquery.class').Class);var utils=(cov_1ks4ntaci2().s[6]++,require('./utils'));var root=(cov_1ks4ntaci2().s[7]++,(cov_1ks4ntaci2().b[0][0]++,exports)||(cov_1ks4ntaci2().b[0][1]++,this));var Service=(cov_1ks4ntaci2().s[8]++,null);/** + * Contains functionality common to Splunk Enterprise and Splunk Storm. + * + * This class is an implementation detail and is therefore SDK-private. + * + * @class splunkjs.private.BaseService + * @extends splunkjs.Context + */var BaseService=(cov_1ks4ntaci2().s[9]++,Context.extend({init:function(){cov_1ks4ntaci2().f[1]++;cov_1ks4ntaci2().s[10]++;this._super.apply(this,arguments);}}));/** + * Provides a root access point to Splunk functionality with typed access to + * Splunk resources such as searches, indexes, inputs, and more. Provides + * methods to authenticate and create specialized instances of the service. + * + * @class splunkjs.Service + * @extends splunkjs.private.BaseService + */cov_1ks4ntaci2().s[11]++;module.exports=root=Service=BaseService.extend({/** + * Constructor for `splunkjs.Service`. + * + * @constructor + * @param {splunkjs.Http} http An instance of a `splunkjs.Http` class. + * @param {Object} params A dictionary of optional parameters: + * - `scheme` (_string_): The scheme ("http" or "https") for accessing Splunk. + * - `host` (_string_): The host name (the default is "localhost"). + * - `port` (_integer_): The port number (the default is 8089). + * - `username` (_string_): The Splunk account username, which is used to authenticate the Splunk instance. + * - `password` (_string_): The password, which is used to authenticate the Splunk instance. + * - `owner` (_string_): The owner (username) component of the namespace. + * - `app` (_string_): The app component of the namespace. + * - `sessionKey` (_string_): The current session token. + * - `autologin` (_boolean_): `true` to automatically try to log in again if the session terminates, `false` if not (`true` by default). + * - `version` (_string_): The version string for Splunk, for example "4.3.2" (the default is "5.0"). + * @return {splunkjs.Service} A new `splunkjs.Service` instance. + * + * @method splunkjs.Service + */init:function(){cov_1ks4ntaci2().f[2]++;cov_1ks4ntaci2().s[12]++;this._super.apply(this,arguments);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[13]++;this.specialize=utils.bind(this,this.specialize);cov_1ks4ntaci2().s[14]++;this.apps=utils.bind(this,this.apps);cov_1ks4ntaci2().s[15]++;this.configurations=utils.bind(this,this.configurations);cov_1ks4ntaci2().s[16]++;this.indexes=utils.bind(this,this.indexes);cov_1ks4ntaci2().s[17]++;this.savedSearches=utils.bind(this,this.savedSearches);cov_1ks4ntaci2().s[18]++;this.jobs=utils.bind(this,this.jobs);cov_1ks4ntaci2().s[19]++;this.users=utils.bind(this,this.users);cov_1ks4ntaci2().s[20]++;this.currentUser=utils.bind(this,this.currentUser);cov_1ks4ntaci2().s[21]++;this.views=utils.bind(this,this.views);cov_1ks4ntaci2().s[22]++;this.firedAlertGroups=utils.bind(this,this.firedAlertGroups);cov_1ks4ntaci2().s[23]++;this.dataModels=utils.bind(this,this.dataModels);},/** + * Creates a specialized version of the current `Service` instance for + * a specific namespace context. + * + * @example + * + * var svc = ...; + * var newService = svc.specialize("myuser", "unix"); + * + * @param {String} owner The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * @param {String} app The app context for this resource (such as "search"). The "-" wildcard means all apps. + * @return {splunkjs.Service} The specialized `Service` instance. + * + * @method splunkjs.Service + */specialize:function(owner,app){cov_1ks4ntaci2().f[3]++;cov_1ks4ntaci2().s[24]++;return new Service(this.http,{scheme:this.scheme,host:this.host,port:this.port,username:this.username,password:this.password,owner:owner,app:app,sessionKey:this.sessionKey,version:this.version});},/** + * Gets the `Applications` collection, which allows you to + * list installed apps and retrieve information about them. + * + * @example + * + * // List installed apps + * var apps = svc.apps(); + * apps.fetch(function(err) { console.log(apps.list()); }); + * + * @return {splunkjs.Service.Collection} The `Applications` collection. + * + * @endpoint apps/local + * @method splunkjs.Service + * @see splunkjs.Service.Applications + */apps:function(){cov_1ks4ntaci2().f[4]++;cov_1ks4ntaci2().s[25]++;return new root.Applications(this);},/** + * Gets the `Configurations` collection, which lets you + * create, list, and retrieve configuration (.conf) files. + * + * @example + * + * // List all properties in the 'props.conf' file + * var files = svc.configurations(); + * files.item("props", function(err, propsFile) { + * propsFile.fetch(function(err, props) { + * console.log(props.properties()); + * }); + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Configurations} The `Configurations` collection. + * + * @endpoint configs + * @method splunkjs.Service + * @see splunkjs.Service.Configurations + */configurations:function(namespace){cov_1ks4ntaci2().f[5]++;cov_1ks4ntaci2().s[26]++;return new root.Configurations(this,namespace);},/** + * Gets the `Indexes` collection, which lets you create, + * list, and update indexes. + * + * @example + * + * // Check if we have an _internal index + * var indexes = svc.indexes(); + * indexes.fetch(function(err, indexes) { + * var index = indexes.item("_internal"); + * console.log("Was index found: " + !!index); + * // `index` is an Index object. + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Indexes} The `Indexes` collection. + * + * @endpoint data/indexes + * @method splunkjs.Service + * @see splunkjs.Service.Indexes + */indexes:function(namespace){cov_1ks4ntaci2().f[6]++;cov_1ks4ntaci2().s[27]++;return new root.Indexes(this,namespace);},/** + * Gets the `SavedSearches` collection, which lets you + * create, list, and update saved searches. + * + * @example + * + * // List all # of saved searches + * var savedSearches = svc.savedSearches(); + * savedSearches.fetch(function(err, savedSearches) { + * console.log("# Of Saved Searches: " + savedSearches.list().length); + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.SavedSearches} The `SavedSearches` collection. + * + * @endpoint saved/searches + * @method splunkjs.Service + * @see splunkjs.Service.SavedSearches + */savedSearches:function(namespace){cov_1ks4ntaci2().f[7]++;cov_1ks4ntaci2().s[28]++;return new root.SavedSearches(this,namespace);},/** + * Gets the `StoragePasswords` collection, which lets you + * create, list, and update storage passwords. + * + * @example + * + * // List all # of storage passwords + * var storagePasswords = svc.storagePasswords(); + * storagePasswords.fetch(function(err, storagePasswords) { + * console.log("# of Storage Passwords: " + storagePasswords.list().length); + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.StoragePasswords} The `StoragePasswords` collection. + * + * @endpoint storage/passwords + * @method splunkjs.Service + * @see splunkjs.Service.StoragePasswords + */storagePasswords:function(namespace){cov_1ks4ntaci2().f[8]++;cov_1ks4ntaci2().s[29]++;return new root.StoragePasswords(this,namespace);},/** + * Gets the `FiredAlertGroupCollection` collection, which lets you + * list alert groups. + * + * @example + * + * // List all # of fired alert groups + * var firedAlertGroups = svc.firedAlertGroups(); + * firedAlertGroups.fetch(function(err, firedAlertGroups) { + * console.log("# of alert groups: " + firedAlertGroups.list().length); + * }); + * + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.FiredAlertGroupCollection} The `FiredAlertGroupCollection` collection. + * + * @endpoint saved/searches + * @method splunkjs.Service + * @see splunkjs.Service.FiredAlertGroupCollection + */firedAlertGroups:function(namespace){cov_1ks4ntaci2().f[9]++;cov_1ks4ntaci2().s[30]++;return new root.FiredAlertGroupCollection(this,namespace);},/** + * Gets the `Jobs` collection, which lets you create, list, + * and retrieve search jobs. + * + * @example + * + * // List all job IDs + * var jobs = svc.jobs(); + * jobs.fetch(function(err, jobs) { + * var list = jobs.list(); + * for(var i = 0; i < list.length; i++) { + * console.log("Job " + (i+1) + ": " + list[i].sid); + * } + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Jobs} The `Jobs` collection. + * + * @endpoint search/jobs + * @method splunkjs.Service + * @see splunkjs.Service.Jobs + */jobs:function(namespace){cov_1ks4ntaci2().f[10]++;cov_1ks4ntaci2().s[31]++;return new root.Jobs(this,namespace);},/** + * Gets the `DataModels` collection, which lets you create, list, + * and retrieve data models. + * + * @endpoint datamodel/model + * @method splunkjs.Service + * @see splunkjs.Service.DataModels + */dataModels:function(namespace){cov_1ks4ntaci2().f[11]++;cov_1ks4ntaci2().s[32]++;return new root.DataModels(this,namespace);},/** + * Gets the `Users` collection, which lets you create, + * list, and retrieve users. + * + * @example + * + * // List all usernames + * var users = svc.users(); + * users.fetch(function(err, users) { + * var list = users.list(); + * for(var i = 0; i < list.length; i++) { + * console.log("User " + (i+1) + ": " + list[i].properties().name); + * } + * }); + * + * @return {splunkjs.Service.Users} The `Users` collection. + * + * @endpoint authorization/users + * @method splunkjs.Service + * @see splunkjs.Service.Users + */users:function(){cov_1ks4ntaci2().f[12]++;cov_1ks4ntaci2().s[33]++;return new root.Users(this);},/** + * Gets the `Views` collection, which lets you create, + * list, and retrieve views (custom UIs built in Splunk's app framework). + * + * @example + * + * // List all views + * var views = svc.views(); + * views.fetch(function(err, views) { + * var list = views.list(); + * for(var i = 0; i < list.length; i++) { + * console.log("View " + (i+1) + ": " + list[i].properties().name); + * } + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Views} The `Views` collection. + * + * @endpoint data/ui/views + * @method splunkjs.Service + * @see splunkjs.Service.Views + */views:function(namespace){cov_1ks4ntaci2().f[13]++;cov_1ks4ntaci2().s[34]++;return new root.Views(this,namespace);},/** + * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: + * + * - Use `exec_mode=normal` to return a search job ID immediately (default). + * Poll for completion to find out when you can retrieve search results. + * + * - Use `exec_mode=blocking` to return the search job ID when the search has finished. + * + * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.oneshotSearch`. + * + * @example + * + * service.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { + * console.log("CREATED": newJob.sid); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Function} callback A function to call with the created job: `(err, createdJob)`. + * + * @endpoint search/jobs + * @method splunkjs.Service + */search:function(query,params,namespace,callback){cov_1ks4ntaci2().f[14]++;cov_1ks4ntaci2().s[35]++;if((cov_1ks4ntaci2().b[2][0]++,!callback)&&(cov_1ks4ntaci2().b[2][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[1][0]++;cov_1ks4ntaci2().s[36]++;callback=namespace;cov_1ks4ntaci2().s[37]++;namespace=null;}else{cov_1ks4ntaci2().b[1][1]++;}var jobs=(cov_1ks4ntaci2().s[38]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[39]++;return jobs.search(query,params,callback);},/** + * A convenience method to get a `Job` by its sid. + * + * @param {String} sid The search ID for a search job. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Function} callback A function to call with the created job: `(err, job)`. + * + * @endpoint search/jobs + * @method splunkjs.Service + */getJob:function(sid,namespace,callback){cov_1ks4ntaci2().f[15]++;cov_1ks4ntaci2().s[40]++;if((cov_1ks4ntaci2().b[4][0]++,!callback)&&(cov_1ks4ntaci2().b[4][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[3][0]++;cov_1ks4ntaci2().s[41]++;callback=namespace;cov_1ks4ntaci2().s[42]++;namespace=null;}else{cov_1ks4ntaci2().b[3][1]++;}var job=(cov_1ks4ntaci2().s[43]++,new root.Job(this,sid,namespace));cov_1ks4ntaci2().s[44]++;return job.fetch({},callback);},/** + * Creates a oneshot search from a given search query and optional parameters. + * + * @example + * + * service.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { + * console.log("RESULT FIELDS": results.fields); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search: + * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). + * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `rf` (_string_): Specifies one or more fields to add to the search. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Function} callback A function to call with the results of the search: `(err, results)`. + * + * @endpoint search/jobs + * @method splunkjs.Service + */oneshotSearch:function(query,params,namespace,callback){cov_1ks4ntaci2().f[16]++;cov_1ks4ntaci2().s[45]++;if((cov_1ks4ntaci2().b[6][0]++,!callback)&&(cov_1ks4ntaci2().b[6][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[5][0]++;cov_1ks4ntaci2().s[46]++;callback=namespace;cov_1ks4ntaci2().s[47]++;namespace=null;}else{cov_1ks4ntaci2().b[5][1]++;}var jobs=(cov_1ks4ntaci2().s[48]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[49]++;return jobs.oneshotSearch(query,params,callback);},/** + * Gets the user that is currently logged in. + * + * @example + * + * service.currentUser(function(err, user) { + * console.log("Real name: ", user.properties().realname); + * }); + * + * @param {Function} callback A function to call with the user instance: `(err, user)`. + * @return {splunkjs.Service.currentUser} The `User`. + * + * @endpoint authorization/current-context + * @method splunkjs.Service + */currentUser:function(callback){cov_1ks4ntaci2().f[17]++;cov_1ks4ntaci2().s[50]++;callback=(cov_1ks4ntaci2().b[7][0]++,callback)||(cov_1ks4ntaci2().b[7][1]++,function(){cov_1ks4ntaci2().f[18]++;});var that=(cov_1ks4ntaci2().s[51]++,this);var req=(cov_1ks4ntaci2().s[52]++,this.get(Paths.currentUser,{},function(err,response){cov_1ks4ntaci2().f[19]++;cov_1ks4ntaci2().s[53]++;if(err){cov_1ks4ntaci2().b[8][0]++;cov_1ks4ntaci2().s[54]++;callback(err);}else{cov_1ks4ntaci2().b[8][1]++;var username=(cov_1ks4ntaci2().s[55]++,response.data.entry[0].content.username);var user=(cov_1ks4ntaci2().s[56]++,new root.User(that,username));cov_1ks4ntaci2().s[57]++;user.fetch(function(){cov_1ks4ntaci2().f[20]++;cov_1ks4ntaci2().s[58]++;if(req.wasAborted){cov_1ks4ntaci2().b[9][0]++;cov_1ks4ntaci2().s[59]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[9][1]++;cov_1ks4ntaci2().s[60]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[61]++;return req;},/** + * Gets configuration information about the server. + * + * @example + * + * service.serverInfo(function(err, info) { + * console.log("Splunk Version: ", info.properties().version); + * }); + * + * @param {Function} callback A function to call with the server info: `(err, info)`. + * + * @endpoint server/info + * @method splunkjs.Service + */serverInfo:function(callback){cov_1ks4ntaci2().f[21]++;cov_1ks4ntaci2().s[62]++;callback=(cov_1ks4ntaci2().b[10][0]++,callback)||(cov_1ks4ntaci2().b[10][1]++,function(){cov_1ks4ntaci2().f[22]++;});var serverInfo=(cov_1ks4ntaci2().s[63]++,new root.ServerInfo(this));cov_1ks4ntaci2().s[64]++;return serverInfo.fetch(callback);},/** + * Parses a search query. + * + * @example + * + * service.parse("search index=_internal | head 1", function(err, parse) { + * console.log("Commands: ", parse.commands); + * }); + * + * @param {String} query The search query to parse. + * @param {Object} params An object of options for the parser: + * - `enable_lookups` (_boolean_): If `true`, performs reverse lookups to expand the search expression. + * - `output_mode` (_string_): The output format (XML or JSON). + * - `parse_only` (_boolean_): If `true`, disables the expansion of search due to evaluation of subsearches, time term expansion, lookups, tags, eventtypes, and sourcetype alias. + * - `reload_macros` (_boolean_): If `true`, reloads macro definitions from macros.conf. + * @param {Function} callback A function to call with the parse info: `(err, parse)`. + * + * @endpoint search/parser + * @method splunkjs.Service + */parse:function(query,params,callback){cov_1ks4ntaci2().f[23]++;cov_1ks4ntaci2().s[65]++;if((cov_1ks4ntaci2().b[12][0]++,!callback)&&(cov_1ks4ntaci2().b[12][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[11][0]++;cov_1ks4ntaci2().s[66]++;callback=params;cov_1ks4ntaci2().s[67]++;params={};}else{cov_1ks4ntaci2().b[11][1]++;}cov_1ks4ntaci2().s[68]++;callback=(cov_1ks4ntaci2().b[13][0]++,callback)||(cov_1ks4ntaci2().b[13][1]++,function(){cov_1ks4ntaci2().f[24]++;});cov_1ks4ntaci2().s[69]++;params=(cov_1ks4ntaci2().b[14][0]++,params)||(cov_1ks4ntaci2().b[14][1]++,{});cov_1ks4ntaci2().s[70]++;params.q=query;cov_1ks4ntaci2().s[71]++;return this.get(Paths.parser,params,function(err,response){cov_1ks4ntaci2().f[25]++;cov_1ks4ntaci2().s[72]++;if(err){cov_1ks4ntaci2().b[15][0]++;cov_1ks4ntaci2().s[73]++;callback(err);}else{cov_1ks4ntaci2().b[15][1]++;cov_1ks4ntaci2().s[74]++;callback(null,response.data);}});},/** + * Provides auto-complete suggestions for search queries. + * + * @example + * + * service.typeahead("index=", 10, function(err, options) { + * console.log("Autocompletion options: ", options); + * }); + * + * @param {String} prefix The query fragment to autocomplete. + * @param {Number} count The number of options to return (optional). + * @param {Function} callback A function to call with the autocompletion info: `(err, options)`. + * + * @endpoint search/typeahead + * @method splunkjs.Service + */typeahead:function(prefix,count,callback){cov_1ks4ntaci2().f[26]++;cov_1ks4ntaci2().s[75]++;if((cov_1ks4ntaci2().b[17][0]++,!callback)&&(cov_1ks4ntaci2().b[17][1]++,utils.isFunction(count))){cov_1ks4ntaci2().b[16][0]++;cov_1ks4ntaci2().s[76]++;callback=count;cov_1ks4ntaci2().s[77]++;count=10;}else{cov_1ks4ntaci2().b[16][1]++;}cov_1ks4ntaci2().s[78]++;callback=(cov_1ks4ntaci2().b[18][0]++,callback)||(cov_1ks4ntaci2().b[18][1]++,function(){cov_1ks4ntaci2().f[27]++;});var params=(cov_1ks4ntaci2().s[79]++,{count:(cov_1ks4ntaci2().b[19][0]++,count)||(cov_1ks4ntaci2().b[19][1]++,10),prefix:prefix});cov_1ks4ntaci2().s[80]++;return this.get(Paths.typeahead,params,function(err,response){cov_1ks4ntaci2().f[28]++;cov_1ks4ntaci2().s[81]++;if(err){cov_1ks4ntaci2().b[20][0]++;cov_1ks4ntaci2().s[82]++;callback(err);}else{cov_1ks4ntaci2().b[20][1]++;var results=(cov_1ks4ntaci2().s[83]++,((cov_1ks4ntaci2().b[21][0]++,response.data)||(cov_1ks4ntaci2().b[21][1]++,{})).results);cov_1ks4ntaci2().s[84]++;callback(null,(cov_1ks4ntaci2().b[22][0]++,results)||(cov_1ks4ntaci2().b[22][1]++,[]));}});},/** + * Logs an event to Splunk. + * + * @example + * + * service.log("A new event", {index: "_internal", sourcetype: "mysourcetype"}, function(err, result) { + * console.log("Submitted event: ", result); + * }); + * + * @param {String|Object} event The text for this event, or a JSON object. + * @param {Object} params A dictionary of parameters for indexing: + * - `index` (_string_): The index to send events from this input to. + * - `host` (_string_): The value to populate in the Host field for events from this data input. + * - `host_regex` (_string_): A regular expression used to extract the host value from each event. + * - `source` (_string_): The value to populate in the Source field for events from this data input. + * - `sourcetype` (_string_): The value to populate in the Sourcetype field for events from this data input. + * @param {Function} callback A function to call when the event is submitted: `(err, result)`. + * + * @endpoint receivers/simple + * @method splunkjs.Service + */log:function(event,params,callback){cov_1ks4ntaci2().f[29]++;cov_1ks4ntaci2().s[85]++;if((cov_1ks4ntaci2().b[24][0]++,!callback)&&(cov_1ks4ntaci2().b[24][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[23][0]++;cov_1ks4ntaci2().s[86]++;callback=params;cov_1ks4ntaci2().s[87]++;params={};}else{cov_1ks4ntaci2().b[23][1]++;}cov_1ks4ntaci2().s[88]++;callback=(cov_1ks4ntaci2().b[25][0]++,callback)||(cov_1ks4ntaci2().b[25][1]++,function(){cov_1ks4ntaci2().f[30]++;});cov_1ks4ntaci2().s[89]++;params=(cov_1ks4ntaci2().b[26][0]++,params)||(cov_1ks4ntaci2().b[26][1]++,{});// If the event is a JSON object, convert it to a string. +cov_1ks4ntaci2().s[90]++;if(utils.isObject(event)){cov_1ks4ntaci2().b[27][0]++;cov_1ks4ntaci2().s[91]++;event=JSON.stringify(event);}else{cov_1ks4ntaci2().b[27][1]++;}var path=(cov_1ks4ntaci2().s[92]++,this.paths.submitEvent);var method=(cov_1ks4ntaci2().s[93]++,"POST");var headers=(cov_1ks4ntaci2().s[94]++,{"Content-Type":"text/plain"});var body=(cov_1ks4ntaci2().s[95]++,event);var get=(cov_1ks4ntaci2().s[96]++,params);var post=(cov_1ks4ntaci2().s[97]++,{});var req=(cov_1ks4ntaci2().s[98]++,this.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[31]++;cov_1ks4ntaci2().s[99]++;if(err){cov_1ks4ntaci2().b[28][0]++;cov_1ks4ntaci2().s[100]++;callback(err);}else{cov_1ks4ntaci2().b[28][1]++;cov_1ks4ntaci2().s[101]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[102]++;return req;}});/** + * Provides a base definition for a Splunk endpoint, which is a combination of + * a specific service and path. Provides convenience methods for GET, POST, and + * DELETE operations used in splunkjs, automatically preparing the path correctly + * and allowing for relative calls. + * + * @class splunkjs.Service.Endpoint + */cov_1ks4ntaci2().s[103]++;root.Endpoint=Class.extend({/** + * Constructor for `splunkjs.Service.Endpoint`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} qualifiedPath A fully-qualified relative endpoint path (for example, "/services/search/jobs"). + * @return {splunkjs.Service.Endpoint} A new `splunkjs.Service.Endpoint` instance. + * + * @method splunkjs.Service.Endpoint + */init:function(service,qualifiedPath){cov_1ks4ntaci2().f[32]++;cov_1ks4ntaci2().s[104]++;if(!service){cov_1ks4ntaci2().b[29][0]++;cov_1ks4ntaci2().s[105]++;throw new Error("Passed in a null Service.");}else{cov_1ks4ntaci2().b[29][1]++;}cov_1ks4ntaci2().s[106]++;if(!qualifiedPath){cov_1ks4ntaci2().b[30][0]++;cov_1ks4ntaci2().s[107]++;throw new Error("Passed in an empty path.");}else{cov_1ks4ntaci2().b[30][1]++;}cov_1ks4ntaci2().s[108]++;this.service=service;cov_1ks4ntaci2().s[109]++;this.qualifiedPath=qualifiedPath;// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[110]++;this.get=utils.bind(this,this.get);// this.get_v2 = utils.bind(this, this.get_v2); +cov_1ks4ntaci2().s[111]++;this.post=utils.bind(this,this.post);cov_1ks4ntaci2().s[112]++;this.del=utils.bind(this,this.del);},/** + * Performs a relative GET request on an endpoint's path, + * combined with the parameters and a relative path if specified. + * + * @example + * + * // Will make a request to {service.prefix}/search/jobs/123456/results?offset=1 + * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); + * endpoint.get("results", {offset: 1}, function() { console.log("DONE"))}); + * + * @param {String} relpath A relative path to append to the endpoint path. + * @param {Object} params A dictionary of entity-specific parameters to add to the query string. + * @param {Function} callback A function to call when the request is complete: `(err, response)`. + * + * @method splunkjs.Service.Endpoint + */get:function(relpath,params,callback){cov_1ks4ntaci2().f[33]++;var url=(cov_1ks4ntaci2().s[113]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[114]++;if(relpath){cov_1ks4ntaci2().b[31][0]++;cov_1ks4ntaci2().s[115]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[31][1]++;}cov_1ks4ntaci2().s[116]++;return this.service.get(url,params,callback);},get_v2:function(relpath,params){cov_1ks4ntaci2().f[34]++;var url=(cov_1ks4ntaci2().s[117]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[118]++;if(relpath){cov_1ks4ntaci2().b[32][0]++;cov_1ks4ntaci2().s[119]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[32][1]++;}cov_1ks4ntaci2().s[120]++;return this.service.get_v2(url,params);},/** + * Performs a relative POST request on an endpoint's path, + * combined with the parameters and a relative path if specified. + * + * @example + * + * // Will make a request to {service.prefix}/search/jobs/123456/control + * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); + * endpoint.post("control", {action: "cancel"}, function() { console.log("CANCELLED"))}); + * + * @param {String} relpath A relative path to append to the endpoint path. + * @param {Object} params A dictionary of entity-specific parameters to add to the body. + * @param {Function} callback A function to call when the request is complete: `(err, response)`. + * + * @method splunkjs.Service.Endpoint + */post:function(relpath,params,callback){cov_1ks4ntaci2().f[35]++;var url=(cov_1ks4ntaci2().s[121]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[122]++;if(relpath){cov_1ks4ntaci2().b[33][0]++;cov_1ks4ntaci2().s[123]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[33][1]++;}cov_1ks4ntaci2().s[124]++;return this.service.post(url,params,callback);},/** + * Performs a relative DELETE request on an endpoint's path, + * combined with the parameters and a relative path if specified. + * + * @example + * + * // Will make a request to {service.prefix}/search/jobs/123456 + * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); + * endpoint.delete("", {}, function() { console.log("DELETED"))}); + * + * @param {String} relpath A relative path to append to the endpoint path. + * @param {Object} params A dictionary of entity-specific parameters to add to the query string. + * @param {Function} callback A function to call when the request is complete: `(err, response)`. + * + * @method splunkjs.Service.Endpoint + */del:function(relpath,params,callback){cov_1ks4ntaci2().f[36]++;var url=(cov_1ks4ntaci2().s[125]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[126]++;if(relpath){cov_1ks4ntaci2().b[34][0]++;cov_1ks4ntaci2().s[127]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[34][1]++;}cov_1ks4ntaci2().s[128]++;return this.service.del(url,params,callback);}});/** + * Provides a base definition for a Splunk resource (for example, an entity + * such as an index or search job, or a collection of entities). Provides + * basic methods for handling Splunk resources, such as validation and + * accessing properties. + * + * This class should not be used directly because most methods are meant to be overridden. + * + * @class splunkjs.Service.Resource + * @extends splunkjs.Service.Endpoint + */cov_1ks4ntaci2().s[129]++;root.Resource=root.Endpoint.extend({/** + * Constructor for `splunkjs.Service.Resource`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} path A relative endpoint path (for example, "search/jobs"). + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Resource} A new `splunkjs.Service.Resource` instance. + * + * @method splunkjs.Service.Resource + */init:function(service,path,namespace){cov_1ks4ntaci2().f[37]++;var fullpath=(cov_1ks4ntaci2().s[130]++,service.fullpath(path,namespace));cov_1ks4ntaci2().s[131]++;this._super(service,fullpath);cov_1ks4ntaci2().s[132]++;this.namespace=namespace;cov_1ks4ntaci2().s[133]++;this._properties={};cov_1ks4ntaci2().s[134]++;this._state={};// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[135]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[136]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[137]++;this.properties=utils.bind(this,this.properties);cov_1ks4ntaci2().s[138]++;this.state=utils.bind(this,this.state);cov_1ks4ntaci2().s[139]++;this.path=utils.bind(this,this.path);},/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Resource + */path:function(){cov_1ks4ntaci2().f[38]++;cov_1ks4ntaci2().s[140]++;throw new Error("MUST BE OVERRIDDEN");},/** + * Loads the resource and stores the properties. + * + * @param {Object} properties The properties for this resource. + * + * @method splunkjs.Service.Resource + * @protected + */_load:function(properties){cov_1ks4ntaci2().f[39]++;cov_1ks4ntaci2().s[141]++;this._properties=(cov_1ks4ntaci2().b[35][0]++,properties)||(cov_1ks4ntaci2().b[35][1]++,{});cov_1ks4ntaci2().s[142]++;this._state=(cov_1ks4ntaci2().b[36][0]++,properties)||(cov_1ks4ntaci2().b[36][1]++,{});},/** + * Refreshes the resource by fetching the object from the server + * and loading it. + * + * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. + * + * @method splunkjs.Service.Resource + * @protected + */fetch:function(callback){cov_1ks4ntaci2().f[40]++;cov_1ks4ntaci2().s[143]++;throw new Error("MUST BE OVERRIDDEN");},/** + * Retrieves the current properties for this resource. + * + * @return {Object} The properties. + * + * @method splunkjs.Service.Resource + */properties:function(){cov_1ks4ntaci2().f[41]++;cov_1ks4ntaci2().s[144]++;return this._properties;},/** + * Retrieves the current full state (properties and metadata) of this resource. + * + * @return {Object} The current full state of this resource. + * + * @method splunkjs.Service.Resource + */state:function(){cov_1ks4ntaci2().f[42]++;cov_1ks4ntaci2().s[145]++;return this._state;}});/** + * Defines a base class for a Splunk entity, which is a well-defined construct + * with certain operations (such as "properties", "update", and "delete"). + * Entities include search jobs, indexes, inputs, apps, and more. + * + * Provides basic methods for working with Splunk entities, such as fetching and + * updating them. + * + * @class splunkjs.Service.Entity + * @extends splunkjs.Service.Resource + */cov_1ks4ntaci2().s[146]++;root.Entity=root.Resource.extend({/** + * A static property that indicates whether to call `fetch` after an + * update to get the updated entity. By default, the entity is not + * fetched because the endpoint returns (echoes) the updated entity. + * + * @method splunkjs.Service.Entity + */fetchOnUpdate:false,/** + * Constructor for `splunkjs.Service.Entity`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} path A relative endpoint path (for example, "search/jobs"). + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. + * + * @method splunkjs.Service.Entity + */init:function(service,path,namespace){cov_1ks4ntaci2().f[43]++;cov_1ks4ntaci2().s[147]++;this._super(service,path,namespace);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[148]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[149]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[150]++;this.remove=utils.bind(this,this.remove);cov_1ks4ntaci2().s[151]++;this.update=utils.bind(this,this.update);cov_1ks4ntaci2().s[152]++;this.fields=utils.bind(this,this.fields);cov_1ks4ntaci2().s[153]++;this.links=utils.bind(this,this.links);cov_1ks4ntaci2().s[154]++;this.acl=utils.bind(this,this.acl);cov_1ks4ntaci2().s[155]++;this.author=utils.bind(this,this.author);cov_1ks4ntaci2().s[156]++;this.updated=utils.bind(this,this.updated);cov_1ks4ntaci2().s[157]++;this.published=utils.bind(this,this.published);cov_1ks4ntaci2().s[158]++;this.enable=utils.bind(this,this.enable);cov_1ks4ntaci2().s[159]++;this.disable=utils.bind(this,this.disable);cov_1ks4ntaci2().s[160]++;this.reload=utils.bind(this,this.reload);// Initial values +cov_1ks4ntaci2().s[161]++;this._properties={};cov_1ks4ntaci2().s[162]++;this._fields={};cov_1ks4ntaci2().s[163]++;this._acl={};cov_1ks4ntaci2().s[164]++;this._links={};},/** + * Loads the entity and stores the properties. + * + * @param {Object} properties The properties for this entity. + * + * @method splunkjs.Service.Entity + * @protected + */_load:function(properties){cov_1ks4ntaci2().f[44]++;cov_1ks4ntaci2().s[165]++;properties=utils.isArray(properties)?(cov_1ks4ntaci2().b[37][0]++,properties[0]):(cov_1ks4ntaci2().b[37][1]++,properties);// Initialize the properties to +// empty values +cov_1ks4ntaci2().s[166]++;properties=(cov_1ks4ntaci2().b[38][0]++,properties)||(cov_1ks4ntaci2().b[38][1]++,{content:{},fields:{},acl:{},links:{}});cov_1ks4ntaci2().s[167]++;this._super(properties);// Take out the entity-specific content +cov_1ks4ntaci2().s[168]++;this._properties=(cov_1ks4ntaci2().b[39][0]++,properties.content)||(cov_1ks4ntaci2().b[39][1]++,{});cov_1ks4ntaci2().s[169]++;this._fields=(cov_1ks4ntaci2().b[40][0]++,properties.fields)||(cov_1ks4ntaci2().b[40][1]++,this._fields)||(cov_1ks4ntaci2().b[40][2]++,{});cov_1ks4ntaci2().s[170]++;this._acl=(cov_1ks4ntaci2().b[41][0]++,properties.acl)||(cov_1ks4ntaci2().b[41][1]++,{});cov_1ks4ntaci2().s[171]++;this._links=(cov_1ks4ntaci2().b[42][0]++,properties.links)||(cov_1ks4ntaci2().b[42][1]++,{});cov_1ks4ntaci2().s[172]++;this._author=(cov_1ks4ntaci2().b[43][0]++,properties.author)||(cov_1ks4ntaci2().b[43][1]++,null);cov_1ks4ntaci2().s[173]++;this._updated=(cov_1ks4ntaci2().b[44][0]++,properties.updated)||(cov_1ks4ntaci2().b[44][1]++,null);cov_1ks4ntaci2().s[174]++;this._published=(cov_1ks4ntaci2().b[45][0]++,properties.published)||(cov_1ks4ntaci2().b[45][1]++,null);},/** + * Retrieves the fields information for this entity, indicating which + * fields are wildcards, required, and optional. + * + * @return {Object} The fields information. + * + * @method splunkjs.Service.Entity + */fields:function(){cov_1ks4ntaci2().f[45]++;cov_1ks4ntaci2().s[175]++;return this._fields;},/** + * Retrieves the access control list (ACL) information for this entity, + * which contains the permissions for accessing the entity. + * + * @return {Object} The ACL. + * + * @method splunkjs.Service.Entity + */acl:function(){cov_1ks4ntaci2().f[46]++;cov_1ks4ntaci2().s[176]++;return this._acl;},/** + * Retrieves the links information for this entity, which is the URI of + * the entity relative to the management port of a Splunk instance. + * + * @return {Object} The links information. + * + * @method splunkjs.Service.Entity + */links:function(){cov_1ks4ntaci2().f[47]++;cov_1ks4ntaci2().s[177]++;return this._links;},/** + * Retrieves the author information for this entity. + * + * @return {String} The author. + * + * @method splunkjs.Service.Entity + */author:function(){cov_1ks4ntaci2().f[48]++;cov_1ks4ntaci2().s[178]++;return this._author;},/** + * Retrieves the updated time for this entity. + * + * @return {String} The updated time. + * + * @method splunkjs.Service.Entity + */updated:function(){cov_1ks4ntaci2().f[49]++;cov_1ks4ntaci2().s[179]++;return this._updated;},/** + * Retrieves the published time for this entity. + * + * @return {String} The published time. + * + * @method splunkjs.Service.Entity + */published:function(){cov_1ks4ntaci2().f[50]++;cov_1ks4ntaci2().s[180]++;return this._published;},/** + * Refreshes the entity by fetching the object from the server and + * loading it. + * + * @param {Object} options An optional dictionary of collection filtering and pagination options: + * - `count` (_integer_): The maximum number of items to return. + * - `offset` (_integer_): The offset of the first item to return. + * - `search` (_string_): The search query to filter responses. + * - `sort_dir` (_string_): The direction to sort returned items: “asc” or “desc”. + * - `sort_key` (_string_): The field to use for sorting (optional). + * - `sort_mode` (_string_): The collating sequence for sorting returned items: “auto”, “alpha”, “alpha_case”, or “num”. + * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. + * + * @method splunkjs.Service.Entity + */fetch:function(options,callback){cov_1ks4ntaci2().f[51]++;cov_1ks4ntaci2().s[181]++;if((cov_1ks4ntaci2().b[47][0]++,!callback)&&(cov_1ks4ntaci2().b[47][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[46][0]++;cov_1ks4ntaci2().s[182]++;callback=options;cov_1ks4ntaci2().s[183]++;options={};}else{cov_1ks4ntaci2().b[46][1]++;}cov_1ks4ntaci2().s[184]++;callback=(cov_1ks4ntaci2().b[48][0]++,callback)||(cov_1ks4ntaci2().b[48][1]++,function(){cov_1ks4ntaci2().f[52]++;});cov_1ks4ntaci2().s[185]++;options=(cov_1ks4ntaci2().b[49][0]++,options)||(cov_1ks4ntaci2().b[49][1]++,{});var that=(cov_1ks4ntaci2().s[186]++,this);cov_1ks4ntaci2().s[187]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[53]++;cov_1ks4ntaci2().s[188]++;if(err){cov_1ks4ntaci2().b[50][0]++;cov_1ks4ntaci2().s[189]++;callback(err);}else{cov_1ks4ntaci2().b[50][1]++;cov_1ks4ntaci2().s[190]++;that._load(response.data?(cov_1ks4ntaci2().b[51][0]++,response.data.entry):(cov_1ks4ntaci2().b[51][1]++,null));cov_1ks4ntaci2().s[191]++;callback(null,that);}});},/** + * Deletes the entity from the server. + * + * @param {Function} callback A function to call when the object is deleted: `(err)`. + * + * @method splunkjs.Service.Entity + * @protected + */remove:function(callback){cov_1ks4ntaci2().f[54]++;cov_1ks4ntaci2().s[192]++;callback=(cov_1ks4ntaci2().b[52][0]++,callback)||(cov_1ks4ntaci2().b[52][1]++,function(){cov_1ks4ntaci2().f[55]++;});var that=(cov_1ks4ntaci2().s[193]++,this);cov_1ks4ntaci2().s[194]++;return this.del("",{},function(err){cov_1ks4ntaci2().f[56]++;cov_1ks4ntaci2().s[195]++;callback(err);});},/** + * Updates the entity on the server. + * + * @param {Object} props The properties to update the object with. + * @param {Function} callback A function to call when the object is updated: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */update:function(props,callback){cov_1ks4ntaci2().f[57]++;cov_1ks4ntaci2().s[196]++;callback=(cov_1ks4ntaci2().b[53][0]++,callback)||(cov_1ks4ntaci2().b[53][1]++,function(){cov_1ks4ntaci2().f[58]++;});cov_1ks4ntaci2().s[197]++;if(props.hasOwnProperty("name")){cov_1ks4ntaci2().b[54][0]++;cov_1ks4ntaci2().s[198]++;throw new Error("Cannot set 'name' field in 'update'");}else{cov_1ks4ntaci2().b[54][1]++;}var that=(cov_1ks4ntaci2().s[199]++,this);var req=(cov_1ks4ntaci2().s[200]++,this.post("",props,function(err,response){cov_1ks4ntaci2().f[59]++;cov_1ks4ntaci2().s[201]++;if((cov_1ks4ntaci2().b[56][0]++,!err)&&(cov_1ks4ntaci2().b[56][1]++,!that.fetchOnUpdate)){cov_1ks4ntaci2().b[55][0]++;cov_1ks4ntaci2().s[202]++;that._load(response.data.entry);cov_1ks4ntaci2().s[203]++;callback(err,that);}else{cov_1ks4ntaci2().b[55][1]++;cov_1ks4ntaci2().s[204]++;if((cov_1ks4ntaci2().b[58][0]++,!err)&&(cov_1ks4ntaci2().b[58][1]++,that.fetchOnUpdate)){cov_1ks4ntaci2().b[57][0]++;cov_1ks4ntaci2().s[205]++;that.fetch(function(){cov_1ks4ntaci2().f[60]++;cov_1ks4ntaci2().s[206]++;if(req.wasAborted){cov_1ks4ntaci2().b[59][0]++;cov_1ks4ntaci2().s[207]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[59][1]++;cov_1ks4ntaci2().s[208]++;callback.apply(null,arguments);}});}else{cov_1ks4ntaci2().b[57][1]++;cov_1ks4ntaci2().s[209]++;callback(err,that);}}}));cov_1ks4ntaci2().s[210]++;return req;},/** + * Disables the entity on the server. + * + * @param {Function} callback A function to call when the object is disabled: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */disable:function(callback){cov_1ks4ntaci2().f[61]++;cov_1ks4ntaci2().s[211]++;callback=(cov_1ks4ntaci2().b[60][0]++,callback)||(cov_1ks4ntaci2().b[60][1]++,function(){cov_1ks4ntaci2().f[62]++;});var that=(cov_1ks4ntaci2().s[212]++,this);cov_1ks4ntaci2().s[213]++;this.post("disable",{},function(err,response){cov_1ks4ntaci2().f[63]++;cov_1ks4ntaci2().s[214]++;if(err){cov_1ks4ntaci2().b[61][0]++;cov_1ks4ntaci2().s[215]++;callback(err);}else{cov_1ks4ntaci2().b[61][1]++;cov_1ks4ntaci2().s[216]++;callback(null,that);}});},/** + * Enables the entity on the server. + * + * @param {Function} callback A function to call when the object is enabled: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */enable:function(callback){cov_1ks4ntaci2().f[64]++;cov_1ks4ntaci2().s[217]++;callback=(cov_1ks4ntaci2().b[62][0]++,callback)||(cov_1ks4ntaci2().b[62][1]++,function(){cov_1ks4ntaci2().f[65]++;});var that=(cov_1ks4ntaci2().s[218]++,this);cov_1ks4ntaci2().s[219]++;this.post("enable",{},function(err,response){cov_1ks4ntaci2().f[66]++;cov_1ks4ntaci2().s[220]++;if(err){cov_1ks4ntaci2().b[63][0]++;cov_1ks4ntaci2().s[221]++;callback(err);}else{cov_1ks4ntaci2().b[63][1]++;cov_1ks4ntaci2().s[222]++;callback(null,that);}});},/** + * Reloads the entity on the server. + * + * @param {Function} callback A function to call when the object is reloaded: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */reload:function(callback){cov_1ks4ntaci2().f[67]++;cov_1ks4ntaci2().s[223]++;callback=(cov_1ks4ntaci2().b[64][0]++,callback)||(cov_1ks4ntaci2().b[64][1]++,function(){cov_1ks4ntaci2().f[68]++;});var that=(cov_1ks4ntaci2().s[224]++,this);cov_1ks4ntaci2().s[225]++;this.post("_reload",{},function(err,response){cov_1ks4ntaci2().f[69]++;cov_1ks4ntaci2().s[226]++;if(err){cov_1ks4ntaci2().b[65][0]++;cov_1ks4ntaci2().s[227]++;callback(err);}else{cov_1ks4ntaci2().b[65][1]++;cov_1ks4ntaci2().s[228]++;callback(null,that);}});}});/** + * Defines a base class for a Splunk collection, which is a well-defined construct + * that provides basic methods for working with collections of entities, such as + * creating and listing entities. + * + * @class splunkjs.Service.Collection + * @extends splunkjs.Service.Resource + */cov_1ks4ntaci2().s[229]++;root.Collection=root.Resource.extend({/** + * A static property that indicates whether to call `fetch` after an + * entity has been created. By default, the entity is not fetched + * because the endpoint returns (echoes) the new entity. + + * @method splunkjs.Service.Collection + */fetchOnEntityCreation:false,/** + * Constructor for `splunkjs.Service.Collection`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} path A relative endpoint path (for example, "search/jobs"). + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Collection} A new `splunkjs.Service.Collection` instance. + * + * @method splunkjs.Service.Collection + */init:function(service,path,namespace){cov_1ks4ntaci2().f[70]++;cov_1ks4ntaci2().s[230]++;this._super(service,path,namespace);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[231]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[232]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[233]++;this.create=utils.bind(this,this.create);cov_1ks4ntaci2().s[234]++;this.list=utils.bind(this,this.list);cov_1ks4ntaci2().s[235]++;this.item=utils.bind(this,this.item);cov_1ks4ntaci2().s[236]++;this.instantiateEntity=utils.bind(this,this.instantiateEntity);// Initial values +cov_1ks4ntaci2().s[237]++;this._entities=[];cov_1ks4ntaci2().s[238]++;this._entitiesByName={};cov_1ks4ntaci2().s[239]++;this._properties={};cov_1ks4ntaci2().s[240]++;this._paging={};cov_1ks4ntaci2().s[241]++;this._links={};},/** + * Creates a local instance of an entity. + * + * @param {Object} props The properties for this entity. + * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. + * + * @method splunkjs.Service.Collection + */instantiateEntity:function(props){cov_1ks4ntaci2().f[71]++;cov_1ks4ntaci2().s[242]++;throw new Error("MUST BE OVERRIDDEN");},/** + * Loads the collection and properties, and creates a map of entity + * names to entity IDs (for retrieval purposes). + * + * @param {Object} properties The properties for this collection. + * + * @method splunkjs.Service.Collection + * @private + */_load:function(properties){cov_1ks4ntaci2().f[72]++;cov_1ks4ntaci2().s[243]++;this._super(properties);var entities=(cov_1ks4ntaci2().s[244]++,[]);var entitiesByName=(cov_1ks4ntaci2().s[245]++,{});var entityPropertyList=(cov_1ks4ntaci2().s[246]++,(cov_1ks4ntaci2().b[66][0]++,properties.entry)||(cov_1ks4ntaci2().b[66][1]++,[]));cov_1ks4ntaci2().s[247]++;for(var i=(cov_1ks4ntaci2().s[248]++,0);i1)&&(cov_1ks4ntaci2().b[90][1]++,!namespace)){cov_1ks4ntaci2().b[89][0]++;cov_1ks4ntaci2().s[302]++;// If there is more than one entity and we didn't +// specify a namespace, then we return an error +// saying the match is ambiguous +throw new Error("Ambiguous match for name '"+id+"'");}else{cov_1ks4ntaci2().b[89][1]++;cov_1ks4ntaci2().s[303]++;// There is more than one entity, and we do have +// a namespace, so we try and find it +for(var i=(cov_1ks4ntaci2().s[304]++,0);iPagination and Filtering options in the REST API documentation. + * @param {Function} callback A function to call when the history is retrieved: `(err, job, savedSearch)`. + * + * @endpoint saved/searches/{name}/history + * @method splunkjs.Service.SavedSearch + */history:function(options,callback){cov_1ks4ntaci2().f[97]++;cov_1ks4ntaci2().s[358]++;if((cov_1ks4ntaci2().b[106][0]++,!callback)&&(cov_1ks4ntaci2().b[106][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[105][0]++;cov_1ks4ntaci2().s[359]++;callback=options;cov_1ks4ntaci2().s[360]++;options={};}else{cov_1ks4ntaci2().b[105][1]++;}cov_1ks4ntaci2().s[361]++;callback=(cov_1ks4ntaci2().b[107][0]++,callback)||(cov_1ks4ntaci2().b[107][1]++,function(){cov_1ks4ntaci2().f[98]++;});cov_1ks4ntaci2().s[362]++;options=(cov_1ks4ntaci2().b[108][0]++,options)||(cov_1ks4ntaci2().b[108][1]++,{});var that=(cov_1ks4ntaci2().s[363]++,this);cov_1ks4ntaci2().s[364]++;return this.get("history",options,function(err,response){cov_1ks4ntaci2().f[99]++;cov_1ks4ntaci2().s[365]++;if(err){cov_1ks4ntaci2().b[109][0]++;cov_1ks4ntaci2().s[366]++;callback(err);cov_1ks4ntaci2().s[367]++;return;}else{cov_1ks4ntaci2().b[109][1]++;}var jobs=(cov_1ks4ntaci2().s[368]++,[]);var data=(cov_1ks4ntaci2().s[369]++,(cov_1ks4ntaci2().b[110][0]++,response.data.entry)||(cov_1ks4ntaci2().b[110][1]++,[]));cov_1ks4ntaci2().s[370]++;for(var i=(cov_1ks4ntaci2().s[371]++,0);iSaved search parameters on Splunk Developer Portal. + * @param {Function} callback A function to call when the object is updated: `(err, entity)`. + * + * @method splunkjs.Service.SavedSearch + */update:function(params,callback){cov_1ks4ntaci2().f[103]++;cov_1ks4ntaci2().s[382]++;params=(cov_1ks4ntaci2().b[112][0]++,params)||(cov_1ks4ntaci2().b[112][1]++,{});cov_1ks4ntaci2().s[383]++;if(!params.search){cov_1ks4ntaci2().b[113][0]++;var update=(cov_1ks4ntaci2().s[384]++,this._super);var req=(cov_1ks4ntaci2().s[385]++,this.fetch(function(err,search){cov_1ks4ntaci2().f[104]++;cov_1ks4ntaci2().s[386]++;if(err){cov_1ks4ntaci2().b[114][0]++;cov_1ks4ntaci2().s[387]++;callback(err);}else{cov_1ks4ntaci2().b[114][1]++;cov_1ks4ntaci2().s[388]++;params.search=search.properties().search;cov_1ks4ntaci2().s[389]++;update.call(search,params,function(){cov_1ks4ntaci2().f[105]++;cov_1ks4ntaci2().s[390]++;if(req.wasAborted){cov_1ks4ntaci2().b[115][0]++;cov_1ks4ntaci2().s[391]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[115][1]++;cov_1ks4ntaci2().s[392]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[393]++;return req;}else{cov_1ks4ntaci2().b[113][1]++;cov_1ks4ntaci2().s[394]++;return this._super(params,callback);}}});/** + * Represents a collection of saved searches. You can create and list saved + * searches using this collection container, or get a specific saved search. + * + * + * @endpoint saved/searches + * @class splunkjs.Service.SavedSearches + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[395]++;root.SavedSearches=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.SavedSearches + */path:function(){cov_1ks4ntaci2().f[106]++;cov_1ks4ntaci2().s[396]++;return Paths.savedSearches;},/** + * Creates a local instance of a saved search. + * + * @param {Object} props The properties for the new saved search. For a list of available parameters, see Saved search parameters on Splunk Developer Portal. + * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.SavedSearch` instance. + * + * @method splunkjs.Service.SavedSearches + */instantiateEntity:function(props){cov_1ks4ntaci2().f[107]++;var entityNamespace=(cov_1ks4ntaci2().s[397]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[398]++;return new root.SavedSearch(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.SavedSearches`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.SavedSearches} A new `splunkjs.Service.SavedSearches` instance. + * + * @method splunkjs.Service.SavedSearches + */init:function(service,namespace){cov_1ks4ntaci2().f[108]++;cov_1ks4ntaci2().s[399]++;this._super(service,this.path(),namespace);}});/** + * Represents a specific storage password, which you can then view, modify, and + * remove. + * + * @endpoint storage/passwords/{name} + * @class splunkjs.Service.StoragePassword + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[400]++;root.StoragePassword=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.StoragePassword + */path:function(){cov_1ks4ntaci2().f[109]++;cov_1ks4ntaci2().s[401]++;return Paths.storagePasswords+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.StoragePassword`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name for the new storage password. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.StoragePassword} A new `splunkjs.Service.StoragePassword` instance. + * + * @method splunkjs.Service.StoragePassword + */init:function(service,name,namespace){cov_1ks4ntaci2().f[110]++;cov_1ks4ntaci2().s[402]++;this.name=name;cov_1ks4ntaci2().s[403]++;this._super(service,this.path(),namespace);}});/** + * Represents a collection of storage passwords. You can create and list storage + * passwords using this collection container, or get a specific storage password. + * + * @endpoint storage/passwords + * @class splunkjs.Service.StoragePasswords + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[404]++;root.StoragePasswords=root.Collection.extend({/** + * Indicates whether to call `fetch` after an entity has been created. By + * default, the entity is not fetched because the endpoint returns + * (echoes) the new entity. + * + * @method splunkjs.Service.StoragePasswords + */fetchOnEntityCreation:true,/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.StoragePasswords + */path:function(){cov_1ks4ntaci2().f[111]++;cov_1ks4ntaci2().s[405]++;return Paths.storagePasswords;},/** + * Creates a local instance of a storage password. + * + * @param {Object} props The properties for the new storage password. For a list of available parameters, + * see + * POST storage/passwords on Splunk Developer Portal. + * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.StoragePassword` instance. + * + * @method splunkjs.Service.StoragePasswords + */instantiateEntity:function(props){cov_1ks4ntaci2().f[112]++;var entityNamespace=(cov_1ks4ntaci2().s[406]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[407]++;return new root.StoragePassword(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.StoragePasswords`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.StoragePasswords} A new `splunkjs.Service.StoragePasswords` instance. + * + * @method splunkjs.Service.StoragePasswords + */init:function(service,namespace){cov_1ks4ntaci2().f[113]++;cov_1ks4ntaci2().s[408]++;this._super(service,this.path(),namespace);}});/** + * Represents a fired alert. + * You can retrieve several of the fired alert's properties by + * the corresponding function name. + * + * @endpoint alerts/fired_alerts/{name} + * @class splunkjs.Service.FiredAlert + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[409]++;root.FiredAlert=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.FiredAlert + */path:function(){cov_1ks4ntaci2().f[114]++;cov_1ks4ntaci2().s[410]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** + * Returns this alert's actions (such as notifying by email, running a + * script, adding to RSS, tracking in Alert Manager, and enabling + * summary indexing). + * + * @return {Array} of actions, an empty {Array} if no actions + * @method splunkjs.Service.FiredAlert + */actions:function(){cov_1ks4ntaci2().f[115]++;cov_1ks4ntaci2().s[411]++;return(cov_1ks4ntaci2().b[116][0]++,this.properties().actions)||(cov_1ks4ntaci2().b[116][1]++,[]);},/** + * Returns this alert's type. + * + * @return {String} the alert's type. + * @method splunkjs.Service.FiredAlert + */alertType:function(){cov_1ks4ntaci2().f[116]++;cov_1ks4ntaci2().s[412]++;return(cov_1ks4ntaci2().b[117][0]++,this.properties().alert_type)||(cov_1ks4ntaci2().b[117][1]++,null);},/** + * Indicates whether the result is a set of events (digest) or a single + * event (per result). + * + * This method is available in Splunk 4.3 and later. + * + * @return {Boolean} true if the result is a digest, false if per result + * @method splunkjs.Service.FiredAlert + */isDigestMode:function(){cov_1ks4ntaci2().f[117]++;cov_1ks4ntaci2().s[413]++;// Convert this property to a Boolean +return!!this.properties().digest_mode;},/** + * Returns the rendered expiration time for this alert. + * + * This method is available in Splunk 4.3 and later. + * + * @return {String} + * @method splunkjs.Service.FiredAlert + */expirationTime:function(){cov_1ks4ntaci2().f[118]++;cov_1ks4ntaci2().s[414]++;return(cov_1ks4ntaci2().b[118][0]++,this.properties().expiration_time_rendered)||(cov_1ks4ntaci2().b[118][1]++,null);},/** + * Returns the saved search for this alert. + * + * @return {String} The saved search name, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */savedSearchName:function(){cov_1ks4ntaci2().f[119]++;cov_1ks4ntaci2().s[415]++;return(cov_1ks4ntaci2().b[119][0]++,this.properties().savedsearch_name)||(cov_1ks4ntaci2().b[119][1]++,null);},/** + * Returns this alert's severity on a scale of 1 to 10, with 1 being the + * highest severity. + * + * @return {Number} this alert's severity, -1 if not specified + * @method splunkjs.Service.FiredAlert + */severity:function(){cov_1ks4ntaci2().f[120]++;cov_1ks4ntaci2().s[416]++;return(cov_1ks4ntaci2().b[120][0]++,parseInt(this.properties().severity,10))||(cov_1ks4ntaci2().b[120][1]++,-1);},/** + * Returns this alert's search ID (SID). + * + * @return {String} This alert's SID, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */sid:function(){cov_1ks4ntaci2().f[121]++;cov_1ks4ntaci2().s[417]++;return(cov_1ks4ntaci2().b[121][0]++,this.properties().sid)||(cov_1ks4ntaci2().b[121][1]++,null);},/** + * Returns the time this alert was triggered. + * + * @return {Number} This alert's trigger time, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */triggerTime:function(){cov_1ks4ntaci2().f[122]++;cov_1ks4ntaci2().s[418]++;return(cov_1ks4ntaci2().b[122][0]++,this.properties().trigger_time)||(cov_1ks4ntaci2().b[122][1]++,null);},/** + * Returns this alert's rendered trigger time. + * + * This method is available in Splunk 4.3 and later. + * + * @return {String} This alert's rendered trigger time, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */triggerTimeRendered:function(){cov_1ks4ntaci2().f[123]++;cov_1ks4ntaci2().s[419]++;return(cov_1ks4ntaci2().b[123][0]++,this.properties().trigger_time_rendered)||(cov_1ks4ntaci2().b[123][1]++,null);},/** + * Returns the count of triggered alerts. + * + * This method is available in Splunk 4.3 and later. + * + * @return {Number} The number of triggered alerts, or -1 if not specified. + * @method splunkjs.Service.FiredAlert + */triggeredAlertCount:function(){cov_1ks4ntaci2().f[124]++;cov_1ks4ntaci2().s[420]++;return(cov_1ks4ntaci2().b[124][0]++,parseInt(this.properties().triggered_alerts,10))||(cov_1ks4ntaci2().b[124][1]++,-1);},/** + * Constructor for `splunkjs.Service.FiredAlert`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name for the new alert group. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.FiredAlert} A new `splunkjs.Service.FiredAlert` instance. + * + * @method splunkjs.Service.FiredAlert + */init:function(service,name,namespace){cov_1ks4ntaci2().f[125]++;cov_1ks4ntaci2().s[421]++;this.name=name;cov_1ks4ntaci2().s[422]++;this._super(service,this.path(),namespace);}});/** + * Represents a specific alert group, which you can then view and + * remove. + * + * @endpoint alerts/fired_alerts/{name} + * @class splunkjs.Service.FiredAlertGroup + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[423]++;root.FiredAlertGroup=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.FiredAlertGroup + */path:function(){cov_1ks4ntaci2().f[126]++;cov_1ks4ntaci2().s[424]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** + * Returns the `triggered_alert_count` property, the count + * of triggered alerts. + * + * @return {Number} the count of triggered alerts + * + * @method splunkjs.Service.FiredAlertGroup + */count:function(){cov_1ks4ntaci2().f[127]++;cov_1ks4ntaci2().s[425]++;return(cov_1ks4ntaci2().b[125][0]++,parseInt(this.properties().triggered_alert_count,10))||(cov_1ks4ntaci2().b[125][1]++,0);},/** + * Returns fired instances of this alert, which is + * a list of `splunkjs.Service.FiredAlert` instances. + * + * @example + * + * var alertGroup = service.firedAlertGroups().item("MyAlert"); + * alertGroup.list(function(err, firedAlerts, alert) { + * for(var i = 0; i < firedAlerts.length; i++) { + * console.log("Fired alert", i, ":", firedAlerts[i].sid); + * } + * }); + * + * @param {Function} callback A function to call when the fired alerts are retrieved: `(err, firedAlerts, alertGroup)`. + * + * @method splunkjs.Service.FiredAlertGroup + */list:function(options,callback){cov_1ks4ntaci2().f[128]++;cov_1ks4ntaci2().s[426]++;if((cov_1ks4ntaci2().b[127][0]++,!callback)&&(cov_1ks4ntaci2().b[127][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[126][0]++;cov_1ks4ntaci2().s[427]++;callback=options;cov_1ks4ntaci2().s[428]++;options={};}else{cov_1ks4ntaci2().b[126][1]++;}cov_1ks4ntaci2().s[429]++;callback=(cov_1ks4ntaci2().b[128][0]++,callback)||(cov_1ks4ntaci2().b[128][1]++,function(){cov_1ks4ntaci2().f[129]++;});cov_1ks4ntaci2().s[430]++;options=(cov_1ks4ntaci2().b[129][0]++,options)||(cov_1ks4ntaci2().b[129][1]++,{});var that=(cov_1ks4ntaci2().s[431]++,this);cov_1ks4ntaci2().s[432]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[130]++;cov_1ks4ntaci2().s[433]++;if(err){cov_1ks4ntaci2().b[130][0]++;cov_1ks4ntaci2().s[434]++;callback(err);cov_1ks4ntaci2().s[435]++;return;}else{cov_1ks4ntaci2().b[130][1]++;}var firedAlerts=(cov_1ks4ntaci2().s[436]++,[]);var data=(cov_1ks4ntaci2().s[437]++,(cov_1ks4ntaci2().b[131][0]++,response.data.entry)||(cov_1ks4ntaci2().b[131][1]++,[]));cov_1ks4ntaci2().s[438]++;for(var i=(cov_1ks4ntaci2().s[439]++,0);iPOST apps/local endpoint in the REST API documentation. + * @return {splunkjs.Service.Application} A new `splunkjs.Service.Application` instance. + * + * @method splunkjs.Service.Applications + */instantiateEntity:function(props){cov_1ks4ntaci2().f[145]++;cov_1ks4ntaci2().s[477]++;return new root.Application(this.service,props.name,{});},/** + * Constructor for `splunkjs.Service.Applications`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @return {splunkjs.Service.Applications} A new `splunkjs.Service.Applications` instance. + * + * @method splunkjs.Service.Applications + */init:function(service){cov_1ks4ntaci2().f[146]++;cov_1ks4ntaci2().s[478]++;this._super(service,this.path(),{});}});/** + * Provides access to configuration information about the server. + * + * @endpoint server/info + * @class splunkjs.Service.ServerInfo + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[479]++;root.ServerInfo=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.ServerInfo + */path:function(){cov_1ks4ntaci2().f[147]++;cov_1ks4ntaci2().s[480]++;return Paths.info;},/** + * Constructor for `splunkjs.Service.ServerInfo`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @return {splunkjs.Service.ServerInfo} A new `splunkjs.Service.ServerInfo` instance. + * + * @method splunkjs.Service.ServerInfo + */init:function(service){cov_1ks4ntaci2().f[148]++;cov_1ks4ntaci2().s[481]++;this.name="server-info";cov_1ks4ntaci2().s[482]++;this._super(service,this.path(),{});}});/** + * Represents a specific Splunk user, which you can view, modify, and + * remove. + * + * @endpoint authentication/users/{name} + * @class splunkjs.Service.User + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[483]++;root.User=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.User + */path:function(){cov_1ks4ntaci2().f[149]++;cov_1ks4ntaci2().s[484]++;return Paths.users+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.User`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The Splunk username. + * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. + * + * @method splunkjs.Service.User + */init:function(service,name){cov_1ks4ntaci2().f[150]++;cov_1ks4ntaci2().s[485]++;this.name=name;cov_1ks4ntaci2().s[486]++;this._super(service,this.path(),{});}});/** + * Represents a collection of users. You can create and list users using + * this collection container, or get a specific user. + * + * @endpoint authentication/users + * @class splunkjs.Service.Users + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[487]++;root.Users=root.Collection.extend({/** + * Indicates whether to call `fetch` after an entity has been created. By + * default, the entity is not fetched because the endpoint returns + * (echoes) the new entity. + * + * @method splunkjs.Service.Users + */fetchOnEntityCreation:true,/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Users + */path:function(){cov_1ks4ntaci2().f[151]++;cov_1ks4ntaci2().s[488]++;return Paths.users;},/** + * Creates a local instance of a user. + * + * @param {Object} props The properties for this new user. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. + * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. + * + * @method splunkjs.Service.Users + */instantiateEntity:function(props){cov_1ks4ntaci2().f[152]++;cov_1ks4ntaci2().s[489]++;return new root.User(this.service,props.name,{});},/** + * Constructor for `splunkjs.Service.Users`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @return {splunkjs.Service.Users} A new `splunkjs.Service.Users` instance. + * + * @method splunkjs.Service.Users + */init:function(service){cov_1ks4ntaci2().f[153]++;cov_1ks4ntaci2().s[490]++;this._super(service,this.path(),{});},/** + * Creates a new user. + * + * **Note:** This endpoint requires a special implementation. + * + * @param {Object} params A dictionary of properties. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. + * @param {Function} callback A function to call with the new entity: `(err, createdEntity)`. + * + * @method splunkjs.Service.Users + */create:function(params,callback){cov_1ks4ntaci2().f[154]++;cov_1ks4ntaci2().s[491]++;callback=(cov_1ks4ntaci2().b[136][0]++,callback)||(cov_1ks4ntaci2().b[136][1]++,function(){cov_1ks4ntaci2().f[155]++;});var that=(cov_1ks4ntaci2().s[492]++,this);var req=(cov_1ks4ntaci2().s[493]++,this.post("",params,function(err,response){cov_1ks4ntaci2().f[156]++;cov_1ks4ntaci2().s[494]++;if(err){cov_1ks4ntaci2().b[137][0]++;cov_1ks4ntaci2().s[495]++;callback(err);}else{cov_1ks4ntaci2().b[137][1]++;// This endpoint requires us to use the passed-in name +var props=(cov_1ks4ntaci2().s[496]++,{name:params.name});var entity=(cov_1ks4ntaci2().s[497]++,that.instantiateEntity(props));cov_1ks4ntaci2().s[498]++;entity.fetch(function(){cov_1ks4ntaci2().f[157]++;cov_1ks4ntaci2().s[499]++;if(req.wasAborted){cov_1ks4ntaci2().b[138][0]++;cov_1ks4ntaci2().s[500]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[138][1]++;cov_1ks4ntaci2().s[501]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[502]++;return req;}});/** + * Represents a specific Splunk view, which you can view, modify, and + * remove. + * + * @endpoint data/ui/views/{name} + * @class splunkjs.Service.View + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[503]++;root.View=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.View + */path:function(){cov_1ks4ntaci2().f[158]++;cov_1ks4ntaci2().s[504]++;return Paths.views+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.View`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name of the view. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. + * + * @method splunkjs.Service.View + */init:function(service,name,namespace){cov_1ks4ntaci2().f[159]++;cov_1ks4ntaci2().s[505]++;this.name=name;cov_1ks4ntaci2().s[506]++;this._super(service,this.path(),namespace);}});/** + * Represents a collection of views. You can create and list views using + * this collection container, or get a specific view. + * + * @endpoint data/ui/views + * @class splunkjs.Service.Views + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[507]++;root.Views=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Views + */path:function(){cov_1ks4ntaci2().f[160]++;cov_1ks4ntaci2().s[508]++;return Paths.views;},/** + * Creates a local instance of a view. + * + * @param {Object} props The properties for the new view. For a list of available parameters, see the POST scheduled/views/{name} endpoint in the REST API documentation. + * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. + * + * @method splunkjs.Service.Views + */instantiateEntity:function(props){cov_1ks4ntaci2().f[161]++;var entityNamespace=(cov_1ks4ntaci2().s[509]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[510]++;return new root.View(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.Views`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Views} A new `splunkjs.Service.Views` instance. + * + * @method splunkjs.Service.Views + */init:function(service,namespace){cov_1ks4ntaci2().f[162]++;cov_1ks4ntaci2().s[511]++;this._super(service,this.path(),namespace);}});/** + * Represents an index, which you can update and submit events to. + * + * @endpoint data/indexes/name + * @class splunkjs.Service.Index + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[512]++;root.Index=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Index + */path:function(){cov_1ks4ntaci2().f[163]++;cov_1ks4ntaci2().s[513]++;return Paths.indexes+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.Index`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name of the index. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. + * + * @method splunkjs.Service.Index + */init:function(service,name,namespace){cov_1ks4ntaci2().f[164]++;cov_1ks4ntaci2().s[514]++;this.name=name;cov_1ks4ntaci2().s[515]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[516]++;this.submitEvent=utils.bind(this,this.submitEvent);},/** + * Submits an event to this index. + * + * @example + * + * var index = service.indexes().item("_internal"); + * index.submitEvent("A new event", {sourcetype: "mysourcetype"}, function(err, result, index) { + * console.log("Submitted event: ", result); + * }); + * + * @param {String} event The text for this event. + * @param {Object} params A dictionary of parameters for indexing: + * - `host` (_string_): The value to populate in the host field for events from this data input. + * - `host_regex` (_string_): A regular expression used to extract the host value from each event. + * - `source` (_string_): The source value to fill in the metadata for this input's events. + * - `sourcetype` (_string_): The sourcetype to apply to events from this input. + * @param {Function} callback A function to call when the event is submitted: `(err, result, index)`. + * + * @endpoint receivers/simple?index={name} + * @method splunkjs.Service.Index + */submitEvent:function(event,params,callback){cov_1ks4ntaci2().f[165]++;cov_1ks4ntaci2().s[517]++;if((cov_1ks4ntaci2().b[140][0]++,!callback)&&(cov_1ks4ntaci2().b[140][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[139][0]++;cov_1ks4ntaci2().s[518]++;callback=params;cov_1ks4ntaci2().s[519]++;params={};}else{cov_1ks4ntaci2().b[139][1]++;}cov_1ks4ntaci2().s[520]++;callback=(cov_1ks4ntaci2().b[141][0]++,callback)||(cov_1ks4ntaci2().b[141][1]++,function(){cov_1ks4ntaci2().f[166]++;});cov_1ks4ntaci2().s[521]++;params=(cov_1ks4ntaci2().b[142][0]++,params)||(cov_1ks4ntaci2().b[142][1]++,{});// Add the index name +cov_1ks4ntaci2().s[522]++;params["index"]=this.name;var that=(cov_1ks4ntaci2().s[523]++,this);cov_1ks4ntaci2().s[524]++;return this.service.log(event,params,function(err,result){cov_1ks4ntaci2().f[167]++;cov_1ks4ntaci2().s[525]++;callback(err,result,that);});},remove:function(callback){cov_1ks4ntaci2().f[168]++;cov_1ks4ntaci2().s[526]++;if(this.service.versionCompare("5.0")<0){cov_1ks4ntaci2().b[143][0]++;cov_1ks4ntaci2().s[527]++;throw new Error("Indexes cannot be removed in Splunk 4.x");}else{cov_1ks4ntaci2().b[143][1]++;cov_1ks4ntaci2().s[528]++;return this._super(callback);}}});/** + * Represents a collection of indexes. You can create and list indexes using + * this collection container, or get a specific index. + * + * @endpoint data/indexes + * @class splunkjs.Service.Indexes + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[529]++;root.Indexes=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Indexes + */path:function(){cov_1ks4ntaci2().f[169]++;cov_1ks4ntaci2().s[530]++;return Paths.indexes;},/** + * Creates a local instance of an index. + * + * @param {Object} props The properties for the new index. For a list of available parameters, see Index parameters on Splunk Developer Portal. + * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. + * + * @method splunkjs.Service.Indexes + */instantiateEntity:function(props){cov_1ks4ntaci2().f[170]++;var entityNamespace=(cov_1ks4ntaci2().s[531]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[532]++;return new root.Index(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.Indexes`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Indexes} A new `splunkjs.Service.Indexes` instance. + * + * @method splunkjs.Service.Indexes + */init:function(service,namespace){cov_1ks4ntaci2().f[171]++;cov_1ks4ntaci2().s[533]++;this._super(service,this.path(),namespace);},/** + * Creates an index with the given name and parameters. + * + * @example + * + * var indexes = service.indexes(); + * indexes.create("NewIndex", {assureUTF8: true}, function(err, newIndex) { + * console.log("CREATED"); + * }); + * + * @param {String} name A name for this index. + * @param {Object} params A dictionary of properties. For a list of available parameters, see Index parameters on Splunk Developer Portal. + * @param {Function} callback A function to call with the new index: `(err, createdIndex)`. + * + * @endpoint data/indexes + * @method splunkjs.Service.Indexes + */create:function(name,params,callback){cov_1ks4ntaci2().f[172]++;cov_1ks4ntaci2().s[534]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[145][0]++,utils.isObject(name))&&(cov_1ks4ntaci2().b[145][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[145][2]++,!callback)){cov_1ks4ntaci2().b[144][0]++;cov_1ks4ntaci2().s[535]++;callback=params;cov_1ks4ntaci2().s[536]++;params=name;cov_1ks4ntaci2().s[537]++;name=params.name;}else{cov_1ks4ntaci2().b[144][1]++;}cov_1ks4ntaci2().s[538]++;params=(cov_1ks4ntaci2().b[146][0]++,params)||(cov_1ks4ntaci2().b[146][1]++,{});cov_1ks4ntaci2().s[539]++;params["name"]=name;cov_1ks4ntaci2().s[540]++;return this._super(params,callback);}});/** + * Represents a specific stanza, which you can update and remove, from a + * configuration file. + * + * @endpoint configs/conf-{file}/{name}` + * @class splunkjs.Service.ConfigurationStanza + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[541]++;root.ConfigurationStanza=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.ConfigurationStanza + */path:function(){cov_1ks4ntaci2().f[173]++;var name=(cov_1ks4ntaci2().s[542]++,this.name==="default"?(cov_1ks4ntaci2().b[147][0]++,"_new"):(cov_1ks4ntaci2().b[147][1]++,this.name));cov_1ks4ntaci2().s[543]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.file)+"/"+encodeURIComponent(name);},/** + * Constructor for `splunkjs.Service.ConfigurationStanza`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} file The name of the configuration file. + * @param {String} name The name of the new stanza. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. + * + * @method splunkjs.Service.ConfigurationStanza + */init:function(service,file,name,namespace){cov_1ks4ntaci2().f[174]++;cov_1ks4ntaci2().s[544]++;this.name=name;cov_1ks4ntaci2().s[545]++;this.file=file;cov_1ks4ntaci2().s[546]++;this._super(service,this.path(),namespace);}});/** + * Represents a collection of stanzas for a specific property file. You can + * create and list stanzas using this collection container, or get a specific + * stanza. + * + * @endpoint configs/conf-{file} + * @class splunkjs.Service.ConfigurationFile + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[547]++;root.ConfigurationFile=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.ConfigurationFile + */path:function(){cov_1ks4ntaci2().f[175]++;cov_1ks4ntaci2().s[548]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.name);},/** + * Creates a local instance of the default stanza in a configuration file. + * You cannot directly update the `ConfigurationStanza` returned by this function. + * + * This is equivalent to viewing `configs/conf-{file}/_new`. + * + * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. + * + * @method splunkjs.Service.ConfigurationFile + */getDefaultStanza:function(){cov_1ks4ntaci2().f[176]++;cov_1ks4ntaci2().s[549]++;return new root.ConfigurationStanza(this.service,this.name,"default",this.namespace);},/** + * Creates a local instance of a stanza in a configuration file. + * + * @param {Object} props The key-value properties for the new stanza. + * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. + * + * @method splunkjs.Service.ConfigurationFile + */instantiateEntity:function(props){cov_1ks4ntaci2().f[177]++;var entityNamespace=(cov_1ks4ntaci2().s[550]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[551]++;return new root.ConfigurationStanza(this.service,this.name,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.ConfigurationFile`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name of the configuration file. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. + * + * @method splunkjs.Service.ConfigurationFile + */init:function(service,name,namespace){cov_1ks4ntaci2().f[178]++;cov_1ks4ntaci2().s[552]++;this.name=name;cov_1ks4ntaci2().s[553]++;this._super(service,this.path(),namespace);},/** + * Creates a stanza in this configuration file. + * + * @example + * + * var file = service.configurations().item("props"); + * file.create("my_stanza", function(err, newStanza) { + * console.log("CREATED"); + * }); + * + * @param {String} stanzaName A name for this stanza. + * @param {Object} values A dictionary of key-value pairs to put in this stanza. + * @param {Function} callback A function to call with the created stanza: `(err, createdStanza)`. + * + * @endpoint configs/conf-{file} + * @method splunkjs.Service.ConfigurationFile + */create:function(stanzaName,values,callback){cov_1ks4ntaci2().f[179]++;cov_1ks4ntaci2().s[554]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[149][0]++,utils.isObject(stanzaName))&&(cov_1ks4ntaci2().b[149][1]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[149][2]++,!callback)){cov_1ks4ntaci2().b[148][0]++;cov_1ks4ntaci2().s[555]++;callback=values;cov_1ks4ntaci2().s[556]++;values=stanzaName;cov_1ks4ntaci2().s[557]++;stanzaName=values.name;}else{cov_1ks4ntaci2().b[148][1]++;}cov_1ks4ntaci2().s[558]++;if((cov_1ks4ntaci2().b[151][0]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[151][1]++,!callback)){cov_1ks4ntaci2().b[150][0]++;cov_1ks4ntaci2().s[559]++;callback=values;cov_1ks4ntaci2().s[560]++;values={};}else{cov_1ks4ntaci2().b[150][1]++;}cov_1ks4ntaci2().s[561]++;values=(cov_1ks4ntaci2().b[152][0]++,values)||(cov_1ks4ntaci2().b[152][1]++,{});cov_1ks4ntaci2().s[562]++;values["name"]=stanzaName;cov_1ks4ntaci2().s[563]++;return this._super(values,callback);}});/** + * Represents a collection of configuration files. You can create and list + * configuration files using this collection container, or get a specific file. + * + * @endpoint properties + * @class splunkjs.Service.Configurations + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[564]++;root.Configurations=root.Collection.extend({/** + * Indicates whether to call `fetch` after an entity has been created. By + * default, the entity is not fetched because the endpoint returns + * (echoes) the new entity. + * + * @method splunkjs.Service.Configurations + */fetchOnEntityCreation:true,/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Configurations + */path:function(){cov_1ks4ntaci2().f[180]++;cov_1ks4ntaci2().s[565]++;return Paths.properties;},/** + * Creates a local instance of a configuration file. + * + * @param {Object} props The properties for this configuration file. + * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. + * + * @method splunkjs.Service.Configurations + */instantiateEntity:function(props){cov_1ks4ntaci2().f[181]++;cov_1ks4ntaci2().s[566]++;return new root.ConfigurationFile(this.service,props.name,this.namespace);},/** + * Constructor for `splunkjs.Service.Configurations`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Configurations} A new `splunkjs.Service.Configurations` instance. + * + * @method splunkjs.Service.Configurations + */init:function(service,namespace){cov_1ks4ntaci2().f[182]++;cov_1ks4ntaci2().s[567]++;if((cov_1ks4ntaci2().b[154][0]++,!namespace)||(cov_1ks4ntaci2().b[154][1]++,namespace.owner==="-")||(cov_1ks4ntaci2().b[154][2]++,namespace.app==="-")){cov_1ks4ntaci2().b[153][0]++;cov_1ks4ntaci2().s[568]++;throw new Error("Configurations requires a non-wildcard owner/app");}else{cov_1ks4ntaci2().b[153][1]++;}cov_1ks4ntaci2().s[569]++;this._super(service,this.path(),namespace);},/** + * Creates a configuration file. + * + * @example + * + * var configurations = service.configurations(); + * configurations.create("myprops", function(err, newFile) { + * console.log("CREATED"); + * }); + * + * @param {String} filename A name for this configuration file. + * @param {Function} callback A function to call with the new configuration file: `(err, createdFile)`. + * + * @endpoint properties + * @method splunkjs.Service.Configurations + */create:function(filename,callback){cov_1ks4ntaci2().f[183]++;cov_1ks4ntaci2().s[570]++;// If someone called us with the default style of (params, callback), +// lets make it work +if(utils.isObject(filename)){cov_1ks4ntaci2().b[155][0]++;cov_1ks4ntaci2().s[571]++;filename=filename["__conf"];}else{cov_1ks4ntaci2().b[155][1]++;}cov_1ks4ntaci2().s[572]++;callback=(cov_1ks4ntaci2().b[156][0]++,callback)||(cov_1ks4ntaci2().b[156][1]++,function(){cov_1ks4ntaci2().f[184]++;});var that=(cov_1ks4ntaci2().s[573]++,this);var req=(cov_1ks4ntaci2().s[574]++,this.post("",{__conf:filename},function(err,response){cov_1ks4ntaci2().f[185]++;cov_1ks4ntaci2().s[575]++;if(err){cov_1ks4ntaci2().b[157][0]++;cov_1ks4ntaci2().s[576]++;callback(err);}else{cov_1ks4ntaci2().b[157][1]++;var entity=(cov_1ks4ntaci2().s[577]++,new root.ConfigurationFile(that.service,filename));cov_1ks4ntaci2().s[578]++;entity.fetch(function(){cov_1ks4ntaci2().f[186]++;cov_1ks4ntaci2().s[579]++;if(req.wasAborted){cov_1ks4ntaci2().b[158][0]++;cov_1ks4ntaci2().s[580]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[158][1]++;cov_1ks4ntaci2().s[581]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[582]++;return req;},doesFileExist:async function(filename){cov_1ks4ntaci2().f[187]++;cov_1ks4ntaci2().s[583]++;try{var that=(cov_1ks4ntaci2().s[584]++,this);// 1. Fetch files list +var response=(cov_1ks4ntaci2().s[585]++,await this.get_v2("",{__conf:filename}));// 2. Filter the files +var files=(cov_1ks4ntaci2().s[586]++,response?.body?.entry?.filter(f=>{cov_1ks4ntaci2().f[188]++;cov_1ks4ntaci2().s[587]++;return f.name===filename;}));// 2. Check if the file exists +cov_1ks4ntaci2().s[588]++;if((cov_1ks4ntaci2().b[160][0]++,files)&&(cov_1ks4ntaci2().b[160][1]++,files.length==0)){cov_1ks4ntaci2().b[159][0]++;cov_1ks4ntaci2().s[589]++;return{code:"FILE_NOT_FOUND",message:`File with the name '${filename}' does not exist.`};}else{cov_1ks4ntaci2().b[159][1]++;}// 3. Create a local instance +var configurationFile=(cov_1ks4ntaci2().s[590]++,new root.ConfigurationFile(that.service,filename));// 4. Load the file content +var fetchedFile=(cov_1ks4ntaci2().s[591]++,await configurationFile.fetch_v2());cov_1ks4ntaci2().s[592]++;return{file:fetchedFile};}catch(error){cov_1ks4ntaci2().s[593]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},doesStanzaExist:async function(file,stanza){cov_1ks4ntaci2().f[189]++;cov_1ks4ntaci2().s[594]++;try{// 1. check if the stanza exists +var fetchedStanza=(cov_1ks4ntaci2().s[595]++,file.item(stanza));cov_1ks4ntaci2().s[596]++;if(!fetchedStanza){cov_1ks4ntaci2().b[161][0]++;cov_1ks4ntaci2().s[597]++;return{code:"STANZA_NOT_FOUND",message:`Stanza with the name '${stanza}' does not exist.`};}else{cov_1ks4ntaci2().b[161][1]++;cov_1ks4ntaci2().s[598]++;return{stanza:fetchedStanza};}}catch(error){cov_1ks4ntaci2().s[599]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},create_v2:async function(configs,svc,filename,stanza,keyValueMap,callback){cov_1ks4ntaci2().f[190]++;cov_1ks4ntaci2().s[600]++;callback=(cov_1ks4ntaci2().b[162][0]++,callback)||(cov_1ks4ntaci2().b[162][1]++,function(){cov_1ks4ntaci2().f[191]++;});var that=(cov_1ks4ntaci2().s[601]++,this);// 1. Check if the file exists +var doesFileExistResponse=(cov_1ks4ntaci2().s[602]++,await this.doesFileExist(filename));var configFile=(cov_1ks4ntaci2().s[603]++,doesFileExistResponse.file);// 2. If the file doesn't exist, create a new file +cov_1ks4ntaci2().s[604]++;if(!configFile){cov_1ks4ntaci2().b[163][0]++;cov_1ks4ntaci2().s[605]++;console.log(doesFileExistResponse);cov_1ks4ntaci2().s[606]++;console.log("Creating a new configuration file...");cov_1ks4ntaci2().s[607]++;that.create({__conf:filename},(err,newFile)=>{cov_1ks4ntaci2().f[192]++;cov_1ks4ntaci2().s[608]++;return console.log(`Configuration File created: ${filename}`);});cov_1ks4ntaci2().s[609]++;configFile=new root.ConfigurationFile(that.service,filename);cov_1ks4ntaci2().s[610]++;configFile=await configFile.fetch_v2();}else{cov_1ks4ntaci2().b[163][1]++;}// 2. Check if the stanza exists +var doesStanzaExistResponse=(cov_1ks4ntaci2().s[611]++,await this.doesStanzaExist(configFile,stanza));var configStanza=(cov_1ks4ntaci2().s[612]++,doesStanzaExistResponse.stanza);// 3. If the stanza doesn't exist, create a new stanza with given keyValueMap +cov_1ks4ntaci2().s[613]++;if(!configStanza){cov_1ks4ntaci2().b[164][0]++;cov_1ks4ntaci2().s[614]++;console.log(doesStanzaExistResponse);cov_1ks4ntaci2().s[615]++;console.log("Creating a new configuration stanza...");cov_1ks4ntaci2().s[616]++;configFile.create(stanza,keyValueMap,function(err,newStanza){cov_1ks4ntaci2().f[193]++;cov_1ks4ntaci2().s[617]++;console.log(`Configuration Stanza created: ${stanza}`);cov_1ks4ntaci2().s[618]++;callback();});}// 4. If the stanza exists, update it with the keyValueMap +else{cov_1ks4ntaci2().b[164][1]++;cov_1ks4ntaci2().s[619]++;configStanza.update(keyValueMap,(err,updatedStanza)=>{cov_1ks4ntaci2().f[194]++;cov_1ks4ntaci2().s[620]++;console.log(`Configuration Stanza updated: ${stanza}`);cov_1ks4ntaci2().s[621]++;callback();});}}});/** + * Represents a specific search job. You can perform different operations + * on this job, such as reading its status, canceling it, and getting results. + * + * @endpoint search/jobs/{search_id} + * @class splunkjs.Service.Job + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[622]++;root.Job=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Job + */path:function(){cov_1ks4ntaci2().f[195]++;cov_1ks4ntaci2().s[623]++;return Paths.jobs+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.Job`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} sid The search ID for this search job. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. + * + * @method splunkjs.Service.Job + */init:function(service,sid,namespace){cov_1ks4ntaci2().f[196]++;cov_1ks4ntaci2().s[624]++;this.name=sid;cov_1ks4ntaci2().s[625]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[626]++;this.sid=sid;// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[627]++;this.cancel=utils.bind(this,this.cancel);cov_1ks4ntaci2().s[628]++;this.disablePreview=utils.bind(this,this.disablePreview);cov_1ks4ntaci2().s[629]++;this.enablePreview=utils.bind(this,this.enablePreview);cov_1ks4ntaci2().s[630]++;this.events=utils.bind(this,this.events);cov_1ks4ntaci2().s[631]++;this.finalize=utils.bind(this,this.finalize);cov_1ks4ntaci2().s[632]++;this.pause=utils.bind(this,this.pause);cov_1ks4ntaci2().s[633]++;this.preview=utils.bind(this,this.preview);cov_1ks4ntaci2().s[634]++;this.results=utils.bind(this,this.results);cov_1ks4ntaci2().s[635]++;this.searchlog=utils.bind(this,this.searchlog);cov_1ks4ntaci2().s[636]++;this.setPriority=utils.bind(this,this.setPriority);cov_1ks4ntaci2().s[637]++;this.setTTL=utils.bind(this,this.setTTL);cov_1ks4ntaci2().s[638]++;this.summary=utils.bind(this,this.summary);cov_1ks4ntaci2().s[639]++;this.timeline=utils.bind(this,this.timeline);cov_1ks4ntaci2().s[640]++;this.touch=utils.bind(this,this.touch);cov_1ks4ntaci2().s[641]++;this.unpause=utils.bind(this,this.unpause);},/** + * Cancels a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.cancel(function(err) { + * console.log("CANCELLED"); + * }); + * + * @param {Function} callback A function to call when the search is done: `(err)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */cancel:function(callback){cov_1ks4ntaci2().f[197]++;var req=(cov_1ks4ntaci2().s[642]++,this.post("control",{action:"cancel"},callback));cov_1ks4ntaci2().s[643]++;return req;},/** + * Disables preview generation for a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.disablePreview(function(err, job) { + * console.log("PREVIEW DISABLED"); + * }); + * + * @param {Function} callback A function to call with this search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */disablePreview:function(callback){cov_1ks4ntaci2().f[198]++;cov_1ks4ntaci2().s[644]++;callback=(cov_1ks4ntaci2().b[165][0]++,callback)||(cov_1ks4ntaci2().b[165][1]++,function(){cov_1ks4ntaci2().f[199]++;});var that=(cov_1ks4ntaci2().s[645]++,this);var req=(cov_1ks4ntaci2().s[646]++,this.post("control",{action:"disablepreview"},function(err){cov_1ks4ntaci2().f[200]++;cov_1ks4ntaci2().s[647]++;callback(err,that);}));cov_1ks4ntaci2().s[648]++;return req;},/** + * Enables preview generation for a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.disablePreview(function(err, job) { + * console.log("PREVIEW ENABLED"); + * }); + * + * @param {Function} callback A function to call with this search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */enablePreview:function(callback){cov_1ks4ntaci2().f[201]++;cov_1ks4ntaci2().s[649]++;callback=(cov_1ks4ntaci2().b[166][0]++,callback)||(cov_1ks4ntaci2().b[166][1]++,function(){cov_1ks4ntaci2().f[202]++;});var that=(cov_1ks4ntaci2().s[650]++,this);var req=(cov_1ks4ntaci2().s[651]++,this.post("control",{action:"enablepreview"},function(err){cov_1ks4ntaci2().f[203]++;cov_1ks4ntaci2().s[652]++;callback(err,that);}));cov_1ks4ntaci2().s[653]++;return req;},/** + * Returns the events of a search job with given parameters. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.events({count: 10}, function(err, events, job) { + * console.log("Fields: ", events.fields); + * }); + * + * @param {Object} params The parameters for retrieving events. For a list of available parameters, see the GET search/jobs/{search_id}/events endpoint in the REST API documentation. + * @param {Function} callback A function to call when the events are retrieved: `(err, events, job)`. + * + * @endpoint search/jobs/{search_id}/events + * @method splunkjs.Service.Job + */events:function(params,callback){cov_1ks4ntaci2().f[204]++;cov_1ks4ntaci2().s[654]++;callback=(cov_1ks4ntaci2().b[167][0]++,callback)||(cov_1ks4ntaci2().b[167][1]++,function(){cov_1ks4ntaci2().f[205]++;});cov_1ks4ntaci2().s[655]++;params=(cov_1ks4ntaci2().b[168][0]++,params)||(cov_1ks4ntaci2().b[168][1]++,{});cov_1ks4ntaci2().s[656]++;params.output_mode=(cov_1ks4ntaci2().b[169][0]++,params.output_mode)||(cov_1ks4ntaci2().b[169][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[657]++,this);cov_1ks4ntaci2().s[658]++;return this.get("events",params,function(err,response){cov_1ks4ntaci2().f[206]++;cov_1ks4ntaci2().s[659]++;if(err){cov_1ks4ntaci2().b[170][0]++;cov_1ks4ntaci2().s[660]++;callback(err);}else{cov_1ks4ntaci2().b[170][1]++;cov_1ks4ntaci2().s[661]++;callback(null,response.data,that);}});},/** + * Finalizes a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.finalize(function(err, job) { + * console.log("JOB FINALIZED"); + * }); + * + * @param {Function} callback A function to call with the job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */finalize:function(callback){cov_1ks4ntaci2().f[207]++;cov_1ks4ntaci2().s[662]++;callback=(cov_1ks4ntaci2().b[171][0]++,callback)||(cov_1ks4ntaci2().b[171][1]++,function(){cov_1ks4ntaci2().f[208]++;});var that=(cov_1ks4ntaci2().s[663]++,this);var req=(cov_1ks4ntaci2().s[664]++,this.post("control",{action:"finalize"},function(err){cov_1ks4ntaci2().f[209]++;cov_1ks4ntaci2().s[665]++;callback(err,that);}));cov_1ks4ntaci2().s[666]++;return req;},/** + * Returns an iterator over this search job's events or results. + * + * @param {String} type One of {"events", "preview", "results"}. + * @param {Object} params A dictionary of optional parameters: + * - `pagesize` (_integer_): The number of items to return on each request. Defaults to as many as possible. + * @return {Object} An iterator object with a `next(callback)` method, where `callback` is of the form `(err, results, hasMoreResults)`. + * + * @endpoint search/jobs/{search_id}/results + * @method splunkjs.Service.Job + */iterator:function(type,params){cov_1ks4ntaci2().f[210]++;cov_1ks4ntaci2().s[667]++;return new root.PaginatedEndpointIterator(this[type],params);},/** + * Pauses a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.pause(function(err, job) { + * console.log("JOB PAUSED"); + * }); + * + * @param {Function} callback A function to call with the job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */pause:function(callback){cov_1ks4ntaci2().f[211]++;cov_1ks4ntaci2().s[668]++;callback=(cov_1ks4ntaci2().b[172][0]++,callback)||(cov_1ks4ntaci2().b[172][1]++,function(){cov_1ks4ntaci2().f[212]++;});var that=(cov_1ks4ntaci2().s[669]++,this);var req=(cov_1ks4ntaci2().s[670]++,this.post("control",{action:"pause"},function(err){cov_1ks4ntaci2().f[213]++;cov_1ks4ntaci2().s[671]++;callback(err,that);}));cov_1ks4ntaci2().s[672]++;return req;},/* + * Gets the preview results for a search job with given parameters. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.preview({count: 10}, function(err, results, job) { + * console.log("Fields: ", results.fields); + * }); + * + * @param {Object} params The parameters for retrieving preview results. For a list of available parameters, see the GET search/jobs/{search_id}/results_preview endpoint in the REST API documentation. + * @param {Function} callback A function to call when the preview results are retrieved : `(err, results, job)`. + * + * @endpoint search/jobs/{search_id}/results_preview + * @method splunkjs.Service.Job + */preview:function(params,callback){cov_1ks4ntaci2().f[214]++;cov_1ks4ntaci2().s[673]++;callback=(cov_1ks4ntaci2().b[173][0]++,callback)||(cov_1ks4ntaci2().b[173][1]++,function(){cov_1ks4ntaci2().f[215]++;});cov_1ks4ntaci2().s[674]++;params=(cov_1ks4ntaci2().b[174][0]++,params)||(cov_1ks4ntaci2().b[174][1]++,{});cov_1ks4ntaci2().s[675]++;params.output_mode=(cov_1ks4ntaci2().b[175][0]++,params.output_mode)||(cov_1ks4ntaci2().b[175][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[676]++,this);cov_1ks4ntaci2().s[677]++;return this.get("results_preview",params,function(err,response){cov_1ks4ntaci2().f[216]++;cov_1ks4ntaci2().s[678]++;if(err){cov_1ks4ntaci2().b[176][0]++;cov_1ks4ntaci2().s[679]++;callback(err);}else{cov_1ks4ntaci2().b[176][1]++;cov_1ks4ntaci2().s[680]++;callback(null,response.data,that);}});},/** + * Gets the results for a search job with given parameters. + * + * The callback can get `undefined` for its `results` parameter if the + * job is not yet done. To avoid this, use the `Job.track()` method to + * wait until the job is complete prior to fetching the results with + * this method. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.results({count: 10}, function(err, results, job) { + * console.log("Fields: ", results.results); + * }); + * + * @param {Object} params The parameters for retrieving search results. For a list of available parameters, see the GET search/jobs/{search_id}/results endpoint in the REST API documentation. + * @param {Function} callback A function to call when the results are retrieved: `(err, results, job)`. + * + * @endpoint search/jobs/{search_id}/results + * @method splunkjs.Service.Job + */results:function(params,callback){cov_1ks4ntaci2().f[217]++;cov_1ks4ntaci2().s[681]++;callback=(cov_1ks4ntaci2().b[177][0]++,callback)||(cov_1ks4ntaci2().b[177][1]++,function(){cov_1ks4ntaci2().f[218]++;});cov_1ks4ntaci2().s[682]++;params=(cov_1ks4ntaci2().b[178][0]++,params)||(cov_1ks4ntaci2().b[178][1]++,{});cov_1ks4ntaci2().s[683]++;params.output_mode=(cov_1ks4ntaci2().b[179][0]++,params.output_mode)||(cov_1ks4ntaci2().b[179][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[684]++,this);cov_1ks4ntaci2().s[685]++;return this.get("results",params,function(err,response){cov_1ks4ntaci2().f[219]++;cov_1ks4ntaci2().s[686]++;if(err){cov_1ks4ntaci2().b[180][0]++;cov_1ks4ntaci2().s[687]++;callback(err);}else{cov_1ks4ntaci2().b[180][1]++;cov_1ks4ntaci2().s[688]++;callback(null,response.data,that);}});},/** + * Gets the search log for this search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.searchlog(function(err, searchlog, job) { + * console.log(searchlog); + * }); + * + * @param {Function} callback A function to call with the search log and job: `(err, searchlog, job)`. + * + * @endpoint search/jobs/{search_id}/search.log + * @method splunkjs.Service.Job + */searchlog:function(callback){cov_1ks4ntaci2().f[220]++;cov_1ks4ntaci2().s[689]++;callback=(cov_1ks4ntaci2().b[181][0]++,callback)||(cov_1ks4ntaci2().b[181][1]++,function(){cov_1ks4ntaci2().f[221]++;});var that=(cov_1ks4ntaci2().s[690]++,this);cov_1ks4ntaci2().s[691]++;return this.get("search.log",{},function(err,response){cov_1ks4ntaci2().f[222]++;cov_1ks4ntaci2().s[692]++;if(err){cov_1ks4ntaci2().b[182][0]++;cov_1ks4ntaci2().s[693]++;callback(err);}else{cov_1ks4ntaci2().b[182][1]++;cov_1ks4ntaci2().s[694]++;callback(null,response.data,that);}});},/** + * Sets the priority for this search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.setPriority(6, function(err, job) { + * console.log("JOB PRIORITY SET"); + * }); + * + * @param {Number} value The priority (an integer between 1-10). A higher value means a higher priority. + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */setPriority:function(value,callback){cov_1ks4ntaci2().f[223]++;cov_1ks4ntaci2().s[695]++;callback=(cov_1ks4ntaci2().b[183][0]++,callback)||(cov_1ks4ntaci2().b[183][1]++,function(){cov_1ks4ntaci2().f[224]++;});var that=(cov_1ks4ntaci2().s[696]++,this);var req=(cov_1ks4ntaci2().s[697]++,this.post("control",{action:"setpriority",priority:value},function(err){cov_1ks4ntaci2().f[225]++;cov_1ks4ntaci2().s[698]++;callback(err,that);}));cov_1ks4ntaci2().s[699]++;return req;},/** + * Sets the time to live (TTL) for the search job, which is the time before + * the search job expires after it has been completed and is still available. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.setTTL(1000, function(err, job) { + * console.log("JOB TTL SET"); + * }); + * + * @param {Number} value The time to live, in seconds. + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */setTTL:function(value,callback){cov_1ks4ntaci2().f[226]++;cov_1ks4ntaci2().s[700]++;callback=(cov_1ks4ntaci2().b[184][0]++,callback)||(cov_1ks4ntaci2().b[184][1]++,function(){cov_1ks4ntaci2().f[227]++;});var that=(cov_1ks4ntaci2().s[701]++,this);var req=(cov_1ks4ntaci2().s[702]++,this.post("control",{action:"setttl",ttl:value},function(err){cov_1ks4ntaci2().f[228]++;cov_1ks4ntaci2().s[703]++;callback(err,that);}));cov_1ks4ntaci2().s[704]++;return req;},/** + * Gets the summary for this search job with the given parameters. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.summary({top_count: 5}, function(err, summary, job) { + * console.log("Summary: ", summary); + * }); + * + * @param {Object} params The parameters for retrieving the summary. For a list of available parameters, see the GET search/jobs/{search_id}/summary endpoint in the REST API documentation. + * @param {Function} callback A function to call with the summary and search job: `(err, summary, job)`. + * + * @endpoint search/jobs/{search_id}/summmary + * @method splunkjs.Service.Job + */summary:function(params,callback){cov_1ks4ntaci2().f[229]++;cov_1ks4ntaci2().s[705]++;callback=(cov_1ks4ntaci2().b[185][0]++,callback)||(cov_1ks4ntaci2().b[185][1]++,function(){cov_1ks4ntaci2().f[230]++;});var that=(cov_1ks4ntaci2().s[706]++,this);cov_1ks4ntaci2().s[707]++;return this.get("summary",params,function(err,response){cov_1ks4ntaci2().f[231]++;cov_1ks4ntaci2().s[708]++;if(err){cov_1ks4ntaci2().b[186][0]++;cov_1ks4ntaci2().s[709]++;callback(err);}else{cov_1ks4ntaci2().b[186][1]++;cov_1ks4ntaci2().s[710]++;callback(null,response.data,that);}});},/** + * Gets the timeline for this search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.timeline({time_format: "%c"}, function(err, job, timeline) { + * console.log("Timeline: ", timeline); + * }); + * + * @param {Object} params The parameters for retrieving the timeline. For a list of available parameters, see the GET search/jobs/{search_id}/timeline endpoint in the REST API documentation. + * @param {Function} callback A function to call with the timeline and search job: `(err, timeline, job)`. + * + * @endpoint search/jobs/{search_id}/timeline + * @method splunkjs.Service.Job + */timeline:function(params,callback){cov_1ks4ntaci2().f[232]++;cov_1ks4ntaci2().s[711]++;callback=(cov_1ks4ntaci2().b[187][0]++,callback)||(cov_1ks4ntaci2().b[187][1]++,function(){cov_1ks4ntaci2().f[233]++;});var that=(cov_1ks4ntaci2().s[712]++,this);cov_1ks4ntaci2().s[713]++;return this.get("timeline",params,function(err,response){cov_1ks4ntaci2().f[234]++;cov_1ks4ntaci2().s[714]++;if(err){cov_1ks4ntaci2().b[188][0]++;cov_1ks4ntaci2().s[715]++;callback(err);}else{cov_1ks4ntaci2().b[188][1]++;cov_1ks4ntaci2().s[716]++;callback(null,response.data,that);}});},/** + * Touches a search job, which means extending the expiration time of + * the search to now plus the time to live (TTL). + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.touch(function(err) { + * console.log("JOB TOUCHED"); + * }); + * + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */touch:function(callback){cov_1ks4ntaci2().f[235]++;cov_1ks4ntaci2().s[717]++;callback=(cov_1ks4ntaci2().b[189][0]++,callback)||(cov_1ks4ntaci2().b[189][1]++,function(){cov_1ks4ntaci2().f[236]++;});var that=(cov_1ks4ntaci2().s[718]++,this);var req=(cov_1ks4ntaci2().s[719]++,this.post("control",{action:"touch"},function(err){cov_1ks4ntaci2().f[237]++;cov_1ks4ntaci2().s[720]++;callback(err,that);}));cov_1ks4ntaci2().s[721]++;return req;},/** + * Starts polling the status of this search job, and fires callbacks + * upon each status change. + * + * @param {Object} options A dictionary of optional parameters: + * - `period` (_integer_): The number of milliseconds to wait between each poll. Defaults to 500. + * @param {Object|Function} callbacks A dictionary of optional callbacks: + * - `ready`: A function `(job)` invoked when the job's properties first become available. + * - `progress`: A function `(job)` invoked whenever new job properties are available. + * - `done`: A function `(job)` invoked if the job completes successfully. No further polling is done. + * - `failed`: A function `(job)` invoked if the job fails executing on the server. No further polling is done. + * - `error`: A function `(err)` invoked if an error occurs while polling. No further polling is done. + * Or, if a function `(job)`, equivalent to passing it as a `done` callback. + * + * @method splunkjs.Service.Job + */track:function(options,callbacks){cov_1ks4ntaci2().f[238]++;var period=(cov_1ks4ntaci2().s[722]++,(cov_1ks4ntaci2().b[190][0]++,options.period)||(cov_1ks4ntaci2().b[190][1]++,500));// ms +cov_1ks4ntaci2().s[723]++;if(utils.isFunction(callbacks)){cov_1ks4ntaci2().b[191][0]++;cov_1ks4ntaci2().s[724]++;callbacks={done:callbacks};}else{cov_1ks4ntaci2().b[191][1]++;}var noCallbacksAfterReady=(cov_1ks4ntaci2().s[725]++,(cov_1ks4ntaci2().b[192][0]++,!callbacks.progress)&&(cov_1ks4ntaci2().b[192][1]++,!callbacks.done)&&(cov_1ks4ntaci2().b[192][2]++,!callbacks.failed)&&(cov_1ks4ntaci2().b[192][3]++,!callbacks.error));cov_1ks4ntaci2().s[726]++;callbacks.ready=(cov_1ks4ntaci2().b[193][0]++,callbacks.ready)||(cov_1ks4ntaci2().b[193][1]++,function(){cov_1ks4ntaci2().f[239]++;});cov_1ks4ntaci2().s[727]++;callbacks.progress=(cov_1ks4ntaci2().b[194][0]++,callbacks.progress)||(cov_1ks4ntaci2().b[194][1]++,function(){cov_1ks4ntaci2().f[240]++;});cov_1ks4ntaci2().s[728]++;callbacks.done=(cov_1ks4ntaci2().b[195][0]++,callbacks.done)||(cov_1ks4ntaci2().b[195][1]++,function(){cov_1ks4ntaci2().f[241]++;});cov_1ks4ntaci2().s[729]++;callbacks.failed=(cov_1ks4ntaci2().b[196][0]++,callbacks.failed)||(cov_1ks4ntaci2().b[196][1]++,function(){cov_1ks4ntaci2().f[242]++;});cov_1ks4ntaci2().s[730]++;callbacks.error=(cov_1ks4ntaci2().b[197][0]++,callbacks.error)||(cov_1ks4ntaci2().b[197][1]++,function(){cov_1ks4ntaci2().f[243]++;});// For use by tests only +cov_1ks4ntaci2().s[731]++;callbacks._preready=(cov_1ks4ntaci2().b[198][0]++,callbacks._preready)||(cov_1ks4ntaci2().b[198][1]++,function(){cov_1ks4ntaci2().f[244]++;});cov_1ks4ntaci2().s[732]++;callbacks._stoppedAfterReady=(cov_1ks4ntaci2().b[199][0]++,callbacks._stoppedAfterReady)||(cov_1ks4ntaci2().b[199][1]++,function(){cov_1ks4ntaci2().f[245]++;});var that=(cov_1ks4ntaci2().s[733]++,this);var emittedReady=(cov_1ks4ntaci2().s[734]++,false);var doneLooping=(cov_1ks4ntaci2().s[735]++,false);cov_1ks4ntaci2().s[736]++;Async.whilst(function(){cov_1ks4ntaci2().f[246]++;cov_1ks4ntaci2().s[737]++;return!doneLooping;},function(nextIteration){cov_1ks4ntaci2().f[247]++;cov_1ks4ntaci2().s[738]++;that.fetch(function(err,job){cov_1ks4ntaci2().f[248]++;cov_1ks4ntaci2().s[739]++;if(err){cov_1ks4ntaci2().b[200][0]++;cov_1ks4ntaci2().s[740]++;nextIteration(err);cov_1ks4ntaci2().s[741]++;return;}else{cov_1ks4ntaci2().b[200][1]++;}var dispatchState=(cov_1ks4ntaci2().s[742]++,job.properties().dispatchState);var notReady=(cov_1ks4ntaci2().s[743]++,(cov_1ks4ntaci2().b[201][0]++,dispatchState==="QUEUED")||(cov_1ks4ntaci2().b[201][1]++,dispatchState==="PARSING"));cov_1ks4ntaci2().s[744]++;if(notReady){cov_1ks4ntaci2().b[202][0]++;cov_1ks4ntaci2().s[745]++;callbacks._preready(job);}else{cov_1ks4ntaci2().b[202][1]++;cov_1ks4ntaci2().s[746]++;if(!emittedReady){cov_1ks4ntaci2().b[203][0]++;cov_1ks4ntaci2().s[747]++;callbacks.ready(job);cov_1ks4ntaci2().s[748]++;emittedReady=true;// Optimization: Don't keep polling the job if the +// caller only cares about the `ready` event. +cov_1ks4ntaci2().s[749]++;if(noCallbacksAfterReady){cov_1ks4ntaci2().b[204][0]++;cov_1ks4ntaci2().s[750]++;callbacks._stoppedAfterReady(job);cov_1ks4ntaci2().s[751]++;doneLooping=true;cov_1ks4ntaci2().s[752]++;nextIteration();cov_1ks4ntaci2().s[753]++;return;}else{cov_1ks4ntaci2().b[204][1]++;}}else{cov_1ks4ntaci2().b[203][1]++;}cov_1ks4ntaci2().s[754]++;callbacks.progress(job);var props=(cov_1ks4ntaci2().s[755]++,job.properties());cov_1ks4ntaci2().s[756]++;if((cov_1ks4ntaci2().b[206][0]++,dispatchState==="DONE")&&(cov_1ks4ntaci2().b[206][1]++,props.isDone)){cov_1ks4ntaci2().b[205][0]++;cov_1ks4ntaci2().s[757]++;callbacks.done(job);cov_1ks4ntaci2().s[758]++;doneLooping=true;cov_1ks4ntaci2().s[759]++;nextIteration();cov_1ks4ntaci2().s[760]++;return;}else{cov_1ks4ntaci2().b[205][1]++;cov_1ks4ntaci2().s[761]++;if((cov_1ks4ntaci2().b[208][0]++,dispatchState==="FAILED")&&(cov_1ks4ntaci2().b[208][1]++,props.isFailed)){cov_1ks4ntaci2().b[207][0]++;cov_1ks4ntaci2().s[762]++;callbacks.failed(job);cov_1ks4ntaci2().s[763]++;doneLooping=true;cov_1ks4ntaci2().s[764]++;nextIteration();cov_1ks4ntaci2().s[765]++;return;}else{cov_1ks4ntaci2().b[207][1]++;}}}cov_1ks4ntaci2().s[766]++;Async.sleep(period,nextIteration);});},function(err){cov_1ks4ntaci2().f[249]++;cov_1ks4ntaci2().s[767]++;if(err){cov_1ks4ntaci2().b[209][0]++;cov_1ks4ntaci2().s[768]++;callbacks.error(err);}else{cov_1ks4ntaci2().b[209][1]++;}});},/** + * Resumes a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.unpause(function(err) { + * console.log("JOB UNPAUSED"); + * }); + * + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */unpause:function(callback){cov_1ks4ntaci2().f[250]++;cov_1ks4ntaci2().s[769]++;callback=(cov_1ks4ntaci2().b[210][0]++,callback)||(cov_1ks4ntaci2().b[210][1]++,function(){cov_1ks4ntaci2().f[251]++;});var that=(cov_1ks4ntaci2().s[770]++,this);var req=(cov_1ks4ntaci2().s[771]++,this.post("control",{action:"unpause"},function(err){cov_1ks4ntaci2().f[252]++;cov_1ks4ntaci2().s[772]++;callback(err,that);}));cov_1ks4ntaci2().s[773]++;return req;}});/** + * Represents a collection of search jobs. You can create and list search + * jobs using this collection container, or get a specific search job. + * + * @endpoint search/jobs + * @class splunkjs.Service.Jobs + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[774]++;root.Jobs=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Jobs + */path:function(){cov_1ks4ntaci2().f[253]++;cov_1ks4ntaci2().s[775]++;return Paths.jobs;},/** + * Creates a local instance of a job. + * + * @param {Object} props The properties for this new job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. + * + * @method splunkjs.Service.Jobs + */instantiateEntity:function(props){cov_1ks4ntaci2().f[254]++;var sid=(cov_1ks4ntaci2().s[776]++,props.content.sid);var entityNamespace=(cov_1ks4ntaci2().s[777]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[778]++;return new root.Job(this.service,sid,entityNamespace);},/** + * Constructor for `splunkjs.Service.Jobs`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Jobs} A new `splunkjs.Service.Jobs` instance. + * + * @method splunkjs.Service.Jobs + */init:function(service,namespace){cov_1ks4ntaci2().f[255]++;cov_1ks4ntaci2().s[779]++;this._super(service,this.path(),namespace);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[780]++;this.create=utils.bind(this,this.create);},/** + * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: + * + * - Use `exec_mode=normal` to return a search job ID immediately (default). + * Poll for completion to find out when you can retrieve search results. + * + * - Use `exec_mode=blocking` to return the search job ID when the search has finished. + * + * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * @param {Function} callback A function to call with the created job: `(err, createdJob)`. + * + * @endpoint search/jobs + * @method splunkjs.Service.Jobs + */create:function(query,params,callback){cov_1ks4ntaci2().f[256]++;cov_1ks4ntaci2().s[781]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[212][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[212][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[212][2]++,!callback)){cov_1ks4ntaci2().b[211][0]++;cov_1ks4ntaci2().s[782]++;callback=params;cov_1ks4ntaci2().s[783]++;params=query;cov_1ks4ntaci2().s[784]++;query=params.search;}else{cov_1ks4ntaci2().b[211][1]++;}cov_1ks4ntaci2().s[785]++;callback=(cov_1ks4ntaci2().b[213][0]++,callback)||(cov_1ks4ntaci2().b[213][1]++,function(){cov_1ks4ntaci2().f[257]++;});cov_1ks4ntaci2().s[786]++;params=(cov_1ks4ntaci2().b[214][0]++,params)||(cov_1ks4ntaci2().b[214][1]++,{});cov_1ks4ntaci2().s[787]++;params.search=query;cov_1ks4ntaci2().s[788]++;if(((cov_1ks4ntaci2().b[216][0]++,params.exec_mode)||(cov_1ks4ntaci2().b[216][1]++,"")).toLowerCase()==="oneshot"){cov_1ks4ntaci2().b[215][0]++;cov_1ks4ntaci2().s[789]++;throw new Error("Please use splunkjs.Service.Jobs.oneshotSearch for exec_mode=oneshot");}else{cov_1ks4ntaci2().b[215][1]++;}cov_1ks4ntaci2().s[790]++;if(!params.search){cov_1ks4ntaci2().b[217][0]++;cov_1ks4ntaci2().s[791]++;callback("Must provide a query to create a search job");cov_1ks4ntaci2().s[792]++;return;}else{cov_1ks4ntaci2().b[217][1]++;}var that=(cov_1ks4ntaci2().s[793]++,this);cov_1ks4ntaci2().s[794]++;return this.post("",params,function(err,response){cov_1ks4ntaci2().f[258]++;cov_1ks4ntaci2().s[795]++;if(err){cov_1ks4ntaci2().b[218][0]++;cov_1ks4ntaci2().s[796]++;callback(err);}else{cov_1ks4ntaci2().b[218][1]++;var job=(cov_1ks4ntaci2().s[797]++,new root.Job(that.service,response.data.sid,that.namespace));cov_1ks4ntaci2().s[798]++;callback(null,job);}});},/** + * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: + * + * - Use `exec_mode=normal` to return a search job ID immediately (default). + * Poll for completion to find out when you can retrieve search results. + * + * - Use `exec_mode=blocking` to return the search job ID when the search has finished. + * + * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. + * + * @example + * + * var jobs = service.jobs(); + * jobs.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { + * console.log("CREATED": newJob.sid); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {Function} callback A function to call with the new search job: `(err, createdJob)`. + * + * @endpoint search/jobs + * @method splunkjs.Service.Jobs + */search:function(query,params,callback){cov_1ks4ntaci2().f[259]++;cov_1ks4ntaci2().s[799]++;return this.create(query,params,callback);},/** + * Creates a oneshot search from a given search query and parameters. + * + * @example + * + * var jobs = service.jobs(); + * jobs.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { + * console.log("RESULT FIELDS": results.fields); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search: + * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). + * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `rf` (_string_): Specifies one or more fields to add to the search. + * @param {Function} callback A function to call with the results of the search: `(err, results)`. + * + * @endpoint search/jobs + * @method splunkjs.Service.Jobs + */oneshotSearch:function(query,params,callback){cov_1ks4ntaci2().f[260]++;cov_1ks4ntaci2().s[800]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[220][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[220][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[220][2]++,!callback)){cov_1ks4ntaci2().b[219][0]++;cov_1ks4ntaci2().s[801]++;callback=params;cov_1ks4ntaci2().s[802]++;params=query;cov_1ks4ntaci2().s[803]++;query=params.search;}else{cov_1ks4ntaci2().b[219][1]++;}cov_1ks4ntaci2().s[804]++;callback=(cov_1ks4ntaci2().b[221][0]++,callback)||(cov_1ks4ntaci2().b[221][1]++,function(){cov_1ks4ntaci2().f[261]++;});cov_1ks4ntaci2().s[805]++;params=(cov_1ks4ntaci2().b[222][0]++,params)||(cov_1ks4ntaci2().b[222][1]++,{});cov_1ks4ntaci2().s[806]++;params.search=query;cov_1ks4ntaci2().s[807]++;params.exec_mode="oneshot";cov_1ks4ntaci2().s[808]++;if(!params.search){cov_1ks4ntaci2().b[223][0]++;cov_1ks4ntaci2().s[809]++;callback("Must provide a query to create a search job");}else{cov_1ks4ntaci2().b[223][1]++;}var outputMode=(cov_1ks4ntaci2().s[810]++,(cov_1ks4ntaci2().b[224][0]++,params.output_mode)||(cov_1ks4ntaci2().b[224][1]++,"json_rows"));var path=(cov_1ks4ntaci2().s[811]++,this.qualifiedPath);var method=(cov_1ks4ntaci2().s[812]++,"POST");var headers=(cov_1ks4ntaci2().s[813]++,{});var post=(cov_1ks4ntaci2().s[814]++,params);var get=(cov_1ks4ntaci2().s[815]++,{output_mode:outputMode});var body=(cov_1ks4ntaci2().s[816]++,null);var req=(cov_1ks4ntaci2().s[817]++,this.service.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[262]++;cov_1ks4ntaci2().s[818]++;if(err){cov_1ks4ntaci2().b[225][0]++;cov_1ks4ntaci2().s[819]++;callback(err);}else{cov_1ks4ntaci2().b[225][1]++;cov_1ks4ntaci2().s[820]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[821]++;return req;}});/** + * Represents a field of a data model object. + * This is a helper class for `DataModelCalculation` + * and `DataModelObject`. + * + * Has these properties: + * - `fieldName` (_string_): The name of this field. + * - `displayName` (_string_): A human readable name for this field. + * - `type` (_string_): The type of this field. + * - `multivalued` (_boolean_): Whether this field is multivalued. + * - `required` (_boolean_): Whether this field is required. + * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. + * - `editable` (_boolean_): Whether this field can be edited. + * - `comment` (_string_): A comment for this field, or `null` if there isn't one. + * - `fieldSearch` (_string_): A search query fragment for this field. + * - `lineage` (_array_): An array of strings of the lineage of the data model + * on which this field is defined. + * - `owner` (_string_): The name of the data model object on which this field is defined. + * + * Possible types for a data model field: + * - `string` + * - `boolean` + * - `number` + * - `timestamp` + * - `objectCount` + * - `childCount` + * - `ipv4` + * + * @class splunkjs.Service.DataModelField + */cov_1ks4ntaci2().s[822]++;root.DataModelField=Class.extend({_types:["string","number","timestamp","objectCount","childCount","ipv4","boolean"],/** + * Constructor for a data model field. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `fieldName` (_string_): The name of this field. + * - `displayName` (_string_): A human readable name for this field. + * - `type` (_string_): The type of this field, see valid types in class docs. + * - `multivalue` (_boolean_): Whether this field is multivalued. + * - `required` (_boolean_): Whether this field is required on events in the object + * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. + * - `editable` (_boolean_): Whether this field can be edited. + * - `comment` (_string_): A comment for this field, or `null` if there isn't one. + * - `fieldSearch` (_string_): A search query fragment for this field. + * - `lineage` (_string_): The lineage of the data model object on which this field + * is defined, items are delimited by a dot. This is converted into an array of + * strings upon construction. + * + * @method splunkjs.Service.DataModelField + */init:function(props){cov_1ks4ntaci2().f[263]++;cov_1ks4ntaci2().s[823]++;props=(cov_1ks4ntaci2().b[226][0]++,props)||(cov_1ks4ntaci2().b[226][1]++,{});cov_1ks4ntaci2().s[824]++;props.owner=(cov_1ks4ntaci2().b[227][0]++,props.owner)||(cov_1ks4ntaci2().b[227][1]++,"");cov_1ks4ntaci2().s[825]++;this.name=props.fieldName;cov_1ks4ntaci2().s[826]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[827]++;this.type=props.type;cov_1ks4ntaci2().s[828]++;this.multivalued=props.multivalue;cov_1ks4ntaci2().s[829]++;this.required=props.required;cov_1ks4ntaci2().s[830]++;this.hidden=props.hidden;cov_1ks4ntaci2().s[831]++;this.editable=props.editable;cov_1ks4ntaci2().s[832]++;this.comment=(cov_1ks4ntaci2().b[228][0]++,props.comment)||(cov_1ks4ntaci2().b[228][1]++,null);cov_1ks4ntaci2().s[833]++;this.fieldSearch=props.fieldSearch;cov_1ks4ntaci2().s[834]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[835]++;this.owner=this.lineage[this.lineage.length-1];},/** + * Is this data model field of type string? + * + * @return {Boolean} True if this data model field is of type string. + * + * @method splunkjs.Service.DataModelField + */isString:function(){cov_1ks4ntaci2().f[264]++;cov_1ks4ntaci2().s[836]++;return"string"===this.type;},/** + * Is this data model field of type number? + * + * @return {Boolean} True if this data model field is of type number. + * + * @method splunkjs.Service.DataModelField + */isNumber:function(){cov_1ks4ntaci2().f[265]++;cov_1ks4ntaci2().s[837]++;return"number"===this.type;},/** + * Is this data model field of type timestamp? + * + * @return {Boolean} True if this data model field is of type timestamp. + * + * @method splunkjs.Service.DataModelField + */isTimestamp:function(){cov_1ks4ntaci2().f[266]++;cov_1ks4ntaci2().s[838]++;return"timestamp"===this.type;},/** + * Is this data model field of type object count? + * + * @return {Boolean} True if this data model field is of type object count. + * + * @method splunkjs.Service.DataModelField + */isObjectcount:function(){cov_1ks4ntaci2().f[267]++;cov_1ks4ntaci2().s[839]++;return"objectCount"===this.type;},/** + * Is this data model field of type child count? + * + * @return {Boolean} True if this data model field is of type child count. + * + * @method splunkjs.Service.DataModelField + */isChildcount:function(){cov_1ks4ntaci2().f[268]++;cov_1ks4ntaci2().s[840]++;return"childCount"===this.type;},/** + * Is this data model field of type ipv4? + * + * @return {Boolean} True if this data model field is of type ipv4. + * + * @method splunkjs.Service.DataModelField + */isIPv4:function(){cov_1ks4ntaci2().f[269]++;cov_1ks4ntaci2().s[841]++;return"ipv4"===this.type;},/** + * Is this data model field of type boolean? + * + * @return {Boolean} True if this data model field is of type boolean. + * + * @method splunkjs.Service.DataModelField + */isBoolean:function(){cov_1ks4ntaci2().f[270]++;cov_1ks4ntaci2().s[842]++;return"boolean"===this.type;}});/** + * Represents a constraint on a `DataModelObject` or a `DataModelField`. + * + * Has these properties: + * - `query` (_string_): The search query defining this data model constraint. + * - `lineage` (_array_): The lineage of this data model constraint. + * - `owner` (_string_): The name of the data model object that owns + * this data model constraint. + * + * @class splunkjs.Service.DataModelConstraint + */cov_1ks4ntaci2().s[843]++;root.DataModelConstraint=Class.extend({/** + * Constructor for a data model constraint. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `search` (_string_): The Splunk search query this constraint specifies. + * - `owner` (_string_): The lineage of the data model object that owns this + * constraint, items are delimited by a dot. This is converted into + * an array of strings upon construction. + * + * @method splunkjs.Service.DataModelConstraint + */init:function(props){cov_1ks4ntaci2().f[271]++;cov_1ks4ntaci2().s[844]++;props=(cov_1ks4ntaci2().b[229][0]++,props)||(cov_1ks4ntaci2().b[229][1]++,{});cov_1ks4ntaci2().s[845]++;props.owner=(cov_1ks4ntaci2().b[230][0]++,props.owner)||(cov_1ks4ntaci2().b[230][1]++,"");cov_1ks4ntaci2().s[846]++;this.query=props.search;cov_1ks4ntaci2().s[847]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[848]++;this.owner=this.lineage[this.lineage.length-1];}});/** + * Used for specifying a calculation on a `DataModelObject`. + * + * Has these properties: + * - `id` (_string_): The ID for this data model calculation. + * - `type` (_string_): The type of this data model calculation. + * - `comment` (_string_|_null_): The comment for this data model calculation, or `null`. + * - `editable` (_boolean_): True if this calculation can be edited, false otherwise. + * - `lineage` (_array_): The lineage of the data model object on which this calculation + * is defined in an array of strings. + * - `owner` (_string_): The data model that this calculation belongs to. + * - `outputFields` (_array_): The fields output by this calculation. + * + * The Rex and Eval types have an additional property: + * - `expression` (_string_): The expression to use for this calculation. + * + * The Rex and GeoIP types have an additional property: + * - `inputField` (_string_): The field to use for calculation. + * + * The Lookup type has additional properties: + * - `lookupName` (_string_): The name of the lookup to perform. + * - `inputFieldMappings` (_object_): The mappings from fields in the events to fields in the lookup. + * + * Valid types of calculations are: + * - `Lookup` + * - `Eval` + * - `GeoIP` + * - `Rex` + * + * @class splunkjs.Service.DataModelCalculation + */cov_1ks4ntaci2().s[849]++;root.DataModelCalculation=Class.extend({_types:["Lookup","Eval","GeoIP","Rex"],/** + * Constructor for a data model calculation. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `calculationID` (_string_): The ID of this calculation. + * - `calculationType` (_string_): The type of this calculation, see class docs for valid types. + * - `editable` (_boolean_): Whether this calculation can be edited. + * - `comment` (_string_): A comment for this calculation, or `null` if there isn't one. + * - `owner` (_string_): The lineage of the data model object on which this calculation + * is defined, items are delimited by a dot. This is converted into an array of + * strings upon construction. + * - `outputFields` (_array_): An array of the fields this calculation generates. + * - `expression` (_string_): The expression to use for this calculation; exclusive to `Eval` and `Rex` calculations (optional) + * - `inputField` (_string_): The field to use for calculation; exclusive to `GeoIP` and `Rex` calculations (optional) + * - `lookupName` (_string_): The name of the lookup to perform; exclusive to `Lookup` calculations (optional) + * - `inputFieldMappings` (_array_): One element array containing an object with the mappings from fields in the events to fields + * in the lookup; exclusive to `Lookup` calculations (optional) + * + * @method splunkjs.Service.DataModelCalculation + */init:function(props){cov_1ks4ntaci2().f[272]++;cov_1ks4ntaci2().s[850]++;props=(cov_1ks4ntaci2().b[231][0]++,props)||(cov_1ks4ntaci2().b[231][1]++,{});cov_1ks4ntaci2().s[851]++;props.owner=(cov_1ks4ntaci2().b[232][0]++,props.owner)||(cov_1ks4ntaci2().b[232][1]++,"");cov_1ks4ntaci2().s[852]++;this.id=props.calculationID;cov_1ks4ntaci2().s[853]++;this.type=props.calculationType;cov_1ks4ntaci2().s[854]++;this.comment=(cov_1ks4ntaci2().b[233][0]++,props.comment)||(cov_1ks4ntaci2().b[233][1]++,null);cov_1ks4ntaci2().s[855]++;this.editable=props.editable;cov_1ks4ntaci2().s[856]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[857]++;this.owner=this.lineage[this.lineage.length-1];cov_1ks4ntaci2().s[858]++;this.outputFields=[];cov_1ks4ntaci2().s[859]++;for(var i=(cov_1ks4ntaci2().s[860]++,0);iSearch job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {Function} callback A function to call when done creating the search job: `(err, job)`. + * @method splunkjs.Service.Pivot + */run:function(args,callback){cov_1ks4ntaci2().f[280]++;cov_1ks4ntaci2().s[883]++;if(utils.isUndefined(callback)){cov_1ks4ntaci2().b[240][0]++;cov_1ks4ntaci2().s[884]++;callback=args;cov_1ks4ntaci2().s[885]++;args={};}else{cov_1ks4ntaci2().b[240][1]++;}cov_1ks4ntaci2().s[886]++;if((cov_1ks4ntaci2().b[242][0]++,!args)||(cov_1ks4ntaci2().b[242][1]++,Object.keys(args).length===0)){cov_1ks4ntaci2().b[241][0]++;cov_1ks4ntaci2().s[887]++;args={};}else{cov_1ks4ntaci2().b[241][1]++;}// If tstats is undefined, use pivotSearch (try to run an accelerated search if possible) +cov_1ks4ntaci2().s[888]++;this.service.search((cov_1ks4ntaci2().b[243][0]++,this.tstatsSearch)||(cov_1ks4ntaci2().b[243][1]++,this.pivotSearch),args,callback);}});/** + * PivotSpecification represents a pivot to be done on a particular data model object. + * The user creates a PivotSpecification on some data model object, adds filters, row splits, + * column splits, and cell values, then calls the pivot method to query splunkd and + * get a set of SPL queries corresponding to this specification. + * + * Call the `pivot` method to query Splunk for SPL queries corresponding to this pivot. + * + * This class supports a fluent API, each function except `init`, `toJsonObject` & `pivot` + * return the modified `splunkjs.Service.PivotSpecification` instance. + * + * @example + * service.dataModels().fetch(function(err, dataModels) { + * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); + * var pivotSpecification = searches.createPivotSpecification(); + * pivotSpecification + * .addRowSplit("user", "Executing user") + * .addRangeColumnSplit("exec_time", {limit: 4}) + * .addCellValue("search", "Search Query", "values") + * .pivot(function(err, pivot) { + * console.log("Got a Pivot object from the Splunk server!"); + * }); + * }); + * + * Has these properties: + * - `dataModelObject` (_splunkjs.Service.DataModelObject_): The `DataModelObject` from which + * this `PivotSpecification` was created. + * - `columns` (_array_): The column splits on this `PivotSpecification`. + * - `rows` (_array_): The row splits on this `PivotSpecification`. + * - `filters` (_array_): The filters on this `PivotSpecification`. + * - `cells` (_array_): The cell aggregations for this`PivotSpecification`. + * - `accelerationNamespace` (_string_|_null_): The name of the `DataModel` that owns the `DataModelObject` + * on which this `PivotSpecification` was created if the `DataModel` is accelerated. Alternatively, + * you can set this property manually to the sid of an acceleration job in the format `sid=`. + * + * Valid comparison types are: + * - `boolean` + * - `string` + * - `number` + * - `ipv4` + * + * Valid boolean comparisons are: + * - `=` + * - `is` + * - `isNull` + * - `isNotNull` + * + * Valid string comparisons are: + * - `=` + * - `is` + * - `isNull` + * - `isNotNull` + * - `contains` + * - `doesNotContain` + * - `startsWith` + * - `endsWith` + * - `regex` + * + * Valid number comparisons are: + * - `=` + * - `!=` + * - `<` + * - `>` + * - `<=` + * - `>=` + * - `is` + * - `isNull` + * - `isNotNull` + * + * Valid ipv4 comparisons are: + * - `is` + * - `isNull` + * - `isNotNull` + * - `contains` + * - `doesNotContain` + * - `startsWith` + * + * Valid binning values are: + * - `auto` + * - `year` + * - `month` + * - `day` + * - `hour` + * - `minute` + * - `second` + * + * Valid sort directions are: + * - `ASCENDING` + * - `DECENDING` + * - `DEFAULT` + * + * Valid stats functions are: + * - `list` + * - `values` + * - `first` + * - `last` + * - `count` + * - `dc` + * - `sum` + * - `average` + * - `max` + * - `min` + * - `stdev` + * - `duration` + * - `earliest` + * - `latest` + * + * @class splunkjs.Service.PivotSpecification + */cov_1ks4ntaci2().s[889]++;root.PivotSpecification=Class.extend({_comparisons:{boolean:["=","is","isNull","isNotNull"],string:["=","is","isNull","isNotNull","contains","doesNotContain","startsWith","endsWith","regex"],number:["=","!=","<",">","<=",">=","is","isNull","isNotNull"],ipv4:["is","isNull","isNotNull","contains","doesNotContain","startsWith"]},_binning:["auto","year","month","day","hour","minute","second"],_sortDirection:["ASCENDING","DESCENDING","DEFAULT"],_statsFunctions:["list","values","first","last","count","dc","sum","average","max","min","stdev","duration","earliest","latest"],/** + * Constructor for a pivot specification. + * + * @constructor + * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. + * + * @method splunkjs.Service.PivotSpecification + */init:function(dataModelObject){cov_1ks4ntaci2().f[281]++;cov_1ks4ntaci2().s[890]++;this.dataModelObject=dataModelObject;cov_1ks4ntaci2().s[891]++;this.columns=[];cov_1ks4ntaci2().s[892]++;this.rows=[];cov_1ks4ntaci2().s[893]++;this.filters=[];cov_1ks4ntaci2().s[894]++;this.cells=[];cov_1ks4ntaci2().s[895]++;this.accelerationNamespace=dataModelObject.dataModel.isAccelerated()?(cov_1ks4ntaci2().b[244][0]++,dataModelObject.dataModel.name):(cov_1ks4ntaci2().b[244][1]++,null);cov_1ks4ntaci2().s[896]++;this.run=utils.bind(this,this.run);cov_1ks4ntaci2().s[897]++;this.pivot=utils.bind(this,this.pivot);},/** + * Set the acceleration cache for this pivot specification to a job, + * usually generated by createLocalAccelerationJob on a DataModelObject + * instance, as the acceleration cache for this pivot specification. + * + * @param {String|splunkjs.Service.Job} sid The sid of an acceleration job, + * or, a `splunkjs.Service.Job` instance. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */setAccelerationJob:function(sid){cov_1ks4ntaci2().f[282]++;cov_1ks4ntaci2().s[898]++;// If a search object is passed in, get its sid +if((cov_1ks4ntaci2().b[246][0]++,sid)&&(cov_1ks4ntaci2().b[246][1]++,sid instanceof Service.Job)){cov_1ks4ntaci2().b[245][0]++;cov_1ks4ntaci2().s[899]++;sid=sid.sid;}else{cov_1ks4ntaci2().b[245][1]++;}cov_1ks4ntaci2().s[900]++;if(!sid){cov_1ks4ntaci2().b[247][0]++;cov_1ks4ntaci2().s[901]++;throw new Error("Sid to use for acceleration must not be null.");}else{cov_1ks4ntaci2().b[247][1]++;}cov_1ks4ntaci2().s[902]++;this.accelerationNamespace="sid="+sid;cov_1ks4ntaci2().s[903]++;return this;},/** + * Add a filter on a boolean valued field. The filter will be a constraint of the form + * `field `comparison` compareTo`, for example: `is_remote = false`. + * + * @param {String} fieldName The name of field to filter on + * @param {String} comparisonType The type of comparison, see class docs for valid types. + * @param {String} comparisonOp The comparison, see class docs for valid comparisons, based on type. + * @param {String} compareTo The value to compare the field to. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addFilter:function(fieldName,comparisonType,comparisonOp,compareTo){cov_1ks4ntaci2().f[283]++;cov_1ks4ntaci2().s[904]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[248][0]++;cov_1ks4ntaci2().s[905]++;throw new Error("Cannot add filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[248][1]++;}cov_1ks4ntaci2().s[906]++;if(comparisonType!==this.dataModelObject.fieldByName(fieldName).type){cov_1ks4ntaci2().b[249][0]++;cov_1ks4ntaci2().s[907]++;throw new Error("Cannot add "+comparisonType+" filter on "+fieldName+" because it is of type "+this.dataModelObject.fieldByName(fieldName).type);}else{cov_1ks4ntaci2().b[249][1]++;}cov_1ks4ntaci2().s[908]++;if(!utils.contains(this._comparisons[comparisonType],comparisonOp)){cov_1ks4ntaci2().b[250][0]++;cov_1ks4ntaci2().s[909]++;throw new Error("Cannot add "+comparisonType+" filter because "+comparisonOp+" is not a valid comparison operator");}else{cov_1ks4ntaci2().b[250][1]++;}var ret=(cov_1ks4ntaci2().s[910]++,{fieldName:fieldName,owner:this.dataModelObject.fieldByName(fieldName).lineage.join("."),type:comparisonType});// These fields are type dependent +cov_1ks4ntaci2().s[911]++;if(utils.contains(["boolean","string","ipv4","number"],ret.type)){cov_1ks4ntaci2().b[251][0]++;cov_1ks4ntaci2().s[912]++;ret.rule={comparator:comparisonOp,compareTo:compareTo};}else{cov_1ks4ntaci2().b[251][1]++;}cov_1ks4ntaci2().s[913]++;this.filters.push(ret);cov_1ks4ntaci2().s[914]++;return this;},/** + * Add a limit on the events shown in a pivot by sorting them according to some field, then taking + * the specified number from the beginning or end of the list. + * + * @param {String} fieldName The name of field to filter on. + * @param {String} sortAttribute The name of the field to use for sorting. + * @param {String} sortDirection The direction to sort events, see class docs for valid types. + * @param {String} limit The number of values from the sorted list to allow through this filter. + * @param {String} statsFunction The stats function to use for aggregation before sorting, see class docs for valid types. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addLimitFilter:function(fieldName,sortAttribute,sortDirection,limit,statsFunction){cov_1ks4ntaci2().f[284]++;cov_1ks4ntaci2().s[915]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[252][0]++;cov_1ks4ntaci2().s[916]++;throw new Error("Cannot add limit filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[252][1]++;}var f=(cov_1ks4ntaci2().s[917]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[918]++;if(!utils.contains(["string","number","objectCount"],f.type)){cov_1ks4ntaci2().b[253][0]++;cov_1ks4ntaci2().s[919]++;throw new Error("Cannot add limit filter on "+fieldName+" because it is of type "+f.type);}else{cov_1ks4ntaci2().b[253][1]++;}cov_1ks4ntaci2().s[920]++;if((cov_1ks4ntaci2().b[255][0]++,"string"===f.type)&&(cov_1ks4ntaci2().b[255][1]++,!utils.contains(["count","dc"],statsFunction))){cov_1ks4ntaci2().b[254][0]++;cov_1ks4ntaci2().s[921]++;throw new Error("Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[254][1]++;}cov_1ks4ntaci2().s[922]++;if((cov_1ks4ntaci2().b[257][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[257][1]++,!utils.contains(["count","dc","average","sum"],statsFunction))){cov_1ks4ntaci2().b[256][0]++;cov_1ks4ntaci2().s[923]++;throw new Error("Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found "+statsFunction);}else{cov_1ks4ntaci2().b[256][1]++;}cov_1ks4ntaci2().s[924]++;if((cov_1ks4ntaci2().b[259][0]++,"objectCount"===f.type)&&(cov_1ks4ntaci2().b[259][1]++,!utils.contains(["count"],statsFunction))){cov_1ks4ntaci2().b[258][0]++;cov_1ks4ntaci2().s[925]++;throw new Error("Stats function for fields of type object count must be COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[258][1]++;}var filter=(cov_1ks4ntaci2().s[926]++,{fieldName:fieldName,owner:f.lineage.join("."),type:f.type,attributeName:sortAttribute,attributeOwner:this.dataModelObject.fieldByName(sortAttribute).lineage.join("."),sortDirection:sortDirection,limitAmount:limit,statsFn:statsFunction});// Assumed "highest" is preferred for when sortDirection is "DEFAULT" +cov_1ks4ntaci2().s[927]++;filter.limitType="ASCENDING"===sortDirection?(cov_1ks4ntaci2().b[260][0]++,"lowest"):(cov_1ks4ntaci2().b[260][1]++,"highest");cov_1ks4ntaci2().s[928]++;this.filters.push(filter);cov_1ks4ntaci2().s[929]++;return this;},/** + * Add a row split on a numeric or string valued field, splitting on each distinct value of the field. + * + * @param {String} fieldName The name of field to split on. + * @param {String} label A human readable name for this set of rows. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addRowSplit:function(fieldName,label){cov_1ks4ntaci2().f[285]++;cov_1ks4ntaci2().s[930]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[261][0]++;cov_1ks4ntaci2().s[931]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[261][1]++;}var f=(cov_1ks4ntaci2().s[932]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[933]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[262][0]++;cov_1ks4ntaci2().s[934]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[262][1]++;}var row=(cov_1ks4ntaci2().s[935]++,{fieldName:fieldName,owner:f.owner,type:f.type,label:label});cov_1ks4ntaci2().s[936]++;if("number"===f.type){cov_1ks4ntaci2().b[263][0]++;cov_1ks4ntaci2().s[937]++;row.display="all";}else{cov_1ks4ntaci2().b[263][1]++;}cov_1ks4ntaci2().s[938]++;this.rows.push(row);cov_1ks4ntaci2().s[939]++;return this;},/** + * Add a row split on a numeric field, splitting into numeric ranges. + * + * This split generates bins with edges equivalent to the + * classic loop 'for i in to by ' but with a maximum + * number of bins . This dispatches to the stats and xyseries search commands. + * See their documentation for more details. + * + * @param {String} fieldName The field to split on. + * @param {String} label A human readable name for this set of rows. + * @param {Object} options An optional dictionary of collection filtering and pagination options: + * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. + * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. + * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. + * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addRangeRowSplit:function(field,label,ranges){cov_1ks4ntaci2().f[286]++;cov_1ks4ntaci2().s[940]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[264][0]++;cov_1ks4ntaci2().s[941]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[264][1]++;}var f=(cov_1ks4ntaci2().s[942]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[943]++;if("number"!==f.type){cov_1ks4ntaci2().b[265][0]++;cov_1ks4ntaci2().s[944]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[265][1]++;}var updateRanges=(cov_1ks4ntaci2().s[945]++,{});cov_1ks4ntaci2().s[946]++;if((cov_1ks4ntaci2().b[267][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[267][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[266][0]++;cov_1ks4ntaci2().s[947]++;updateRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[266][1]++;}cov_1ks4ntaci2().s[948]++;if((cov_1ks4ntaci2().b[269][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[269][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[268][0]++;cov_1ks4ntaci2().s[949]++;updateRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[268][1]++;}cov_1ks4ntaci2().s[950]++;if((cov_1ks4ntaci2().b[271][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[271][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[270][0]++;cov_1ks4ntaci2().s[951]++;updateRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[270][1]++;}cov_1ks4ntaci2().s[952]++;if((cov_1ks4ntaci2().b[273][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[273][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[272][0]++;cov_1ks4ntaci2().s[953]++;updateRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[272][1]++;}cov_1ks4ntaci2().s[954]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,display:"ranges",ranges:updateRanges});cov_1ks4ntaci2().s[955]++;return this;},/** + * Add a row split on a boolean valued field. + * + * @param {String} fieldName The name of field to split on. + * @param {String} label A human readable name for this set of rows. + * @param {String} trueDisplayValue A string to display in the true valued row label. + * @param {String} falseDisplayValue A string to display in the false valued row label. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addBooleanRowSplit:function(field,label,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[287]++;cov_1ks4ntaci2().s[956]++;if(!this.dataModelObject.fieldByName(field)){cov_1ks4ntaci2().b[274][0]++;cov_1ks4ntaci2().s[957]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[274][1]++;}var f=(cov_1ks4ntaci2().s[958]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[959]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[275][0]++;cov_1ks4ntaci2().s[960]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[275][1]++;}cov_1ks4ntaci2().s[961]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[962]++;return this;},/** + * Add a row split on a timestamp valued field, binned by the specified bucket size. + * + * @param {String} fieldName The name of field to split on. + * @param {String} label A human readable name for this set of rows. + * @param {String} binning The size of bins to use, see class docs for valid types. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addTimestampRowSplit:function(field,label,binning){cov_1ks4ntaci2().f[288]++;cov_1ks4ntaci2().s[963]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[276][0]++;cov_1ks4ntaci2().s[964]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[276][1]++;}var f=(cov_1ks4ntaci2().s[965]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[966]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[277][0]++;cov_1ks4ntaci2().s[967]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[277][1]++;}cov_1ks4ntaci2().s[968]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[278][0]++;cov_1ks4ntaci2().s[969]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[278][1]++;}cov_1ks4ntaci2().s[970]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,period:binning});cov_1ks4ntaci2().s[971]++;return this;},/** + * Add a column split on a string or number valued field, producing a column for + * each distinct value of the field. + * + * @param {String} fieldName The name of field to split on. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addColumnSplit:function(fieldName){cov_1ks4ntaci2().f[289]++;cov_1ks4ntaci2().s[972]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[279][0]++;cov_1ks4ntaci2().s[973]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[279][1]++;}var f=(cov_1ks4ntaci2().s[974]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[975]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[280][0]++;cov_1ks4ntaci2().s[976]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[280][1]++;}var col=(cov_1ks4ntaci2().s[977]++,{fieldName:fieldName,owner:f.owner,type:f.type});cov_1ks4ntaci2().s[978]++;if("number"===f.type){cov_1ks4ntaci2().b[281][0]++;cov_1ks4ntaci2().s[979]++;col.display="all";}else{cov_1ks4ntaci2().b[281][1]++;}cov_1ks4ntaci2().s[980]++;this.columns.push(col);cov_1ks4ntaci2().s[981]++;return this;},/** + * Add a column split on a numeric field, splitting the values into ranges. + * + * @param {String} fieldName The field to split on. + * @param {Object} options An optional dictionary of collection filtering and pagination options: + * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. + * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. + * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. + * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addRangeColumnSplit:function(fieldName,ranges){cov_1ks4ntaci2().f[290]++;cov_1ks4ntaci2().s[982]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[282][0]++;cov_1ks4ntaci2().s[983]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[282][1]++;}var f=(cov_1ks4ntaci2().s[984]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[985]++;if("number"!==f.type){cov_1ks4ntaci2().b[283][0]++;cov_1ks4ntaci2().s[986]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[283][1]++;}// In Splunk 6.0.1.1, data models incorrectly expect strings for these fields +// instead of numbers. In 6.1, this is fixed and both are accepted. +var updatedRanges=(cov_1ks4ntaci2().s[987]++,{});cov_1ks4ntaci2().s[988]++;if((cov_1ks4ntaci2().b[285][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[285][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[284][0]++;cov_1ks4ntaci2().s[989]++;updatedRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[284][1]++;}cov_1ks4ntaci2().s[990]++;if((cov_1ks4ntaci2().b[287][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[287][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[286][0]++;cov_1ks4ntaci2().s[991]++;updatedRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[286][1]++;}cov_1ks4ntaci2().s[992]++;if((cov_1ks4ntaci2().b[289][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[289][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[288][0]++;cov_1ks4ntaci2().s[993]++;updatedRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[288][1]++;}cov_1ks4ntaci2().s[994]++;if((cov_1ks4ntaci2().b[291][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[291][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[290][0]++;cov_1ks4ntaci2().s[995]++;updatedRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[290][1]++;}cov_1ks4ntaci2().s[996]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,display:"ranges",ranges:updatedRanges});cov_1ks4ntaci2().s[997]++;return this;},/** + * Add a column split on a boolean valued field. + * + * @param {String} fieldName The name of field to split on. + * @param {String} trueDisplayValue A string to display in the true valued column label. + * @param {String} falseDisplayValue A string to display in the false valued column label. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addBooleanColumnSplit:function(fieldName,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[291]++;cov_1ks4ntaci2().s[998]++;if(!this.dataModelObject.fieldByName(fieldName)){cov_1ks4ntaci2().b[292][0]++;cov_1ks4ntaci2().s[999]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[292][1]++;}var f=(cov_1ks4ntaci2().s[1000]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1001]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[293][0]++;cov_1ks4ntaci2().s[1002]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[293][1]++;}cov_1ks4ntaci2().s[1003]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[1004]++;return this;},/** + * Add a column split on a timestamp valued field, binned by the specified bucket size. + * + * @param {String} fieldName The name of field to split on. + * @param {String} binning The size of bins to use, see class docs for valid types. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addTimestampColumnSplit:function(field,binning){cov_1ks4ntaci2().f[292]++;cov_1ks4ntaci2().s[1005]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[294][0]++;cov_1ks4ntaci2().s[1006]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[294][1]++;}var f=(cov_1ks4ntaci2().s[1007]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[1008]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[295][0]++;cov_1ks4ntaci2().s[1009]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[295][1]++;}cov_1ks4ntaci2().s[1010]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[296][0]++;cov_1ks4ntaci2().s[1011]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[296][1]++;}cov_1ks4ntaci2().s[1012]++;this.columns.push({fieldName:field,owner:f.owner,type:f.type,period:binning});cov_1ks4ntaci2().s[1013]++;return this;},/** + * Add an aggregate to each cell of the pivot. + * + * @param {String} fieldName The name of field to aggregate. + * @param {String} label a human readable name for this aggregate. + * @param {String} statsFunction The function to use for aggregation, see class docs for valid stats functions. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addCellValue:function(fieldName,label,statsFunction){cov_1ks4ntaci2().f[293]++;cov_1ks4ntaci2().s[1014]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[297][0]++;cov_1ks4ntaci2().s[1015]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[297][1]++;}var f=(cov_1ks4ntaci2().s[1016]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1017]++;if((cov_1ks4ntaci2().b[299][0]++,utils.contains(["string","ipv4"],f.type))&&(cov_1ks4ntaci2().b[299][1]++,!utils.contains(["list","values","first","last","count","dc"],statsFunction))){cov_1ks4ntaci2().b[298][0]++;cov_1ks4ntaci2().s[1018]++;throw new Error("Stats function on string and IPv4 fields must be one of:"+" list, distinct_values, first, last, count, or distinct_count; found "+statsFunction);}else{cov_1ks4ntaci2().b[298][1]++;cov_1ks4ntaci2().s[1019]++;if((cov_1ks4ntaci2().b[301][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[301][1]++,!utils.contains(["sum","count","average","min","max","stdev","list","values"],statsFunction))){cov_1ks4ntaci2().b[300][0]++;cov_1ks4ntaci2().s[1020]++;throw new Error("Stats function on number field must be must be one of:"+" sum, count, average, max, min, stdev, list, or distinct_values; found "+statsFunction);}else{cov_1ks4ntaci2().b[300][1]++;cov_1ks4ntaci2().s[1021]++;if((cov_1ks4ntaci2().b[303][0]++,"timestamp"===f.type)&&(cov_1ks4ntaci2().b[303][1]++,!utils.contains(["duration","earliest","latest","list","values"],statsFunction))){cov_1ks4ntaci2().b[302][0]++;cov_1ks4ntaci2().s[1022]++;throw new Error("Stats function on timestamp field must be one of:"+" duration, earliest, latest, list, or distinct values; found "+statsFunction);}else{cov_1ks4ntaci2().b[302][1]++;cov_1ks4ntaci2().s[1023]++;if((cov_1ks4ntaci2().b[305][0]++,utils.contains(["objectCount","childCount"],f.type))&&(cov_1ks4ntaci2().b[305][1]++,"count"!==statsFunction)){cov_1ks4ntaci2().b[304][0]++;cov_1ks4ntaci2().s[1024]++;throw new Error("Stats function on childcount and objectcount fields must be count; "+"found "+statsFunction);}else{cov_1ks4ntaci2().b[304][1]++;cov_1ks4ntaci2().s[1025]++;if("boolean"===f.type){cov_1ks4ntaci2().b[306][0]++;cov_1ks4ntaci2().s[1026]++;throw new Error("Cannot use boolean valued fields as cell values.");}else{cov_1ks4ntaci2().b[306][1]++;}}}}}cov_1ks4ntaci2().s[1027]++;this.cells.push({fieldName:fieldName,owner:f.lineage.join("."),type:f.type,label:label,sparkline:false,// Not properly implemented in core yet. +value:statsFunction});cov_1ks4ntaci2().s[1028]++;return this;},/** + * Returns a JSON ready object representation of this pivot specification. + * + * @return {Object} The JSON ready object representation of this pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */toJsonObject:function(){cov_1ks4ntaci2().f[294]++;cov_1ks4ntaci2().s[1029]++;return{dataModel:this.dataModelObject.dataModel.name,baseClass:this.dataModelObject.name,rows:this.rows,columns:this.columns,cells:this.cells,filters:this.filters};},/** + * Query Splunk for SPL queries corresponding to a pivot report + * for this data model, defined by this `PivotSpecification`. + * + * @example + * + * service.dataModels().fetch(function(err, dataModels) { + * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); + * var pivotSpec = searches.createPivotSpecification(); + * // Use of the fluent API + * pivotSpec.addRowSplit("user", "Executing user") + * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) + * .addCellValue("search", "Search Query", "values") + * .pivot(function(pivotErr, pivot) { + * console.log("Pivot search is:", pivot.search); + * }); + * }); + * + * @param {Function} callback A function to call when done getting the pivot: `(err, pivot)`. + * + * @method splunkjs.Service.PivotSpecification + */pivot:function(callback){cov_1ks4ntaci2().f[295]++;var svc=(cov_1ks4ntaci2().s[1030]++,this.dataModelObject.dataModel.service);var args=(cov_1ks4ntaci2().s[1031]++,{pivot_json:JSON.stringify(this.toJsonObject())});cov_1ks4ntaci2().s[1032]++;if(!utils.isUndefined(this.accelerationNamespace)){cov_1ks4ntaci2().b[307][0]++;cov_1ks4ntaci2().s[1033]++;args.namespace=this.accelerationNamespace;}else{cov_1ks4ntaci2().b[307][1]++;}cov_1ks4ntaci2().s[1034]++;return svc.get(Paths.pivot+"/"+encodeURIComponent(this.dataModelObject.dataModel.name),args,function(err,response){cov_1ks4ntaci2().f[296]++;cov_1ks4ntaci2().s[1035]++;if(err){cov_1ks4ntaci2().b[308][0]++;cov_1ks4ntaci2().s[1036]++;callback(new Error(err.data.messages[0].text),response);cov_1ks4ntaci2().s[1037]++;return;}else{cov_1ks4ntaci2().b[308][1]++;}cov_1ks4ntaci2().s[1038]++;if((cov_1ks4ntaci2().b[310][0]++,response.data.entry)&&(cov_1ks4ntaci2().b[310][1]++,response.data.entry[0])){cov_1ks4ntaci2().b[309][0]++;cov_1ks4ntaci2().s[1039]++;callback(null,new root.Pivot(svc,response.data.entry[0].content));}else{cov_1ks4ntaci2().b[309][1]++;cov_1ks4ntaci2().s[1040]++;callback(new Error("Didn't get a Pivot report back from Splunk"),response);}});},/** + * Convenience method to wrap up the `PivotSpecification.pivot()` and + * `Pivot.run()` function calls. + * + * Query Splunk for SPL queries corresponding to a pivot report + * for this data model, defined by this `PivotSpecification`; then, + * starts a search job running this pivot, accelerated if possible. + * + * service.dataModels().fetch(function(fetchErr, dataModels) { + * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); + * var pivotSpec = searches.createPivotSpecification(); + * // Use of the fluent API + * pivotSpec.addRowSplit("user", "Executing user") + * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) + * .addCellValue("search", "Search Query", "values") + * .run(function(err, job, pivot) { + * console.log("Job SID is:", job.sid); + * console.log("Pivot search is:", pivot.search); + * }); + * }); + * @param {Object} args A dictionary of properties for the search job (optional). For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {Function} callback A function to call when done getting the pivot: `(err, job, pivot)`. + * + * @method splunkjs.Service.PivotSpecification + */run:function(args,callback){cov_1ks4ntaci2().f[297]++;cov_1ks4ntaci2().s[1041]++;if(!callback){cov_1ks4ntaci2().b[311][0]++;cov_1ks4ntaci2().s[1042]++;callback=args;cov_1ks4ntaci2().s[1043]++;args={};}else{cov_1ks4ntaci2().b[311][1]++;}cov_1ks4ntaci2().s[1044]++;args=(cov_1ks4ntaci2().b[312][0]++,args)||(cov_1ks4ntaci2().b[312][1]++,{});cov_1ks4ntaci2().s[1045]++;this.pivot(function(err,pivot){cov_1ks4ntaci2().f[298]++;cov_1ks4ntaci2().s[1046]++;if(err){cov_1ks4ntaci2().b[313][0]++;cov_1ks4ntaci2().s[1047]++;callback(err,null,null);}else{cov_1ks4ntaci2().b[313][1]++;cov_1ks4ntaci2().s[1048]++;pivot.run(args,Async.augment(callback,pivot));}});}});/** + * Represents one of the structured views in a `DataModel`. + * + * Has these properties: + * - `dataModel` (_splunkjs.Service.DataModel_): The `DataModel` to which this `DataModelObject` belongs. + * - `name` (_string_): The name of this `DataModelObject`. + * - `displayName` (_string_): The human readable name of this `DataModelObject`. + * - `parentName` (_string_): The name of the parent `DataModelObject` to this one. + * - `lineage` (_array_): An array of strings of the lineage of the data model + * on which this field is defined. + * - `fields` (_object_): A dictionary of `DataModelField` objects, accessible by name. + * - `constraints` (_array_): An array of `DataModelConstraint` objects. + * - `calculations` (_object_): A dictionary of `DataModelCalculation` objects, accessible by ID. + * + * BaseSearch has an additional property: + * - `baseSearch` (_string_): The search query wrapped by this data model object. + * + * BaseTransaction has additional properties: + * - `groupByFields` (_string_): The fields that will be used to group events into transactions. + * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned + * and split into transactions. + * - `maxSpan` (_string_): The maximum time span of a transaction. + * - `maxPause` (_string_): The maximum pause time of a transaction. + * + * @class splunkjs.Service.DataModelObject + */cov_1ks4ntaci2().s[1049]++;root.DataModelObject=Class.extend({/** + * Constructor for a data model object. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `objectName` (_string_): The name for this data model object. + * - `displayName` (_string_): A human readable name for this data model object. + * - `parentName` (_string_): The name of the data model that owns this data model object. + * - `lineage` (_string_): The lineage of the data model that owns this data model object, + * items are delimited by a dot. This is converted into an array of + * strings upon construction. + * - `fields` (_array_): An array of data model fields. + * - `constraints` (_array_): An array of data model constraints. + * - `calculations` (_array_): An array of data model calculations. + * - `baseSearch` (_string_): The search query wrapped by this data model object; exclusive to BaseSearch (optional) + * - `groupByFields` (_array_): The fields that will be used to group events into transactions; exclusive to BaseTransaction (optional) + * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned + * and split into transactions; exclusive to BaseTransaction (optional) + * - `maxSpan` (_string_): The maximum time span of a transaction; exclusive to BaseTransaction (optional) + * - `maxPause` (_string_): The maximum pause time of a transaction; exclusive to BaseTransaction (optional) + * + * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. + * + * @method splunkjs.Service.DataModelObject + */init:function(props,parentDataModel){cov_1ks4ntaci2().f[299]++;cov_1ks4ntaci2().s[1050]++;props=(cov_1ks4ntaci2().b[314][0]++,props)||(cov_1ks4ntaci2().b[314][1]++,{});cov_1ks4ntaci2().s[1051]++;props.owner=(cov_1ks4ntaci2().b[315][0]++,props.owner)||(cov_1ks4ntaci2().b[315][1]++,"");cov_1ks4ntaci2().s[1052]++;this.dataModel=parentDataModel;cov_1ks4ntaci2().s[1053]++;this.name=props.objectName;cov_1ks4ntaci2().s[1054]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[1055]++;this.parentName=props.parentName;cov_1ks4ntaci2().s[1056]++;this.lineage=props.lineage.split(".");// Properties exclusive to BaseTransaction +cov_1ks4ntaci2().s[1057]++;if(props.hasOwnProperty("groupByFields")){cov_1ks4ntaci2().b[316][0]++;cov_1ks4ntaci2().s[1058]++;this.groupByFields=props.groupByFields;}else{cov_1ks4ntaci2().b[316][1]++;}cov_1ks4ntaci2().s[1059]++;if(props.hasOwnProperty("objectsToGroup")){cov_1ks4ntaci2().b[317][0]++;cov_1ks4ntaci2().s[1060]++;this.objectsToGroup=props.objectsToGroup;}else{cov_1ks4ntaci2().b[317][1]++;}cov_1ks4ntaci2().s[1061]++;if(props.hasOwnProperty("transactionMaxTimeSpan")){cov_1ks4ntaci2().b[318][0]++;cov_1ks4ntaci2().s[1062]++;this.maxSpan=props.transactionMaxTimeSpan;}else{cov_1ks4ntaci2().b[318][1]++;}cov_1ks4ntaci2().s[1063]++;if(props.hasOwnProperty("transactionMaxPause")){cov_1ks4ntaci2().b[319][0]++;cov_1ks4ntaci2().s[1064]++;this.maxPause=props.transactionMaxPause;}else{cov_1ks4ntaci2().b[319][1]++;}// Property exclusive to BaseSearch +cov_1ks4ntaci2().s[1065]++;if(props.hasOwnProperty("baseSearch")){cov_1ks4ntaci2().b[320][0]++;cov_1ks4ntaci2().s[1066]++;this.baseSearch=props.baseSearch;}else{cov_1ks4ntaci2().b[320][1]++;}// Parse fields +cov_1ks4ntaci2().s[1067]++;this.fields={};cov_1ks4ntaci2().s[1068]++;for(var i=(cov_1ks4ntaci2().s[1069]++,0);iSearch job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {String} querySuffix A search query, starting with a '|' that will be appended to the command to fetch the contents of this data model object (e.g., "| head 3"). + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @method splunkjs.Service.DataModelObject + */startSearch:function(params,querySuffix,callback){cov_1ks4ntaci2().f[311]++;var query=(cov_1ks4ntaci2().s[1112]++,"| datamodel "+this.dataModel.name+" "+this.name+" search");// Prepend a space to the querySuffix, or set it to an empty string if null or undefined +cov_1ks4ntaci2().s[1113]++;querySuffix=querySuffix?(cov_1ks4ntaci2().b[327][0]++," "+querySuffix):(cov_1ks4ntaci2().b[327][1]++,"");cov_1ks4ntaci2().s[1114]++;this.dataModel.service.search(query+querySuffix,params,callback);},/** + * Returns the data model object this one inherits from if it is a user defined, + * otherwise return null. + * + * @return {splunkjs.Service.DataModelObject|null} This data model object's parent + * or null if this is not a user defined data model object. + * + * @method splunkjs.Service.DataModelObject + */parent:function(){cov_1ks4ntaci2().f[312]++;cov_1ks4ntaci2().s[1115]++;return this.dataModel.objectByName(this.parentName);},/** + * Returns a new Pivot Specification, accepts no parameters. + * + * @return {splunkjs.Service.PivotSpecification} A new pivot specification. + * + * @method splunkjs.Service.DataModelObject + */createPivotSpecification:function(){cov_1ks4ntaci2().f[313]++;cov_1ks4ntaci2().s[1116]++;// Pass in this DataModelObject to create a PivotSpecification +return new root.PivotSpecification(this);}});/** + * Represents a data model on the server. Data models + * contain `DataModelObject` instances, which specify structured + * views on Splunk data. + * + * @endpoint datamodel/model/{name} + * @class splunkjs.Service.DataModel + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[1117]++;root.DataModel=Service.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.DataModel + */path:function(){cov_1ks4ntaci2().f[314]++;cov_1ks4ntaci2().s[1118]++;return Paths.dataModels+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.DataModel`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name for the new data model. + * @param {Object} namespace (Optional) namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Object} props Properties of this data model: + * - `acceleration` (_string_): A JSON object with an `enabled` key, representing if acceleration is enabled or not. + * - `concise` (_string_): Indicates whether to list a concise JSON description of the data model, should always be "0". + * - `description` (_string_): The JSON describing the data model. + * - `displayName` (_string_): The name displayed for the data model in Splunk Web. + * + * @method splunkjs.Service.DataModel + */init:function(service,name,namespace,props){cov_1ks4ntaci2().f[315]++;cov_1ks4ntaci2().s[1119]++;// If not given a 4th arg, assume the namespace was omitted +if(!props){cov_1ks4ntaci2().b[328][0]++;cov_1ks4ntaci2().s[1120]++;props=namespace;cov_1ks4ntaci2().s[1121]++;namespace={};}else{cov_1ks4ntaci2().b[328][1]++;}cov_1ks4ntaci2().s[1122]++;this.name=name;cov_1ks4ntaci2().s[1123]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[1124]++;this.acceleration=(cov_1ks4ntaci2().b[329][0]++,JSON.parse(props.content.acceleration))||(cov_1ks4ntaci2().b[329][1]++,{});cov_1ks4ntaci2().s[1125]++;if(this.acceleration.hasOwnProperty("enabled")){cov_1ks4ntaci2().b[330][0]++;cov_1ks4ntaci2().s[1126]++;// convert the enabled property to a boolean +this.acceleration.enabled=!!this.acceleration.enabled;}else{cov_1ks4ntaci2().b[330][1]++;}// concise=0 (false) forces the server to return all details of the newly created data model. +// we do not want a summary of this data model +cov_1ks4ntaci2().s[1127]++;if((cov_1ks4ntaci2().b[332][0]++,!props.hasOwnProperty("concise"))||(cov_1ks4ntaci2().b[332][1]++,utils.isUndefined(props.concise))){cov_1ks4ntaci2().b[331][0]++;cov_1ks4ntaci2().s[1128]++;this.concise="0";}else{cov_1ks4ntaci2().b[331][1]++;}var dataModelDefinition=(cov_1ks4ntaci2().s[1129]++,JSON.parse(props.content.description));cov_1ks4ntaci2().s[1130]++;this.objectNames=dataModelDefinition.objectNameList;cov_1ks4ntaci2().s[1131]++;this.displayName=dataModelDefinition.displayName;cov_1ks4ntaci2().s[1132]++;this.description=dataModelDefinition.description;// Parse the objects for this data model +var objs=(cov_1ks4ntaci2().s[1133]++,dataModelDefinition.objects);cov_1ks4ntaci2().s[1134]++;this.objects=[];cov_1ks4ntaci2().s[1135]++;for(var i=(cov_1ks4ntaci2().s[1136]++,0);i0);}});}});})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2UuanMiXSwibmFtZXMiOlsiQ29udGV4dCIsInJlcXVpcmUiLCJIdHRwIiwiQXN5bmMiLCJQYXRocyIsIkNsYXNzIiwidXRpbHMiLCJyb290IiwiZXhwb3J0cyIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSIsImV4dGVuZCIsImluaXQiLCJfc3VwZXIiLCJhcHBseSIsImFyZ3VtZW50cyIsIm1vZHVsZSIsInNwZWNpYWxpemUiLCJiaW5kIiwiYXBwcyIsImNvbmZpZ3VyYXRpb25zIiwiaW5kZXhlcyIsInNhdmVkU2VhcmNoZXMiLCJqb2JzIiwidXNlcnMiLCJjdXJyZW50VXNlciIsInZpZXdzIiwiZmlyZWRBbGVydEdyb3VwcyIsImRhdGFNb2RlbHMiLCJvd25lciIsImFwcCIsImh0dHAiLCJzY2hlbWUiLCJob3N0IiwicG9ydCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZXNzaW9uS2V5IiwidmVyc2lvbiIsIkFwcGxpY2F0aW9ucyIsIm5hbWVzcGFjZSIsIkNvbmZpZ3VyYXRpb25zIiwiSW5kZXhlcyIsIlNhdmVkU2VhcmNoZXMiLCJzdG9yYWdlUGFzc3dvcmRzIiwiU3RvcmFnZVBhc3N3b3JkcyIsIkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb24iLCJKb2JzIiwiRGF0YU1vZGVscyIsIlVzZXJzIiwiVmlld3MiLCJzZWFyY2giLCJxdWVyeSIsInBhcmFtcyIsImNhbGxiYWNrIiwiaXNGdW5jdGlvbiIsImdldEpvYiIsInNpZCIsImpvYiIsIkpvYiIsImZldGNoIiwib25lc2hvdFNlYXJjaCIsInRoYXQiLCJyZXEiLCJnZXQiLCJlcnIiLCJyZXNwb25zZSIsImRhdGEiLCJlbnRyeSIsImNvbnRlbnQiLCJ1c2VyIiwiVXNlciIsIndhc0Fib3J0ZWQiLCJzZXJ2ZXJJbmZvIiwiU2VydmVySW5mbyIsInBhcnNlIiwicSIsInBhcnNlciIsInR5cGVhaGVhZCIsInByZWZpeCIsImNvdW50IiwicmVzdWx0cyIsImxvZyIsImV2ZW50IiwiaXNPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5IiwicGF0aCIsInBhdGhzIiwic3VibWl0RXZlbnQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsInBvc3QiLCJyZXF1ZXN0IiwiRW5kcG9pbnQiLCJzZXJ2aWNlIiwicXVhbGlmaWVkUGF0aCIsIkVycm9yIiwiZGVsIiwicmVscGF0aCIsInVybCIsImdldF92MiIsIlJlc291cmNlIiwiZnVsbHBhdGgiLCJfcHJvcGVydGllcyIsIl9zdGF0ZSIsIl9sb2FkIiwicHJvcGVydGllcyIsInN0YXRlIiwiRW50aXR5IiwiZmV0Y2hPblVwZGF0ZSIsInJlbW92ZSIsInVwZGF0ZSIsImZpZWxkcyIsImxpbmtzIiwiYWNsIiwiYXV0aG9yIiwidXBkYXRlZCIsInB1Ymxpc2hlZCIsImVuYWJsZSIsImRpc2FibGUiLCJyZWxvYWQiLCJfZmllbGRzIiwiX2FjbCIsIl9saW5rcyIsImlzQXJyYXkiLCJfYXV0aG9yIiwiX3VwZGF0ZWQiLCJfcHVibGlzaGVkIiwib3B0aW9ucyIsInByb3BzIiwiaGFzT3duUHJvcGVydHkiLCJDb2xsZWN0aW9uIiwiZmV0Y2hPbkVudGl0eUNyZWF0aW9uIiwiY3JlYXRlIiwibGlzdCIsIml0ZW0iLCJpbnN0YW50aWF0ZUVudGl0eSIsIl9lbnRpdGllcyIsIl9lbnRpdGllc0J5TmFtZSIsIl9wYWdpbmciLCJlbnRpdGllcyIsImVudGl0aWVzQnlOYW1lIiwiZW50aXR5UHJvcGVydHlMaXN0IiwiaSIsImxlbmd0aCIsImVudGl0eSIsInB1c2giLCJuYW1lIiwicGFnaW5nIiwiZmV0Y2hfdjIiLCJpZCIsImlzRW1wdHkiLCJmdWxsUGF0aCIsImNsb25lIiwiU2F2ZWRTZWFyY2giLCJlbmNvZGVVUklDb21wb25lbnQiLCJhY2tub3dsZWRnZSIsImRpc3BhdGNoIiwiaGlzdG9yeSIsInN1cHByZXNzSW5mbyIsImFsZXJ0Q291bnQiLCJwYXJzZUludCIsInRyaWdnZXJlZF9hbGVydF9jb3VudCIsImZpcmVkQWxlcnRHcm91cCIsIkZpcmVkQWxlcnRHcm91cCIsImpvYkRhdGEiLCJuYW1lc3BhY2VGcm9tUHJvcGVydGllcyIsImNhbGwiLCJlbnRpdHlOYW1lc3BhY2UiLCJTdG9yYWdlUGFzc3dvcmQiLCJGaXJlZEFsZXJ0IiwiZmlyZWRBbGVydHMiLCJhY3Rpb25zIiwiYWxlcnRUeXBlIiwiYWxlcnRfdHlwZSIsImlzRGlnZXN0TW9kZSIsImRpZ2VzdF9tb2RlIiwiZXhwaXJhdGlvblRpbWUiLCJleHBpcmF0aW9uX3RpbWVfcmVuZGVyZWQiLCJzYXZlZFNlYXJjaE5hbWUiLCJzYXZlZHNlYXJjaF9uYW1lIiwic2V2ZXJpdHkiLCJ0cmlnZ2VyVGltZSIsInRyaWdnZXJfdGltZSIsInRyaWdnZXJUaW1lUmVuZGVyZWQiLCJ0cmlnZ2VyX3RpbWVfcmVuZGVyZWQiLCJ0cmlnZ2VyZWRBbGVydENvdW50IiwidHJpZ2dlcmVkX2FsZXJ0cyIsImZpcmVkQWxlcnREYXRhIiwiZmlyZWRBbGVydCIsIkFwcGxpY2F0aW9uIiwic2V0dXBJbmZvIiwidXBkYXRlSW5mbyIsImluZm8iLCJWaWV3IiwiSW5kZXgiLCJyZXN1bHQiLCJ2ZXJzaW9uQ29tcGFyZSIsIkNvbmZpZ3VyYXRpb25TdGFuemEiLCJmaWxlIiwiQ29uZmlndXJhdGlvbkZpbGUiLCJnZXREZWZhdWx0U3RhbnphIiwic3RhbnphTmFtZSIsInZhbHVlcyIsImZpbGVuYW1lIiwiX19jb25mIiwiZG9lc0ZpbGVFeGlzdCIsImZpbGVzIiwiZmlsdGVyIiwiZiIsImNvZGUiLCJtZXNzYWdlIiwiY29uZmlndXJhdGlvbkZpbGUiLCJmZXRjaGVkRmlsZSIsImVycm9yIiwiZXJyb3JDb2RlIiwiZXJyb3JNZXNzYWdlIiwiZG9lc1N0YW56YUV4aXN0Iiwic3RhbnphIiwiZmV0Y2hlZFN0YW56YSIsImNyZWF0ZV92MiIsImNvbmZpZ3MiLCJzdmMiLCJrZXlWYWx1ZU1hcCIsImRvZXNGaWxlRXhpc3RSZXNwb25zZSIsImNvbmZpZ0ZpbGUiLCJjb25zb2xlIiwibmV3RmlsZSIsImRvZXNTdGFuemFFeGlzdFJlc3BvbnNlIiwiY29uZmlnU3RhbnphIiwibmV3U3RhbnphIiwidXBkYXRlZFN0YW56YSIsImNhbmNlbCIsImRpc2FibGVQcmV2aWV3IiwiZW5hYmxlUHJldmlldyIsImV2ZW50cyIsImZpbmFsaXplIiwicGF1c2UiLCJwcmV2aWV3Iiwic2VhcmNobG9nIiwic2V0UHJpb3JpdHkiLCJzZXRUVEwiLCJzdW1tYXJ5IiwidGltZWxpbmUiLCJ0b3VjaCIsInVucGF1c2UiLCJhY3Rpb24iLCJvdXRwdXRfbW9kZSIsIml0ZXJhdG9yIiwidHlwZSIsIlBhZ2luYXRlZEVuZHBvaW50SXRlcmF0b3IiLCJ2YWx1ZSIsInByaW9yaXR5IiwidHRsIiwidHJhY2siLCJjYWxsYmFja3MiLCJwZXJpb2QiLCJkb25lIiwibm9DYWxsYmFja3NBZnRlclJlYWR5IiwicHJvZ3Jlc3MiLCJmYWlsZWQiLCJyZWFkeSIsIl9wcmVyZWFkeSIsIl9zdG9wcGVkQWZ0ZXJSZWFkeSIsImVtaXR0ZWRSZWFkeSIsImRvbmVMb29waW5nIiwid2hpbHN0IiwibmV4dEl0ZXJhdGlvbiIsImRpc3BhdGNoU3RhdGUiLCJub3RSZWFkeSIsImlzRG9uZSIsImlzRmFpbGVkIiwic2xlZXAiLCJleGVjX21vZGUiLCJ0b0xvd2VyQ2FzZSIsIm91dHB1dE1vZGUiLCJEYXRhTW9kZWxGaWVsZCIsIl90eXBlcyIsImZpZWxkTmFtZSIsImRpc3BsYXlOYW1lIiwibXVsdGl2YWx1ZWQiLCJtdWx0aXZhbHVlIiwicmVxdWlyZWQiLCJoaWRkZW4iLCJlZGl0YWJsZSIsImNvbW1lbnQiLCJmaWVsZFNlYXJjaCIsImxpbmVhZ2UiLCJzcGxpdCIsImlzU3RyaW5nIiwiaXNOdW1iZXIiLCJpc1RpbWVzdGFtcCIsImlzT2JqZWN0Y291bnQiLCJpc0NoaWxkY291bnQiLCJpc0lQdjQiLCJpc0Jvb2xlYW4iLCJEYXRhTW9kZWxDb25zdHJhaW50IiwiRGF0YU1vZGVsQ2FsY3VsYXRpb24iLCJjYWxjdWxhdGlvbklEIiwiY2FsY3VsYXRpb25UeXBlIiwib3V0cHV0RmllbGRzIiwiZXhwcmVzc2lvbiIsImlucHV0RmllbGQiLCJsb29rdXBOYW1lIiwiaW5wdXRGaWVsZE1hcHBpbmdzIiwibG9va3VwSW5wdXRzIiwib3V0cHV0RmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJpc0VkaXRhYmxlIiwiaXNMb29rdXAiLCJpc0V2YWwiLCJpc1JleCIsImlzR2VvSVAiLCJQaXZvdCIsImRyaWxsZG93blNlYXJjaCIsImRyaWxsZG93bl9zZWFyY2giLCJwcmV0dHlRdWVyeSIsIm9wZW5JblNlYXJjaCIsIm9wZW5faW5fc2VhcmNoIiwicGl2b3RTZWFyY2giLCJwaXZvdF9zZWFyY2giLCJ0c3RhdHNTZWFyY2giLCJ0c3RhdHNfc2VhcmNoIiwicnVuIiwiYXJncyIsImlzVW5kZWZpbmVkIiwiUGl2b3RTcGVjaWZpY2F0aW9uIiwiX2NvbXBhcmlzb25zIiwiYm9vbGVhbiIsInN0cmluZyIsIm51bWJlciIsImlwdjQiLCJfYmlubmluZyIsIl9zb3J0RGlyZWN0aW9uIiwiX3N0YXRzRnVuY3Rpb25zIiwiZGF0YU1vZGVsT2JqZWN0IiwiY29sdW1ucyIsInJvd3MiLCJmaWx0ZXJzIiwiY2VsbHMiLCJhY2NlbGVyYXRpb25OYW1lc3BhY2UiLCJkYXRhTW9kZWwiLCJpc0FjY2VsZXJhdGVkIiwicGl2b3QiLCJzZXRBY2NlbGVyYXRpb25Kb2IiLCJhZGRGaWx0ZXIiLCJjb21wYXJpc29uVHlwZSIsImNvbXBhcmlzb25PcCIsImNvbXBhcmVUbyIsImhhc0ZpZWxkIiwiZmllbGRCeU5hbWUiLCJjb250YWlucyIsInJldCIsImpvaW4iLCJydWxlIiwiY29tcGFyYXRvciIsImFkZExpbWl0RmlsdGVyIiwic29ydEF0dHJpYnV0ZSIsInNvcnREaXJlY3Rpb24iLCJsaW1pdCIsInN0YXRzRnVuY3Rpb24iLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlT3duZXIiLCJsaW1pdEFtb3VudCIsInN0YXRzRm4iLCJsaW1pdFR5cGUiLCJhZGRSb3dTcGxpdCIsImxhYmVsIiwicm93IiwiZGlzcGxheSIsImFkZFJhbmdlUm93U3BsaXQiLCJmaWVsZCIsInJhbmdlcyIsInVwZGF0ZVJhbmdlcyIsInN0YXJ0IiwiZW5kIiwic3RlcCIsInNpemUiLCJtYXhOdW1iZXJPZiIsImFkZEJvb2xlYW5Sb3dTcGxpdCIsInRydWVEaXNwbGF5VmFsdWUiLCJmYWxzZURpc3BsYXlWYWx1ZSIsInRydWVMYWJlbCIsImZhbHNlTGFiZWwiLCJhZGRUaW1lc3RhbXBSb3dTcGxpdCIsImJpbm5pbmciLCJhZGRDb2x1bW5TcGxpdCIsImNvbCIsImFkZFJhbmdlQ29sdW1uU3BsaXQiLCJ1cGRhdGVkUmFuZ2VzIiwiYWRkQm9vbGVhbkNvbHVtblNwbGl0IiwiYWRkVGltZXN0YW1wQ29sdW1uU3BsaXQiLCJhZGRDZWxsVmFsdWUiLCJzcGFya2xpbmUiLCJ0b0pzb25PYmplY3QiLCJiYXNlQ2xhc3MiLCJwaXZvdF9qc29uIiwibWVzc2FnZXMiLCJ0ZXh0IiwiYXVnbWVudCIsIkRhdGFNb2RlbE9iamVjdCIsInBhcmVudERhdGFNb2RlbCIsIm9iamVjdE5hbWUiLCJwYXJlbnROYW1lIiwiZ3JvdXBCeUZpZWxkcyIsIm9iamVjdHNUb0dyb3VwIiwibWF4U3BhbiIsInRyYW5zYWN0aW9uTWF4VGltZVNwYW4iLCJtYXhQYXVzZSIsInRyYW5zYWN0aW9uTWF4UGF1c2UiLCJiYXNlU2VhcmNoIiwiY29uc3RyYWludHMiLCJqIiwiY2FsY3VsYXRpb25zIiwiayIsImlzQmFzZVNlYXJjaCIsImlzQmFzZVRyYW5zYWN0aW9uIiwiZmllbGROYW1lcyIsImNhbGN1bGF0ZWRGaWVsZHMiLCJhbGxGaWVsZHMiLCJjb21iaW5lZEZpZWxkcyIsImNmIiwiYWxsRmllbGROYW1lcyIsImNhbGN1bGF0aW9uSURzIiwiY2FsY3VsYXRpb24iLCJjYWxjdWxhdGVkRmllbGROYW1lcyIsImNyZWF0ZUxvY2FsQWNjZWxlcmF0aW9uSm9iIiwiZWFybGllc3RUaW1lIiwidW5kZWZpbmVkIiwiZWFybGllc3RfdGltZSIsInN0YXJ0U2VhcmNoIiwicXVlcnlTdWZmaXgiLCJwYXJlbnQiLCJvYmplY3RCeU5hbWUiLCJjcmVhdGVQaXZvdFNwZWNpZmljYXRpb24iLCJEYXRhTW9kZWwiLCJhY2NlbGVyYXRpb24iLCJlbmFibGVkIiwiY29uY2lzZSIsImRhdGFNb2RlbERlZmluaXRpb24iLCJkZXNjcmlwdGlvbiIsIm9iamVjdE5hbWVzIiwib2JqZWN0TmFtZUxpc3QiLCJvYmpzIiwib2JqZWN0cyIsImhhc09iamVjdCIsInVwZGF0ZWRQcm9wcyIsImFjY2NlbGVyYXRpb24iLCJjcm9uX3NjaGVkdWxlIiwiY3JvblNjaGVkdWxlIiwiZGF0YU1vZGVsTmFtZXNwYWNlIiwicmVwbGFjZSIsImVuZHBvaW50IiwiX2VuZHBvaW50IiwiX3BhZ2VzaXplIiwicGFnZXNpemUiLCJfb2Zmc2V0IiwibmV4dCIsIm9mZnNldCIsIm51bVJlc3VsdHMiXSwibWFwcGluZ3MiOiI4bnZOQWVZO21IQWZaLEssQ0FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLENBQUMsVUFBVyxDQUNSLGFBRFEsd0JBR1IsR0FBSUEsQ0FBQUEsT0FBTywwQkFBT0MsT0FBTyxDQUFDLFdBQUQsQ0FBZCxDQUFYLENBQ0EsR0FBSUMsQ0FBQUEsSUFBSSwwQkFBVUQsT0FBTyxDQUFDLFFBQUQsQ0FBakIsQ0FBUixDQUNBLEdBQUlFLENBQUFBLEtBQUssMEJBQVNGLE9BQU8sQ0FBQyxTQUFELENBQWhCLENBQVQsQ0FDQSxHQUFJRyxDQUFBQSxLQUFLLDBCQUFTSCxPQUFPLENBQUMsU0FBRCxDQUFQLENBQW1CRyxLQUE1QixDQUFULENBQ0EsR0FBSUMsQ0FBQUEsS0FBSywwQkFBU0osT0FBTyxDQUFDLGdCQUFELENBQVAsQ0FBMEJJLEtBQW5DLENBQVQsQ0FDQSxHQUFJQyxDQUFBQSxLQUFLLDBCQUFTTCxPQUFPLENBQUMsU0FBRCxDQUFoQixDQUFULENBRUEsR0FBSU0sQ0FBQUEsSUFBSSwwQkFBRyw0QkFBQUMsT0FBTywrQkFBSSxJQUFKLENBQVYsQ0FBUixDQUNBLEdB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UCxDQUFnQjZYLFVBQVUsQ0FBRyxDQUE3QixDQUFSLENBQ0gsQ0FDSixDQVZNLENBQVAsQ0FXSCxDQTdCeUMsQ0FBYixDQUFqQyxDQStCSCxDQTNwTEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEqL1xuLy8gQ29weXJpZ2h0IDIwMTQgU3BsdW5rLCBJbmMuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTogeW91IG1heVxuLy8gbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW5cbi8vIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVRcbi8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZVxuLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgXG4gICAgdmFyIENvbnRleHQgICAgID0gcmVxdWlyZSgnLi9jb250ZXh0Jyk7XG4gICAgdmFyIEh0dHAgICAgICAgID0gcmVxdWlyZSgnLi9odHRwJyk7XG4gICAgdmFyIEFzeW5jICAgICAgID0gcmVxdWlyZSgnLi9hc3luYycpO1xuICAgIHZhciBQYXRocyAgICAgICA9IHJlcXVpcmUoJy4vcGF0aHMnKS5QYXRocztcbiAgICB2YXIgQ2xhc3MgICAgICAgPSByZXF1aXJlKCcuL2pxdWVyeS5jbGFzcycpLkNsYXNzO1xuICAgIHZhciB1dGlscyAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbiAgICBcbiAgICB2YXIgcm9vdCA9IGV4cG9ydHMgfHwgdGhpcztcbiAgICB2YXIgU2VydmljZSA9IG51bGw7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gU3BsdW5rIEVudGVycHJpc2UgYW5kIFNwbHVuayBTdG9ybS5cbiAgICAgKiBcbiAgICAgKiBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBhbmQgaXMgdGhlcmVmb3JlIFNESy1wcml2YXRlLlxuICAgICAqIFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5wcml2YXRlLkJhc2VTZXJ2aWNlXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuQ29udGV4dFxuICAgICAqL1xuICAgIHZhciBCYXNlU2VydmljZSA9IENvbnRleHQuZXh0ZW5kKHtcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJvb3QgYWNjZXNzIHBvaW50IHRvIFNwbHVuayBmdW5jdGlvbmFsaXR5IHdpdGggdHlwZWQgYWNjZXNzIHRvIFxuICAgICAqIFNwbHVuayByZXNvdXJjZXMgc3VjaCBhcyBzZWFyY2hlcywgaW5kZXhlcywgaW5wdXRzLCBhbmQgbW9yZS4gUHJvdmlkZXNcbiAgICAgKiBtZXRob2RzIHRvIGF1dGhlbnRpY2F0ZSBhbmQgY3JlYXRlIHNwZWNpYWxpemVkIGluc3RhbmNlcyBvZiB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMucHJpdmF0ZS5CYXNlU2VydmljZVxuICAgICAqL1xuICAgIG1vZHVsZS5leHBvcnRzID0gcm9vdCA9IFNlcnZpY2UgPSBCYXNlU2VydmljZS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuSHR0cH0gaHR0cCBBbiBpbnN0YW5jZSBvZiBhIGBzcGx1bmtqcy5IdHRwYCBjbGFzcy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVyczogXG4gICAgICAgICAqICAgIC0gYHNjaGVtZWAgKF9zdHJpbmdfKTogVGhlIHNjaGVtZSAoXCJodHRwXCIgb3IgXCJodHRwc1wiKSBmb3IgYWNjZXNzaW5nIFNwbHVuay5cbiAgICAgICAgICogICAgLSBgaG9zdGAgKF9zdHJpbmdfKTogVGhlIGhvc3QgbmFtZSAodGhlIGRlZmF1bHQgaXMgXCJsb2NhbGhvc3RcIikuXG4gICAgICAgICAqICAgIC0gYHBvcnRgIChfaW50ZWdlcl8pOiBUaGUgcG9ydCBudW1iZXIgKHRoZSBkZWZhdWx0IGlzIDgwODkpLlxuICAgICAgICAgKiAgICAtIGB1c2VybmFtZWAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayBhY2NvdW50IHVzZXJuYW1lLCB3aGljaCBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgU3BsdW5rIGluc3RhbmNlLlxuICAgICAgICAgKiAgICAtIGBwYXNzd29yZGAgKF9zdHJpbmdfKTogVGhlIHBhc3N3b3JkLCB3aGljaCBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgU3BsdW5rIGluc3RhbmNlLlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIG93bmVyICh1c2VybmFtZSkgY29tcG9uZW50IG9mIHRoZSBuYW1lc3BhY2UuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb21wb25lbnQgb2YgdGhlIG5hbWVzcGFjZS5cbiAgICAgICAgICogICAgLSBgc2Vzc2lvbktleWAgKF9zdHJpbmdfKTogVGhlIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbi5cbiAgICAgICAgICogICAgLSBgYXV0b2xvZ2luYCAoX2Jvb2xlYW5fKTogYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvZyBpbiBhZ2FpbiBpZiB0aGUgc2Vzc2lvbiB0ZXJtaW5hdGVzLCBgZmFsc2VgIGlmIG5vdCAoYHRydWVgIGJ5IGRlZmF1bHQpLlxuICAgICAgICAgKiAgICAtIGB2ZXJzaW9uYCAoX3N0cmluZ18pOiBUaGUgdmVyc2lvbiBzdHJpbmcgZm9yIFNwbHVuaywgZm9yIGV4YW1wbGUgXCI0LjMuMlwiICh0aGUgZGVmYXVsdCBpcyBcIjUuMFwiKS5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLnNwZWNpYWxpemUgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zcGVjaWFsaXplKTtcbiAgICAgICAgICAgIHRoaXMuYXBwcyAgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmFwcHMpO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9ucyAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY29uZmlndXJhdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleGVzICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuaW5kZXhlcyk7XG4gICAgICAgICAgICB0aGlzLnNhdmVkU2VhcmNoZXMgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zYXZlZFNlYXJjaGVzKTtcbiAgICAgICAgICAgIHRoaXMuam9icyAgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmpvYnMpO1xuICAgICAgICAgICAgdGhpcy51c2VycyAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudXNlcnMpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlciAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY3VycmVudFVzZXIpO1xuICAgICAgICAgICAgdGhpcy52aWV3cyAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudmlld3MpO1xuICAgICAgICAgICAgdGhpcy5maXJlZEFsZXJ0R3JvdXBzICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmlyZWRBbGVydEdyb3Vwcyk7XG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbHMgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kYXRhTW9kZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBgU2VydmljZWAgaW5zdGFuY2UgZm9yXG4gICAgICAgICAqIGEgc3BlY2lmaWMgbmFtZXNwYWNlIGNvbnRleHQuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzdmMgPSAuLi47XG4gICAgICAgICAqICAgICAgdmFyIG5ld1NlcnZpY2UgPSBzdmMuc3BlY2lhbGl6ZShcIm15dXNlclwiLCBcInVuaXhcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvd25lciBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBhcHAgVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2V9IFRoZSBzcGVjaWFsaXplZCBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgc3BlY2lhbGl6ZTogZnVuY3Rpb24ob3duZXIsIGFwcCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlKHRoaXMuaHR0cCwge1xuICAgICAgICAgICAgICAgIHNjaGVtZTogdGhpcy5zY2hlbWUsXG4gICAgICAgICAgICAgICAgaG9zdDogdGhpcy5ob3N0LCAgIFxuICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydCwgICAgICAgXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgICAgICAgICAgIGFwcDogYXBwLCBcbiAgICAgICAgICAgICAgICBzZXNzaW9uS2V5OiB0aGlzLnNlc3Npb25LZXksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgQXBwbGljYXRpb25zYCBjb2xsZWN0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIFxuICAgICAgICAgKiBsaXN0IGluc3RhbGxlZCBhcHBzIGFuZCByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgaW5zdGFsbGVkIGFwcHNcbiAgICAgICAgICogICAgICB2YXIgYXBwcyA9IHN2Yy5hcHBzKCk7XG4gICAgICAgICAqICAgICAgYXBwcy5mZXRjaChmdW5jdGlvbihlcnIpIHsgY29uc29sZS5sb2coYXBwcy5saXN0KCkpOyB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9ufSBUaGUgYEFwcGxpY2F0aW9uc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWxcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGFwcHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkFwcGxpY2F0aW9ucyh0aGlzKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgQ29uZmlndXJhdGlvbnNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IFxuICAgICAgICAgKiBjcmVhdGUsIGxpc3QsIGFuZCByZXRyaWV2ZSBjb25maWd1cmF0aW9uICguY29uZikgZmlsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgcHJvcGVydGllcyBpbiB0aGUgJ3Byb3BzLmNvbmYnIGZpbGVcbiAgICAgICAgICogICAgICB2YXIgZmlsZXMgPSBzdmMuY29uZmlndXJhdGlvbnMoKTtcbiAgICAgICAgICogICAgICBmaWxlcy5pdGVtKFwicHJvcHNcIiwgZnVuY3Rpb24oZXJyLCBwcm9wc0ZpbGUpIHtcbiAgICAgICAgICogICAgICAgICAgcHJvcHNGaWxlLmZldGNoKGZ1bmN0aW9uKGVyciwgcHJvcHMpIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BzLnByb3BlcnRpZXMoKSk7IFxuICAgICAgICAgKiAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnN9IFRoZSBgQ29uZmlndXJhdGlvbnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBjb25maWdzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGNvbmZpZ3VyYXRpb25zOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Db25maWd1cmF0aW9ucyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBJbmRleGVzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIFxuICAgICAgICAgKiBsaXN0LCBhbmQgdXBkYXRlIGluZGV4ZXMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYW4gX2ludGVybmFsIGluZGV4XG4gICAgICAgICAqICAgICAgdmFyIGluZGV4ZXMgPSBzdmMuaW5kZXhlcygpO1xuICAgICAgICAgKiAgICAgIGluZGV4ZXMuZmV0Y2goZnVuY3Rpb24oZXJyLCBpbmRleGVzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXMuaXRlbShcIl9pbnRlcm5hbFwiKTtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJXYXMgaW5kZXggZm91bmQ6IFwiICsgISFpbmRleCk7XG4gICAgICAgICAqICAgICAgICAgIC8vIGBpbmRleGAgaXMgYW4gSW5kZXggb2JqZWN0LlxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5JbmRleGVzfSBUaGUgYEluZGV4ZXNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqLyAgICAgICAgXG4gICAgICAgIGluZGV4ZXM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkgeyBcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5JbmRleGVzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFNhdmVkU2VhcmNoZXNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91XG4gICAgICAgICAqIGNyZWF0ZSwgbGlzdCwgYW5kIHVwZGF0ZSBzYXZlZCBzZWFyY2hlcy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgIyBvZiBzYXZlZCBzZWFyY2hlc1xuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaGVzID0gc3ZjLnNhdmVkU2VhcmNoZXMoKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaGVzLmZldGNoKGZ1bmN0aW9uKGVyciwgc2F2ZWRTZWFyY2hlcykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIiMgT2YgU2F2ZWQgU2VhcmNoZXM6IFwiICsgc2F2ZWRTZWFyY2hlcy5saXN0KCkubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc30gVGhlIGBTYXZlZFNlYXJjaGVzYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICAgICAqL1xuICAgICAgICBzYXZlZFNlYXJjaGVzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5TYXZlZFNlYXJjaGVzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFN0b3JhZ2VQYXNzd29yZHNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91XG4gICAgICAgICAqIGNyZWF0ZSwgbGlzdCwgYW5kIHVwZGF0ZSBzdG9yYWdlIHBhc3N3b3Jkcy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgIyBvZiBzdG9yYWdlIHBhc3N3b3Jkc1xuICAgICAgICAgKiAgICAgIHZhciBzdG9yYWdlUGFzc3dvcmRzID0gc3ZjLnN0b3JhZ2VQYXNzd29yZHMoKTtcbiAgICAgICAgICogICAgICBzdG9yYWdlUGFzc3dvcmRzLmZldGNoKGZ1bmN0aW9uKGVyciwgc3RvcmFnZVBhc3N3b3Jkcykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIiMgb2YgU3RvcmFnZSBQYXNzd29yZHM6IFwiICsgc3RvcmFnZVBhc3N3b3Jkcy5saXN0KCkubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc30gVGhlIGBTdG9yYWdlUGFzc3dvcmRzYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc3RvcmFnZS9wYXNzd29yZHNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRzXG4gICAgICAgICAqL1xuICAgICAgICBzdG9yYWdlUGFzc3dvcmRzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5TdG9yYWdlUGFzc3dvcmRzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBGaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdVxuICAgICAgICAgKiBsaXN0IGFsZXJ0IGdyb3Vwcy5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqICAgICAgXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgIyBvZiBmaXJlZCBhbGVydCBncm91cHNcbiAgICAgICAgICogICAgICB2YXIgZmlyZWRBbGVydEdyb3VwcyA9IHN2Yy5maXJlZEFsZXJ0R3JvdXBzKCk7XG4gICAgICAgICAqICAgICAgZmlyZWRBbGVydEdyb3Vwcy5mZXRjaChmdW5jdGlvbihlcnIsIGZpcmVkQWxlcnRHcm91cHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCIjIG9mIGFsZXJ0IGdyb3VwczogXCIgKyBmaXJlZEFsZXJ0R3JvdXBzLmxpc3QoKS5sZW5ndGgpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9ufSBUaGUgYEZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25gIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlc1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGZpcmVkQWxlcnRHcm91cHM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb24odGhpcywgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYEpvYnNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IGNyZWF0ZSwgbGlzdCxcbiAgICAgICAgICogYW5kIHJldHJpZXZlIHNlYXJjaCBqb2JzLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBMaXN0IGFsbCBqb2IgSURzXG4gICAgICAgICAqICAgICAgdmFyIGpvYnMgPSBzdmMuam9icygpO1xuICAgICAgICAgKiAgICAgIGpvYnMuZmV0Y2goZnVuY3Rpb24oZXJyLCBqb2JzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBsaXN0ID0gam9icy5saXN0KCk7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkpvYiBcIiArIChpKzEpICsgXCI6IFwiICsgbGlzdFtpXS5zaWQpO1xuICAgICAgICAgKiAgICAgICAgICB9XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYnN9IFRoZSBgSm9ic2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuSm9ic1xuICAgICAgICAgKi9cbiAgICAgICAgam9iczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuSm9icyh0aGlzLCBuYW1lc3BhY2UpOyAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYERhdGFNb2RlbHNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IGNyZWF0ZSwgbGlzdCxcbiAgICAgICAgICogYW5kIHJldHJpZXZlIGRhdGEgbW9kZWxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgZGF0YW1vZGVsL21vZGVsXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAgICAgKi9cbiAgICAgICAgZGF0YU1vZGVsczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRGF0YU1vZGVscyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgVXNlcnNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IGNyZWF0ZSwgXG4gICAgICAgICAqIGxpc3QsIGFuZCByZXRyaWV2ZSB1c2Vycy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgdXNlcm5hbWVzXG4gICAgICAgICAqICAgICAgdmFyIHVzZXJzID0gc3ZjLnVzZXJzKCk7XG4gICAgICAgICAqICAgICAgdXNlcnMuZmV0Y2goZnVuY3Rpb24oZXJyLCB1c2Vycykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgbGlzdCA9IHVzZXJzLmxpc3QoKTtcbiAgICAgICAgICogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBcIiArIChpKzEpICsgXCI6IFwiICsgbGlzdFtpXS5wcm9wZXJ0aWVzKCkubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Vc2Vyc30gVGhlIGBVc2Vyc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGF1dGhvcml6YXRpb24vdXNlcnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlVzZXJzKHRoaXMpOyAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFZpZXdzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsXG4gICAgICAgICAqIGxpc3QsIGFuZCByZXRyaWV2ZSB2aWV3cyAoY3VzdG9tIFVJcyBidWlsdCBpbiBTcGx1bmsncyBhcHAgZnJhbWV3b3JrKS4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgdmlld3NcbiAgICAgICAgICogICAgICB2YXIgdmlld3MgPSBzdmMudmlld3MoKTtcbiAgICAgICAgICogICAgICB2aWV3cy5mZXRjaChmdW5jdGlvbihlcnIsIHZpZXdzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBsaXN0ID0gdmlld3MubGlzdCgpO1xuICAgICAgICAgKiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJWaWV3IFwiICsgKGkrMSkgKyBcIjogXCIgKyBsaXN0W2ldLnByb3BlcnRpZXMoKS5uYW1lKTtcbiAgICAgICAgICogICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5WaWV3c30gVGhlIGBWaWV3c2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGRhdGEvdWkvdmlld3NcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi9cbiAgICAgICAgdmlld3M6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlZpZXdzKHRoaXMsIG5hbWVzcGFjZSk7ICBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2VhcmNoIGpvYiB3aXRoIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYGV4ZWNfbW9kZWAgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBzZWFyY2g6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9bm9ybWFsYCB0byByZXR1cm4gYSBzZWFyY2ggam9iIElEIGltbWVkaWF0ZWx5IChkZWZhdWx0KS5cbiAgICAgICAgICogICAgICBQb2xsIGZvciBjb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4geW91IGNhbiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0cy4gXG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9YmxvY2tpbmdgIHRvIHJldHVybiB0aGUgc2VhcmNoIGpvYiBJRCB3aGVuIHRoZSBzZWFyY2ggaGFzIGZpbmlzaGVkLlxuICAgICAgICAgKiBcbiAgICAgICAgICogVG8gcnVuIGEgb25lc2hvdCBzZWFyY2gsIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBidXQgcmF0aGVyIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHRzLCB1c2UgYFNlcnZpY2Uub25lc2hvdFNlYXJjaGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5zZWFyY2goXCJzZWFyY2ggRVJST1JcIiwge2lkOiBcIm15am9iXzEyM1wifSwgZnVuY3Rpb24oZXJyLCBuZXdKb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCI6IG5ld0pvYi5zaWQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCIgaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGNyZWF0ZWQgam9iOiBgKGVyciwgY3JlYXRlZEpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIG5hbWVzcGFjZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGpvYnMgPSBuZXcgcm9vdC5Kb2JzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gam9icy5zZWFyY2gocXVlcnksIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYSBgSm9iYCBieSBpdHMgc2lkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2lkIFRoZSBzZWFyY2ggSUQgZm9yIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBnZXRKb2I6IGZ1bmN0aW9uKHNpZCwgbmFtZXNwYWNlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5hbWVzcGFjZTtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGpvYiA9IG5ldyByb290LkpvYih0aGlzLCBzaWQsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gam9iLmZldGNoKHt9LCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG9uZXNob3Qgc2VhcmNoIGZyb20gYSBnaXZlbiBzZWFyY2ggcXVlcnkgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5vbmVzaG90U2VhcmNoKFwic2VhcmNoIEVSUk9SXCIsIHtpZDogXCJteWpvYl8xMjNcIn0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJFU1VMVCBGSUVMRFNcIjogcmVzdWx0cy5maWVsZHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaDpcbiAgICAgICAgICogICAgLSBgb3V0cHV0X21vZGVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgcmVzdWx0cyAoWE1MLCBKU09OLCBvciBDU1YpLlxuICAgICAgICAgKiAgICAtIGBlYXJsaWVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGVhcmxpZXN0IHRpbWUgaW4gdGhlIHRpbWUgcmFuZ2UgdG8gc2VhcmNoLiBUaGUgdGltZSBzdHJpbmcgY2FuIGJlIGEgVVRDIHRpbWUgKHdpdGggZnJhY3Rpb25hbCBzZWNvbmRzKSwgYSByZWxhdGl2ZSB0aW1lIHNwZWNpZmllciAodG8gbm93KSwgb3IgYSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXG4gICAgICAgICAqICAgIC0gYGxhdGVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGxhdGVzdCB0aW1lIGluIHRoZSB0aW1lIHJhbmdlIHRvIHNlYXJjaC4gVGhlIHRpbWUgc3RyaW5nIGNhbiBiZSBhIFVUQyB0aW1lICh3aXRoIGZyYWN0aW9uYWwgc2Vjb25kcyksIGEgcmVsYXRpdmUgdGltZSBzcGVjaWZpZXIgKHRvIG5vdyksIG9yIGEgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgICAgICAgKiAgICAtIGByZmAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpZWxkcyB0byBhZGQgdG8gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2g6IGAoZXJyLCByZXN1bHRzKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9ic1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIG9uZXNob3RTZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIG5hbWVzcGFjZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGpvYnMgPSBuZXcgcm9vdC5Kb2JzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gam9icy5vbmVzaG90U2VhcmNoKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGxvZ2dlZCBpbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmN1cnJlbnRVc2VyKGZ1bmN0aW9uKGVyciwgdXNlcikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlYWwgbmFtZTogXCIsIHVzZXIucHJvcGVydGllcygpLnJlYWxuYW1lKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHVzZXIgaW5zdGFuY2U6IGAoZXJyLCB1c2VyKWAuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuY3VycmVudFVzZXJ9IFRoZSBgVXNlcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhdXRob3JpemF0aW9uL2N1cnJlbnQtY29udGV4dFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIGN1cnJlbnRVc2VyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5nZXQoUGF0aHMuY3VycmVudFVzZXIsIHt9LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZSA9IHJlc3BvbnNlLmRhdGEuZW50cnlbMF0uY29udGVudC51c2VybmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXIgPSBuZXcgcm9vdC5Vc2VyKHRoYXQsIHVzZXJuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5mZXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLnNlcnZlckluZm8oZnVuY3Rpb24oZXJyLCBpbmZvKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3BsdW5rIFZlcnNpb246IFwiLCBpbmZvLnByb3BlcnRpZXMoKS52ZXJzaW9uKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlcnZlciBpbmZvOiBgKGVyciwgaW5mbylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VydmVyL2luZm9cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBzZXJ2ZXJJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgc2VydmVySW5mbyA9IG5ldyByb290LlNlcnZlckluZm8odGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gc2VydmVySW5mby5mZXRjaChjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIGEgc2VhcmNoIHF1ZXJ5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UucGFyc2UoXCJzZWFyY2ggaW5kZXg9X2ludGVybmFsIHwgaGVhZCAxXCIsIGZ1bmN0aW9uKGVyciwgcGFyc2UpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDb21tYW5kczogXCIsIHBhcnNlLmNvbW1hbmRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkgdG8gcGFyc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQW4gb2JqZWN0IG9mIG9wdGlvbnMgZm9yIHRoZSBwYXJzZXI6XG4gICAgICAgICAqICAgIC0gYGVuYWJsZV9sb29rdXBzYCAoX2Jvb2xlYW5fKTogSWYgYHRydWVgLCBwZXJmb3JtcyByZXZlcnNlIGxvb2t1cHMgdG8gZXhwYW5kIHRoZSBzZWFyY2ggZXhwcmVzc2lvbi5cbiAgICAgICAgICogICAgLSBgb3V0cHV0X21vZGVgIChfc3RyaW5nXyk6IFRoZSBvdXRwdXQgZm9ybWF0IChYTUwgb3IgSlNPTikuXG4gICAgICAgICAqICAgIC0gYHBhcnNlX29ubHlgIChfYm9vbGVhbl8pOiBJZiBgdHJ1ZWAsIGRpc2FibGVzIHRoZSBleHBhbnNpb24gb2Ygc2VhcmNoIGR1ZSB0byBldmFsdWF0aW9uIG9mIHN1YnNlYXJjaGVzLCB0aW1lIHRlcm0gZXhwYW5zaW9uLCBsb29rdXBzLCB0YWdzLCBldmVudHR5cGVzLCBhbmQgc291cmNldHlwZSBhbGlhcy5cbiAgICAgICAgICogICAgLSBgcmVsb2FkX21hY3Jvc2AgKF9ib29sZWFuXyk6IElmIGB0cnVlYCwgcmVsb2FkcyBtYWNybyBkZWZpbml0aW9ucyBmcm9tIG1hY3Jvcy5jb25mLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgcGFyc2UgaW5mbzogYChlcnIsIHBhcnNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvcGFyc2VyXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhcmFtcy5xID0gcXVlcnk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChQYXRocy5wYXJzZXIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb3ZpZGVzIGF1dG8tY29tcGxldGUgc3VnZ2VzdGlvbnMgZm9yIHNlYXJjaCBxdWVyaWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UudHlwZWFoZWFkKFwiaW5kZXg9XCIsIDEwLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJBdXRvY29tcGxldGlvbiBvcHRpb25zOiBcIiwgb3B0aW9ucyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggVGhlIHF1ZXJ5IGZyYWdtZW50IHRvIGF1dG9jb21wbGV0ZS5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Ygb3B0aW9ucyB0byByZXR1cm4gKG9wdGlvbmFsKS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGF1dG9jb21wbGV0aW9uIGluZm86IGAoZXJyLCBvcHRpb25zKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvdHlwZWFoZWFkXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZWFoZWFkOiBmdW5jdGlvbihwcmVmaXgsIGNvdW50LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKGNvdW50KSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY291bnQ7XG4gICAgICAgICAgICAgICAgY291bnQgPSAxMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDogY291bnQgfHwgMTAsXG4gICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChQYXRocy50eXBlYWhlYWQsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0gKHJlc3BvbnNlLmRhdGEgfHwge30pLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMgfHwgW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvZ3MgYW4gZXZlbnQgdG8gU3BsdW5rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UubG9nKFwiQSBuZXcgZXZlbnRcIiwge2luZGV4OiBcIl9pbnRlcm5hbFwiLCBzb3VyY2V0eXBlOiBcIm15c291cmNldHlwZVwifSwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTdWJtaXR0ZWQgZXZlbnQ6IFwiLCByZXN1bHQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGV2ZW50IFRoZSB0ZXh0IGZvciB0aGlzIGV2ZW50LCBvciBhIEpTT04gb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwYXJhbWV0ZXJzIGZvciBpbmRleGluZzogXG4gICAgICAgICAqICAgIC0gYGluZGV4YCAoX3N0cmluZ18pOiBUaGUgaW5kZXggdG8gc2VuZCBldmVudHMgZnJvbSB0aGlzIGlucHV0IHRvLlxuICAgICAgICAgKiAgICAtIGBob3N0YCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIEhvc3QgZmllbGQgZm9yIGV2ZW50cyBmcm9tIHRoaXMgZGF0YSBpbnB1dC4gXG4gICAgICAgICAqICAgIC0gYGhvc3RfcmVnZXhgIChfc3RyaW5nXyk6IEEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZXh0cmFjdCB0aGUgaG9zdCB2YWx1ZSBmcm9tIGVhY2ggZXZlbnQuIFxuICAgICAgICAgKiAgICAtIGBzb3VyY2VgIChfc3RyaW5nXyk6IFRoZSB2YWx1ZSB0byBwb3B1bGF0ZSBpbiB0aGUgU291cmNlIGZpZWxkIGZvciBldmVudHMgZnJvbSB0aGlzIGRhdGEgaW5wdXQuXG4gICAgICAgICAqICAgIC0gYHNvdXJjZXR5cGVgIChfc3RyaW5nXyk6IFRoZSB2YWx1ZSB0byBwb3B1bGF0ZSBpbiB0aGUgU291cmNldHlwZSBmaWVsZCBmb3IgZXZlbnRzIGZyb20gdGhpcyBkYXRhIGlucHV0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgc3VibWl0dGVkOiBgKGVyciwgcmVzdWx0KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCByZWNlaXZlcnMvc2ltcGxlXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgbG9nOiBmdW5jdGlvbihldmVudCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgYSBKU09OIG9iamVjdCwgY29udmVydCBpdCB0byBhIHN0cmluZy5cbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudCA9IEpTT04uc3RyaW5naWZ5KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLnBhdGhzLnN1Ym1pdEV2ZW50O1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7XCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L3BsYWluXCJ9O1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBldmVudDtcbiAgICAgICAgICAgIHZhciBnZXQgPSBwYXJhbXM7XG4gICAgICAgICAgICB2YXIgcG9zdCA9IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5yZXF1ZXN0KFxuICAgICAgICAgICAgICAgIHBhdGgsIFxuICAgICAgICAgICAgICAgIG1ldGhvZCwgXG4gICAgICAgICAgICAgICAgZ2V0LCBcbiAgICAgICAgICAgICAgICBwb3N0LCBcbiAgICAgICAgICAgICAgICBib2R5LCBcbiAgICAgICAgICAgICAgICBoZWFkZXJzLCBcbiAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGJhc2UgZGVmaW5pdGlvbiBmb3IgYSBTcGx1bmsgZW5kcG9pbnQsIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2ZcbiAgICAgKiBhIHNwZWNpZmljIHNlcnZpY2UgYW5kIHBhdGguIFByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIEdFVCwgUE9TVCwgYW5kXG4gICAgICogREVMRVRFIG9wZXJhdGlvbnMgdXNlZCBpbiBzcGx1bmtqcywgYXV0b21hdGljYWxseSBwcmVwYXJpbmcgdGhlIHBhdGggY29ycmVjdGx5XG4gICAgICogYW5kIGFsbG93aW5nIGZvciByZWxhdGl2ZSBjYWxscy5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICovXG4gICAgcm9vdC5FbmRwb2ludCA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVhbGlmaWVkUGF0aCBBIGZ1bGx5LXF1YWxpZmllZCByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCIvc2VydmljZXMvc2VhcmNoL2pvYnNcIikuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnR9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBxdWFsaWZpZWRQYXRoKSB7XG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzZWQgaW4gYSBudWxsIFNlcnZpY2UuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXF1YWxpZmllZFBhdGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzZWQgaW4gYW4gZW1wdHkgcGF0aC5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgICAgICB0aGlzLnF1YWxpZmllZFBhdGggPSBxdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuZ2V0ICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmdldCk7XG4gICAgICAgICAgICAvLyB0aGlzLmdldF92MiA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5nZXRfdjIpO1xuICAgICAgICAgICAgdGhpcy5wb3N0ICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucG9zdCk7XG4gICAgICAgICAgICB0aGlzLmRlbCAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kZWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIHJlbGF0aXZlIEdFVCByZXF1ZXN0IG9uIGFuIGVuZHBvaW50J3MgcGF0aCxcbiAgICAgICAgICogY29tYmluZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhbmQgYSByZWxhdGl2ZSBwYXRoIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBXaWxsIG1ha2UgYSByZXF1ZXN0IHRvIHtzZXJ2aWNlLnByZWZpeH0vc2VhcmNoL2pvYnMvMTIzNDU2L3Jlc3VsdHM/b2Zmc2V0PTFcbiAgICAgICAgICogICAgICB2YXIgZW5kcG9pbnQgPSBuZXcgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludChzZXJ2aWNlLCBcInNlYXJjaC9qb2JzLzEyMzQ1XCIpO1xuICAgICAgICAgKiAgICAgIGVuZHBvaW50LmdldChcInJlc3VsdHNcIiwge29mZnNldDogMX0sIGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhcIkRPTkVcIikpfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWxwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGVuZHBvaW50IHBhdGguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZTogYChlcnIsIHJlc3BvbnNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0X3YyOiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnF1YWxpZmllZFBhdGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCB3ZSB3aWxsIGFwcGVuZCBpdCB3aXRoIGEgcHJlY2VkaW5nXG4gICAgICAgICAgICAvLyBzbGFzaC5cbiAgICAgICAgICAgIGlmIChyZWxwYXRoKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgXCIvXCIgKyByZWxwYXRoOyAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5nZXRfdjIoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcmZvcm1zIGEgcmVsYXRpdmUgUE9TVCByZXF1ZXN0IG9uIGFuIGVuZHBvaW50J3MgcGF0aCxcbiAgICAgICAgICogY29tYmluZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhbmQgYSByZWxhdGl2ZSBwYXRoIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBXaWxsIG1ha2UgYSByZXF1ZXN0IHRvIHtzZXJ2aWNlLnByZWZpeH0vc2VhcmNoL2pvYnMvMTIzNDU2L2NvbnRyb2xcbiAgICAgICAgICogICAgICB2YXIgZW5kcG9pbnQgPSBuZXcgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludChzZXJ2aWNlLCBcInNlYXJjaC9qb2JzLzEyMzQ1XCIpO1xuICAgICAgICAgKiAgICAgIGVuZHBvaW50LnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiY2FuY2VsXCJ9LCBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coXCJDQU5DRUxMRURcIikpfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWxwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGVuZHBvaW50IHBhdGguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgYm9keS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGU6IGAoZXJyLCByZXNwb25zZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRcbiAgICAgICAgICovXG4gICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHJlbHBhdGgsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnF1YWxpZmllZFBhdGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCB3ZSB3aWxsIGFwcGVuZCBpdCB3aXRoIGEgcHJlY2VkaW5nXG4gICAgICAgICAgICAvLyBzbGFzaC5cbiAgICAgICAgICAgIGlmIChyZWxwYXRoKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgXCIvXCIgKyByZWxwYXRoOyAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5wb3N0KFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcmZvcm1zIGEgcmVsYXRpdmUgREVMRVRFIHJlcXVlc3Qgb24gYW4gZW5kcG9pbnQncyBwYXRoLFxuICAgICAgICAgKiBjb21iaW5lZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGFuZCBhIHJlbGF0aXZlIHBhdGggaWYgc3BlY2lmaWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIFdpbGwgbWFrZSBhIHJlcXVlc3QgdG8ge3NlcnZpY2UucHJlZml4fS9zZWFyY2gvam9icy8xMjM0NTZcbiAgICAgICAgICogICAgICB2YXIgZW5kcG9pbnQgPSBuZXcgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludChzZXJ2aWNlLCBcInNlYXJjaC9qb2JzLzEyMzQ1XCIpO1xuICAgICAgICAgKiAgICAgIGVuZHBvaW50LmRlbGV0ZShcIlwiLCB7fSwgZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKFwiREVMRVRFRFwiKSl9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHJlbHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIGFwcGVuZCB0byB0aGUgZW5kcG9pbnQgcGF0aC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgZW50aXR5LXNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlOiBgKGVyciwgcmVzcG9uc2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBkZWw6IGZ1bmN0aW9uKHJlbHBhdGgsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnF1YWxpZmllZFBhdGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCB3ZSB3aWxsIGFwcGVuZCBpdCB3aXRoIGEgcHJlY2VkaW5nXG4gICAgICAgICAgICAvLyBzbGFzaC5cbiAgICAgICAgICAgIGlmIChyZWxwYXRoKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgXCIvXCIgKyByZWxwYXRoOyAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kZWwoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgYmFzZSBkZWZpbml0aW9uIGZvciBhIFNwbHVuayByZXNvdXJjZSAoZm9yIGV4YW1wbGUsIGFuIGVudGl0eSBcbiAgICAgKiBzdWNoIGFzIGFuIGluZGV4IG9yIHNlYXJjaCBqb2IsIG9yIGEgY29sbGVjdGlvbiBvZiBlbnRpdGllcykuIFByb3ZpZGVzIFxuICAgICAqIGJhc2ljIG1ldGhvZHMgZm9yIGhhbmRsaW5nIFNwbHVuayByZXNvdXJjZXMsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgXG4gICAgICogYWNjZXNzaW5nIHByb3BlcnRpZXMuIFxuICAgICAqXG4gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYmVjYXVzZSBtb3N0IG1ldGhvZHMgYXJlIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4uXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRcbiAgICAgKi9cbiAgICByb290LlJlc291cmNlID0gcm9vdC5FbmRwb2ludC5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggQSByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCJzZWFyY2gvam9ic1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2V9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBwYXRoLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHZhciBmdWxscGF0aCA9IHNlcnZpY2UuZnVsbHBhdGgocGF0aCwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgZnVsbHBhdGgpO1xuICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuX2xvYWQgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuX2xvYWQpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaCAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5mZXRjaCk7XG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnBhdGggICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnBhdGgpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNVVNUIEJFIE9WRVJSSURERU5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIHJlc291cmNlIGFuZCBzdG9yZXMgdGhlIHByb3BlcnRpZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlc291cmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgX2xvYWQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlZnJlc2hlcyB0aGUgcmVzb3VyY2UgYnkgZmV0Y2hpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICogYW5kIGxvYWRpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmV0cmlldmVkOiBgKGVyciwgcmVzb3VyY2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTVVTVCBCRSBPVkVSUklEREVOXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlc291cmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgICAgICovXG4gICAgICAgIHByb3BlcnRpZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGZ1bGwgc3RhdGUgKHByb3BlcnRpZXMgYW5kIG1ldGFkYXRhKSBvZiB0aGlzIHJlc291cmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjdXJyZW50IGZ1bGwgc3RhdGUgb2YgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgYmFzZSBjbGFzcyBmb3IgYSBTcGx1bmsgZW50aXR5LCB3aGljaCBpcyBhIHdlbGwtZGVmaW5lZCBjb25zdHJ1Y3RcbiAgICAgKiB3aXRoIGNlcnRhaW4gb3BlcmF0aW9ucyAoc3VjaCBhcyBcInByb3BlcnRpZXNcIiwgXCJ1cGRhdGVcIiwgYW5kIFwiZGVsZXRlXCIpLiBcbiAgICAgKiBFbnRpdGllcyBpbmNsdWRlIHNlYXJjaCBqb2JzLCBpbmRleGVzLCBpbnB1dHMsIGFwcHMsIGFuZCBtb3JlLiBcbiAgICAgKlxuICAgICAqIFByb3ZpZGVzIGJhc2ljIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBTcGx1bmsgZW50aXRpZXMsIHN1Y2ggYXMgZmV0Y2hpbmcgYW5kXG4gICAgICogdXBkYXRpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgKi9cbiAgICByb290LkVudGl0eSA9IHJvb3QuUmVzb3VyY2UuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc3RhdGljIHByb3BlcnR5IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIFxuICAgICAgICAgKiB1cGRhdGUgdG8gZ2V0IHRoZSB1cGRhdGVkIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgXG4gICAgICAgICAqIGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJucyAoZWNob2VzKSB0aGUgdXBkYXRlZCBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25VcGRhdGU6IGZhbHNlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBBIHJlbGF0aXZlIGVuZHBvaW50IHBhdGggKGZvciBleGFtcGxlLCBcInNlYXJjaC9qb2JzXCIpLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5FbnRpdHl9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgcGF0aCwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLl9sb2FkICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5fbG9hZCk7XG4gICAgICAgICAgICB0aGlzLmZldGNoICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5mZXRjaCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZW1vdmUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGRzICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZpZWxkcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmtzICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5saW5rcyk7XG4gICAgICAgICAgICB0aGlzLmFjbCAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5hY2wpO1xuICAgICAgICAgICAgdGhpcy5hdXRob3IgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuYXV0aG9yKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZCAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoZWQgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucHVibGlzaGVkKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmVuYWJsZSk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGUgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kaXNhYmxlKTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnJlbG9hZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9maWVsZHMgICAgID0ge307XG4gICAgICAgICAgICB0aGlzLl9hY2wgICAgICAgID0ge307XG4gICAgICAgICAgICB0aGlzLl9saW5rcyAgICAgID0ge307XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGVudGl0eSBhbmQgc3RvcmVzIHRoZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgX2xvYWQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB1dGlscy5pc0FycmF5KHByb3BlcnRpZXMpID8gcHJvcGVydGllc1swXSA6IHByb3BlcnRpZXM7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHByb3BlcnRpZXMgdG9cbiAgICAgICAgICAgIC8vIGVtcHR5IHZhbHVlc1xuICAgICAgICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHt9LFxuICAgICAgICAgICAgICAgIGZpZWxkczoge30sXG4gICAgICAgICAgICAgICAgYWNsOiB7fSxcbiAgICAgICAgICAgICAgICBsaW5rczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBUYWtlIG91dCB0aGUgZW50aXR5LXNwZWNpZmljIGNvbnRlbnRcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmNvbnRlbnQgICB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyAgICAgPSBwcm9wZXJ0aWVzLmZpZWxkcyAgICB8fCB0aGlzLl9maWVsZHMgfHwge307XG4gICAgICAgICAgICB0aGlzLl9hY2wgICAgICAgID0gcHJvcGVydGllcy5hY2wgICAgICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl9saW5rcyAgICAgID0gcHJvcGVydGllcy5saW5rcyAgICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl9hdXRob3IgICAgID0gcHJvcGVydGllcy5hdXRob3IgICAgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWQgICAgPSBwcm9wZXJ0aWVzLnVwZGF0ZWQgICB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcHVibGlzaGVkICA9IHByb3BlcnRpZXMucHVibGlzaGVkIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBmaWVsZHMgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LCBpbmRpY2F0aW5nIHdoaWNoIFxuICAgICAgICAgKiBmaWVsZHMgYXJlIHdpbGRjYXJkcywgcmVxdWlyZWQsIGFuZCBvcHRpb25hbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgZmllbGRzIGluZm9ybWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBmaWVsZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgKEFDTCkgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LFxuICAgICAgICAgKiB3aGljaCBjb250YWlucyB0aGUgcGVybWlzc2lvbnMgZm9yIGFjY2Vzc2luZyB0aGUgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBBQ0wuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGFjbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWNsO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgbGlua3MgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LCB3aGljaCBpcyB0aGUgVVJJIG9mXG4gICAgICAgICAqIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhlIG1hbmFnZW1lbnQgcG9ydCBvZiBhIFNwbHVuayBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbGlua3MgaW5mb3JtYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGxpbmtzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5rcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGF1dGhvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGF1dGhvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRob3I7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSB1cGRhdGVkIHRpbWUgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1cGRhdGVkIHRpbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwdWJsaXNoZWQgdGltZSBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHB1Ymxpc2hlZCB0aW1lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBwdWJsaXNoZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3B1Ymxpc2hlZDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWZyZXNoZXMgdGhlIGVudGl0eSBieSBmZXRjaGluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHNlcnZlciBhbmQgXG4gICAgICAgICAqIGxvYWRpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgY291bnRgIChfaW50ZWdlcl8pOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLlxuICAgICAgICAgKiAgICAtIGBvZmZzZXRgIChfaW50ZWdlcl8pOiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtIHRvIHJldHVybi5cbiAgICAgICAgICogICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHRvIGZpbHRlciByZXNwb25zZXMuXG4gICAgICAgICAqICAgIC0gYHNvcnRfZGlyYCAoX3N0cmluZ18pOiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgcmV0dXJuZWQgaXRlbXM6IOKAnGFzY+KAnSBvciDigJxkZXNj4oCdLlxuICAgICAgICAgKiAgICAtIGBzb3J0X2tleWAgKF9zdHJpbmdfKTogVGhlIGZpZWxkIHRvIHVzZSBmb3Igc29ydGluZyAob3B0aW9uYWwpLlxuICAgICAgICAgKiAgICAtIGBzb3J0X21vZGVgIChfc3RyaW5nXyk6IFRoZSBjb2xsYXRpbmcgc2VxdWVuY2UgZm9yIHNvcnRpbmcgcmV0dXJuZWQgaXRlbXM6IOKAnGF1dG/igJ0sIOKAnGFscGhh4oCdLCDigJxhbHBoYV9jYXNl4oCdLCBvciDigJxudW3igJ0uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmV0cmlldmVkOiBgKGVyciwgcmVzb3VyY2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwiXCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fbG9hZChyZXNwb25zZS5kYXRhID8gcmVzcG9uc2UuZGF0YS5lbnRyeSA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBlbnRpdHkgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQ6IGAoZXJyKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWwoXCJcIiwge30sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB0aGUgb2JqZWN0IHdpdGguXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgdXBkYXRlZDogYChlcnIsIGVudGl0eSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvcHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0ICduYW1lJyBmaWVsZCBpbiAndXBkYXRlJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcIlwiLCBwcm9wcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmICghZXJyICYmICF0aGF0LmZldGNoT25VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fbG9hZChyZXNwb25zZS5kYXRhLmVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWVyciAmJiB0aGF0LmZldGNoT25VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5mZXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGhlIGVudGl0eSBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIGRpc2FibGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5wb3N0KFwiZGlzYWJsZVwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgdGhlIGVudGl0eSBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIGVuYWJsZWQ6IGAoZXJyLCBlbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMucG9zdChcImVuYWJsZVwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbG9hZHMgdGhlIGVudGl0eSBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJlbG9hZGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnBvc3QoXCJfcmVsb2FkXCIsIHt9LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBiYXNlIGNsYXNzIGZvciBhIFNwbHVuayBjb2xsZWN0aW9uLCB3aGljaCBpcyBhIHdlbGwtZGVmaW5lZCBjb25zdHJ1Y3RcbiAgICAgKiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBjb2xsZWN0aW9ucyBvZiBlbnRpdGllcywgc3VjaCBhcyBcbiAgICAgKiBjcmVhdGluZyBhbmQgbGlzdGluZyBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICovXG4gICAgcm9vdC5Db2xsZWN0aW9uID0gcm9vdC5SZXNvdXJjZS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBzdGF0aWMgcHJvcGVydHkgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gXG4gICAgICAgICAqIGVudGl0eSBoYXMgYmVlbiBjcmVhdGVkLiBCeSBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIFxuICAgICAgICAgKiBiZWNhdXNlIHRoZSBlbmRwb2ludCByZXR1cm5zIChlY2hvZXMpIHRoZSBuZXcgZW50aXR5LlxuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaE9uRW50aXR5Q3JlYXRpb246IGZhbHNlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggQSByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCJzZWFyY2gvam9ic1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgcGF0aCwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLl9sb2FkICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLl9sb2FkKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2ggICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmV0Y2gpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGUgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5jcmVhdGUpO1xuICAgICAgICAgICAgdGhpcy5saXN0ICAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5saXN0KTtcbiAgICAgICAgICAgIHRoaXMuaXRlbSAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuaXRlbSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbnRpYXRlRW50aXR5ID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmluc3RhbnRpYXRlRW50aXR5KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzICAgICAgID0gW107XG4gICAgICAgICAgICB0aGlzLl9lbnRpdGllc0J5TmFtZSA9IHt9OyAgICBcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgICAgID0ge307XG4gICAgICAgICAgICB0aGlzLl9wYWdpbmcgICAgICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICAgICAgPSB7fTsgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGVudGl0eS4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRW50aXR5fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNVVNUIEJFIE9WRVJSSURERU5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGNvbGxlY3Rpb24gYW5kIHByb3BlcnRpZXMsIGFuZCBjcmVhdGVzIGEgbWFwIG9mIGVudGl0eVxuICAgICAgICAgKiBuYW1lcyB0byBlbnRpdHkgSURzIChmb3IgcmV0cmlldmFsIHB1cnBvc2VzKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9sb2FkOiBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGVudGl0aWVzID0gW107XG4gICAgICAgICAgICB2YXIgZW50aXRpZXNCeU5hbWUgPSB7fTtcbiAgICAgICAgICAgIHZhciBlbnRpdHlQcm9wZXJ0eUxpc3QgPSBwcm9wZXJ0aWVzLmVudHJ5IHx8IFtdO1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGVudGl0eVByb3BlcnR5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IGVudGl0eVByb3BlcnR5TGlzdFtpXTtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhpcy5pbnN0YW50aWF0ZUVudGl0eShwcm9wcyk7XG4gICAgICAgICAgICAgICAgZW50aXR5Ll9sb2FkKHByb3BzKTtcbiAgICAgICAgICAgICAgICBlbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGVudGl0aWVzQnlOYW1lLmhhc093blByb3BlcnR5KGVudGl0eS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdGllc0J5TmFtZVtlbnRpdHkubmFtZV0ucHVzaChlbnRpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNCeU5hbWVbZW50aXR5Lm5hbWVdID0gW2VudGl0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZW50aXRpZXMgICAgICAgPSBlbnRpdGllcztcbiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzQnlOYW1lID0gZW50aXRpZXNCeU5hbWU7XG4gICAgICAgICAgICB0aGlzLl9wYWdpbmcgICAgICAgICA9IHByb3BlcnRpZXMucGFnaW5nICAgIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICAgICAgPSBwcm9wZXJ0aWVzLmxpbmtzICAgICB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWQgICAgICAgID0gcHJvcGVydGllcy51cGRhdGVkICAgfHwgbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpbmtzIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbGxlY3Rpb24sIHdoaWNoIGlzIHRoZSBVUkkgb2ZcbiAgICAgICAgICogdGhlIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBtYW5hZ2VtZW50IHBvcnQgb2YgYSBTcGx1bmsgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGxpbmtzIGluZm9ybWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbGlua3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmtzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgYXV0aG9yIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGF1dGhvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHBhZ2luZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5nO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgdXBkYXRlZCB0aW1lIGZvciB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHVwZGF0ZWQgdGltZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVmcmVzaGVzIHRoZSByZXNvdXJjZSBieSBmZXRjaGluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHNlcnZlciBhbmQgXG4gICAgICAgICAqIGxvYWRpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEEgZGljdGlvbmFyeSBvZiBjb2xsZWN0aW9uIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbiBvcHRpb25zOlxuICAgICAgICAgKiAgICAtIGBjb3VudGAgKF9pbnRlZ2VyXyk6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4uXG4gICAgICAgICAqICAgIC0gYG9mZnNldGAgKF9pbnRlZ2VyXyk6IFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGl0ZW0gdG8gcmV0dXJuLlxuICAgICAgICAgKiAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggcXVlcnkgdG8gZmlsdGVyIHJlc3BvbnNlcy5cbiAgICAgICAgICogICAgLSBgc29ydF9kaXJgIChfc3RyaW5nXyk6IFRoZSBkaXJlY3Rpb24gdG8gc29ydCByZXR1cm5lZCBpdGVtczog4oCcYXNj4oCdIG9yIOKAnGRlc2PigJ0uXG4gICAgICAgICAqICAgIC0gYHNvcnRfa2V5YCAoX3N0cmluZ18pOiBUaGUgZmllbGQgdG8gdXNlIGZvciBzb3J0aW5nIChvcHRpb25hbCkuXG4gICAgICAgICAqICAgIC0gYHNvcnRfbW9kZWAgKF9zdHJpbmdfKTogVGhlIGNvbGxhdGluZyBzZXF1ZW5jZSBmb3Igc29ydGluZyByZXR1cm5lZCBpdGVtczog4oCcYXV0b+KAnSwg4oCcYWxwaGHigJ0sIOKAnGFscGhhX2Nhc2XigJ0sIG9yIOKAnG51beKAnS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyByZXRyaWV2ZWQ6IGAoZXJyLCByZXNvdXJjZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jb3VudCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhhdC5nZXQoXCJcIiwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZldGNoX3YyOiBhc3luYyBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jb3VudCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCB0aGF0LmdldF92MihcIlwiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIC8vIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuYm9keSk7XG4gICAgICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3BlY2lmaWMgZW50aXR5IGZyb20gdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcHMgPSBzZXJ2aWNlLmFwcHMoKTtcbiAgICAgICAgICogICAgICBhcHBzLmZldGNoKGZ1bmN0aW9uKGVyciwgYXBwcykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgYXBwID0gYXBwcy5pdGVtKFwic2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNlYXJjaCBBcHAgRm91bmQ6IFwiICsgISFhcHApO1xuICAgICAgICAgKiAgICAgICAgICAvLyBgYXBwYCBpcyBhbiBBcHBsaWNhdGlvbiBvYmplY3QuXG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRvIHJldHJpZXZlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIHdpbGRjYXJkIHZhbHVlIFwiLVwiLCBpcyBub3QgYWNjZXB0YWJsZSB3aGVuIHNlYXJjaGluZyBmb3IgYW4gZW50aXR5LlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIHdpbGRjYXJkIHZhbHVlIFwiLVwiIGlzIHVuYWNjZXB0YWJsZSB3aGVuIHNlYXJjaGluZyBmb3IgYW4gZW50aXR5LlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3BsdW5ranMuU2VydmljZS5FbnRpdHl9IFRoZSBlbnRpdHksIG9yIGBudWxsYCBpZiBvbmUgaXMgbm90IGZvdW5kLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbTogZnVuY3Rpb24oaWQsIG5hbWVzcGFjZSkgeyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0VtcHR5KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgfSAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3Qgc3VwbHkgYSBub24tZW1wdHkgbmFtZS5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgJiYgKG5hbWVzcGFjZS5hcHAgPT09ICctJyB8fCBuYW1lc3BhY2Uub3duZXIgPT09ICctJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXaGVuIHNlYXJjaGluZyBmb3IgYW4gZW50aXR5LCB3aWxkY2FyZHMgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBuYW1lc3BhY2UuIFBsZWFzZSByZWZpbmUgeW91ciBzZWFyY2guXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgZnVsbFBhdGggPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VudGl0aWVzQnlOYW1lLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzQnlOYW1lW2lkXTsgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDEgJiYgIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBlbnRpdHkgd2l0aCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIG5hbWUgYW5kIHRoZSB1c2VyIGRpZCBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmeSBhIG5hbWVzcGFjZSwgdGhlbiB3ZSBqdXN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50aXRpZXNbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudGl0aWVzLmxlbmd0aCA9PT0gMSAmJiBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3BlY2lmaWVkIGEgbmFtZXNwYWNlLCB0aGVuIHdlIFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHJldHVybiB0aGUgZW50aXR5IGlmIGl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZ1bGwgcGF0aFxuICAgICAgICAgICAgICAgICAgICBmdWxsUGF0aCA9IHRoaXMuc2VydmljZS5mdWxscGF0aChlbnRpdGllc1swXS5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllc1swXS5xdWFsaWZpZWRQYXRoID09PSBmdWxsUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0aWVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50aXRpZXMubGVuZ3RoID4gMSAmJiAhbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZW50aXR5IGFuZCB3ZSBkaWRuJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmeSBhIG5hbWVzcGFjZSwgdGhlbiB3ZSByZXR1cm4gYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gc2F5aW5nIHRoZSBtYXRjaCBpcyBhbWJpZ3VvdXNcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW1iaWd1b3VzIG1hdGNoIGZvciBuYW1lICdcIiArIGlkICsgXCInXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBlbnRpdHksIGFuZCB3ZSBkbyBoYXZlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbmFtZXNwYWNlLCBzbyB3ZSB0cnkgYW5kIGZpbmQgaXRcbiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gZW50aXRpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsUGF0aCA9IHRoaXMuc2VydmljZS5mdWxscGF0aChlbnRpdGllc1tpXS5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LnF1YWxpZmllZFBhdGggPT09IGZ1bGxQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBlbnRpdHkgb24gdGhlIHNlcnZlciBmb3IgdGhpcyBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHBzID0gc2VydmljZS5hcHBzKCk7XG4gICAgICAgICAqICAgICAgYXBwcy5jcmVhdGUoe25hbWU6IFwiTmV3U2VhcmNoQXBwXCJ9LCBmdW5jdGlvbihlcnIsIG5ld0FwcCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNSRUFURURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlOiBgKGVyciwgcmVzcG9uc2UpYC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0gcmVzcG9uc2UuZGF0YS5lbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWxzLmlzQXJyYXkocHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IHByb3BzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhhdC5pbnN0YW50aWF0ZUVudGl0eShwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eS5fbG9hZChwcm9wcyk7IFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuZmV0Y2hPbkVudGl0eUNyZWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBlbnRpdGllcyBpbiB0aGUgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgYXBwcyA9IHNlcnZpY2UuYXBwcygpO1xuICAgICAgICAgKiAgICAgIGFwcHMuZmV0Y2goZnVuY3Rpb24oZXJyLCBhcHBzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBhcHBMaXN0ID0gYXBwcy5saXN0KCk7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKGFwcExpc3QubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGxpc3Qgb2YgZW50aXRpZXM6IGAoZXJyLCBsaXN0KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBsaXN0OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdXRpbHMuY2xvbmUodGhpcy5fZW50aXRpZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIHNhdmVkIHNlYXJjaCwgd2hpY2ggeW91IGNhbiB0aGVuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LlNhdmVkU2VhcmNoID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuc2F2ZWRTZWFyY2hlcyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgc2F2ZWQgc2VhcmNoLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuYWNrbm93bGVkZ2UgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmFja25vd2xlZGdlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2ggICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeSAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgICAgICAgdGhpcy5zdXBwcmVzc0luZm8gPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3VwcHJlc3NJbmZvKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0cyBmb3IgdGhpcyBzYXZlZFNlYXJjaCxcbiAgICAgICAgICogZGVmYXVsdGluZyB0byAwIHdoZW4gdW5kZWZpbmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaCA9IHNlcnZpY2Uuc2F2ZWRTZWFyY2hlcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgIHZhciBhbGVydENvdW50ID0gc2F2ZWRTZWFyY2guYWxlcnRDb3VudCgpO1xuICAgICAgICAgKiBcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBhbGVydENvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyZWRfYWxlcnRfY291bnQsIDEwKSB8fCAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBY2tub3dsZWRnZXMgdGhlIHN1cHByZXNzaW9uIG9mIHRoZSBhbGVydHMgZnJvbSBhIHNhdmVkIHNlYXJjaCBhbmRcbiAgICAgICAgICogcmVzdW1lcyBhbGVydGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaC5hY2tub3dsZWRnZShmdW5jdGlvbihlcnIsIHNlYXJjaCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFDS05PV0xFREdFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNhdmVkIHNlYXJjaCBpcyBhY2tub3dsZWRnZWQ6IGAoZXJyLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L2Fja25vd2xlZGdlXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgYWNrbm93bGVkZ2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJhY2tub3dsZWRnZVwiLCB7fSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc3BhdGNoZXMgYSBzYXZlZCBzZWFyY2gsIHdoaWNoIGNyZWF0ZXMgYSBzZWFyY2ggam9iIGFuZCByZXR1cm5zIGEgXG4gICAgICAgICAqIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2UgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaCA9IHNlcnZpY2Uuc2F2ZWRTZWFyY2hlcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgIHNhdmVkU2VhcmNoLmRpc3BhdGNoKHtmb3JjZV9kaXNwYXRjaDogZmFsc2V9LCBmdW5jdGlvbihlcnIsIGpvYiwgc2F2ZWRTZWFyY2gpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKb2IgU0lEOiBcIiwgam9iLnNpZCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciBkaXNwYXRjaGluZyB0aGlzIHNhdmVkIHNlYXJjaDpcbiAgICAgICAgICogICAgLSBgZGlzcGF0Y2gubm93YCAoX3N0cmluZ18pOiBUaGUgdGltZSB0aGF0IGlzIHVzZWQgdG8gZGlzcGF0Y2ggdGhlIHNlYXJjaCBhcyB0aG91Z2ggdGhlIHNwZWNpZmllZCB0aW1lIHdlcmUgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgICAgICogICAgLSBgZGlzcGF0Y2guKmAgKF9zdHJpbmdfKTogT3ZlcndyaXRlcyB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBmaWVsZCBzcGVjaWZpZWQgaW4gKi5cbiAgICAgICAgICogICAgLSBgdHJpZ2dlcl9hY3Rpb25zYCAoX2Jvb2xlYW5fKTogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdHJpZ2dlciBhbGVydCBhY3Rpb25zLlxuICAgICAgICAgKiAgICAtIGBmb3JjZV9kaXNwYXRjaGAgKF9ib29sZWFuXyk6IEluZGljYXRlcyB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlYXJjaCBpZiBhbm90aGVyIGluc3RhbmNlIG9mIHRoaXMgc2VhcmNoIGlzIGFscmVhZHkgcnVubmluZy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNhdmVkIHNlYXJjaCBpcyBkaXNwYXRjaGVkOiBgKGVyciwgam9iLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L2Rpc3BhdGNoXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImRpc3BhdGNoXCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIHNpZCA9IHJlc3BvbnNlLmRhdGEuc2lkO1xuICAgICAgICAgICAgICAgIHZhciBqb2IgPSBuZXcgcm9vdC5Kb2IodGhhdC5zZXJ2aWNlLCBzaWQsIHRoYXQubmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBqb2IsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIFxuICAgICAgICAgKiBHZXRzIHRoZSBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBgIGZvciBmaXJlZEFsZXJ0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzYXZlZCBzZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFsZXJ0cyA9IHNlcnZpY2UuZmlyZWRBbGVydEdyb3VwcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cH0gQW4gQWxlcnRHcm91cCBvYmplY3Qgd2l0aCB0aGVcbiAgICAgICAgICogc2FtZSBuYW1lIGFzIHRoaXMgU2F2ZWRTZWFyY2ggb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIGZpcmVkQWxlcnRHcm91cDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRmlyZWRBbGVydEdyb3VwKHRoaXMuc2VydmljZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBqb2IgaGlzdG9yeSBmb3IgYSBzYXZlZCBzZWFyY2gsIHdoaWNoIGlzIGEgbGlzdCBvZiBcbiAgICAgICAgICogYHNwbHVua2pzLlNlcnZpY2UuSm9iYCBpbnN0YW5jZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIHNhdmVkU2VhcmNoID0gc2VydmljZS5zYXZlZFNlYXJjaGVzKCkuaXRlbShcIk15U2F2ZWRTZWFyY2hcIik7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2guaGlzdG9yeSh7Y291bnQ6IDEwfSwgZnVuY3Rpb24oZXJyLCBqb2JzLCBzZWFyY2gpIHtcbiAgICAgICAgICogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSm9iXCIsIGksIFwiOlwiLCBqb2JzW2ldLnNpZCk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBmb3IgcmV0cmlldmluZyBoaXN0b3J5LiBGb3IgYSBmdWxsIGxpc3QsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rLzguMC4yL1JFU1RSRUYvUkVTVHByb2xvZyNQYWdpbmF0aW9uX2FuZF9maWx0ZXJpbmdfcGFyYW1ldGVyc1wiIHRhcmdldD1cIl9ibGFua1wiPlBhZ2luYXRpb24gYW5kIEZpbHRlcmluZyBvcHRpb25zPC9hPiBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGhpc3RvcnkgaXMgcmV0cmlldmVkOiBgKGVyciwgam9iLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L2hpc3RvcnlcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBoaXN0b3J5OiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcImhpc3RvcnlcIiwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgam9icyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YS5lbnRyeSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgam9iRGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnlbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhqb2JEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpvYiA9IG5ldyByb290LkpvYih0aGF0LnNlcnZpY2UsIGpvYkRhdGEubmFtZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGpvYi5fbG9hZChqb2JEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgam9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGpvYnMsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiBhIHNhdmVkIHNlYXJjaC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaC5oaXN0b3J5KGZ1bmN0aW9uKGVyciwgc3VwcHJlc3Npb25TdGF0ZSwgc2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU1RBVEU6IFwiLCBzdXBwcmVzc2lvblN0YXRlKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHN1cHByZXNzaW9uIHN0YXRlIGlzIHJldHJpZXZlZDogYChlcnIsIHN1cHByZXNzaW9uU3RhdGUsIHNhdmVkU2VhcmNoKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlcy97bmFtZX0vc3VwcHJlc3NcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBzdXBwcmVzc0luZm86IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInN1cHByZXNzXCIsIHt9LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZS5kYXRhLmVudHJ5LmNvbnRlbnQsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgc2F2ZWQgc2VhcmNoIG9uIHRoZSBzZXJ2ZXIuIFxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhlIHNlYXJjaCBxdWVyeSBpcyByZXF1aXJlZCwgZXZlbiB3aGVuIGl0IGlzbid0IGJlaW5nIG1vZGlmaWVkLlxuICAgICAgICAgKiBJZiB5b3UgZG9uJ3QgcHJvdmlkZSBpdCwgdGhpcyBtZXRob2Qgd2lsbCBmZXRjaCB0aGUgc2VhcmNoIHN0cmluZyBmcm9tXG4gICAgICAgICAqIHRoZSBzZXJ2ZXIgb3IgZnJvbSB0aGUgbG9jYWwgY2FjaGUuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgdG8gdXBkYXRlIHRoZSBzYXZlZCBzZWFyY2ggd2l0aC4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NhdmVkc2VhcmNocGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2F2ZWQgc2VhcmNoIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQ6IGAoZXJyLCBlbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IHRoaXMuX3N1cGVyO1xuICAgICAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLmZldGNoKGZ1bmN0aW9uKGVyciwgc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gc2VhcmNoLnByb3BlcnRpZXMoKS5zZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUuY2FsbChzZWFyY2gsIHBhcmFtcywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHNhdmVkIHNlYXJjaGVzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBzYXZlZCBcbiAgICAgKiBzZWFyY2hlcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBzYXZlZCBzZWFyY2guXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICByb290LlNhdmVkU2VhcmNoZXMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5zYXZlZFNlYXJjaGVzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhIHNhdmVkIHNlYXJjaC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHNhdmVkIHNlYXJjaC4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NhdmVkc2VhcmNocGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2F2ZWQgc2VhcmNoIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNofSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuU2F2ZWRTZWFyY2godGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzYC4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi8gICAgIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgc3RvcmFnZSBwYXNzd29yZCwgd2hpY2ggeW91IGNhbiB0aGVuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHN0b3JhZ2UvcGFzc3dvcmRzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5TdG9yYWdlUGFzc3dvcmQgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnN0b3JhZ2VQYXNzd29yZHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgc3RvcmFnZSBwYXNzd29yZC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbiAoc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHN0b3JhZ2UgcGFzc3dvcmRzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBzdG9yYWdlIFxuICAgICAqIHBhc3N3b3JkcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBzdG9yYWdlIHBhc3N3b3JkLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHN0b3JhZ2UvcGFzc3dvcmRzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqL1xuICAgIHJvb3QuU3RvcmFnZVBhc3N3b3JkcyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIGVudGl0eSBoYXMgYmVlbiBjcmVhdGVkLiBCeSBcbiAgICAgICAgICogZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgZmV0Y2hlZCBiZWNhdXNlIHRoZSBlbmRwb2ludCByZXR1cm5zXG4gICAgICAgICAqIChlY2hvZXMpIHRoZSBuZXcgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuc3RvcmFnZVBhc3N3b3JkcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSBzdG9yYWdlIHBhc3N3b3JkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBuZXcgc3RvcmFnZSBwYXNzd29yZC4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycyxcbiAgICAgICAgICogc2VlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RhY2Nlc3MjUE9TVF9zdG9yYWdlLjJGcGFzc3dvcmRzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAqIFBPU1Qgc3RvcmFnZS9wYXNzd29yZHM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNofSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlN0b3JhZ2VQYXNzd29yZCh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNgLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRzXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBmaXJlZCBhbGVydC4gXG4gICAgICogWW91IGNhbiByZXRyaWV2ZSBzZXZlcmFsIG9mIHRoZSBmaXJlZCBhbGVydCdzIHByb3BlcnRpZXMgYnlcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBuYW1lLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFsZXJ0cy9maXJlZF9hbGVydHMve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5GaXJlZEFsZXJ0ID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5maXJlZEFsZXJ0cyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIGFjdGlvbnMgKHN1Y2ggYXMgbm90aWZ5aW5nIGJ5IGVtYWlsLCBydW5uaW5nIGEgXG4gICAgICAgICAqIHNjcmlwdCwgYWRkaW5nIHRvIFJTUywgdHJhY2tpbmcgaW4gQWxlcnQgTWFuYWdlciwgYW5kIGVuYWJsaW5nIFxuICAgICAgICAgKiBzdW1tYXJ5IGluZGV4aW5nKS4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBvZiBhY3Rpb25zLCBhbiBlbXB0eSB7QXJyYXl9IGlmIG5vIGFjdGlvbnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIGFjdGlvbnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLmFjdGlvbnMgfHwgW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIHR5cGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGFsZXJ0J3MgdHlwZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIGFsZXJ0VHlwZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuYWxlcnRfdHlwZSB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVzdWx0IGlzIGEgc2V0IG9mIGV2ZW50cyAoZGlnZXN0KSBvciBhIHNpbmdsZVxuICAgICAgICAgKiBldmVudCAocGVyIHJlc3VsdCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBTcGx1bmsgNC4zIGFuZCBsYXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIGEgZGlnZXN0LCBmYWxzZSBpZiBwZXIgcmVzdWx0XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBpc0RpZ2VzdE1vZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gQ29udmVydCB0aGlzIHByb3BlcnR5IHRvIGEgQm9vbGVhblxuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5wcm9wZXJ0aWVzKCkuZGlnZXN0X21vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHJlbmRlcmVkIGV4cGlyYXRpb24gdGltZSBmb3IgdGhpcyBhbGVydC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGluIFNwbHVuayA0LjMgYW5kIGxhdGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBleHBpcmF0aW9uVGltZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuZXhwaXJhdGlvbl90aW1lX3JlbmRlcmVkIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHNhdmVkIHNlYXJjaCBmb3IgdGhpcyBhbGVydC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc2F2ZWQgc2VhcmNoIG5hbWUsIG9yIHtudWxsfSBpZiBub3QgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgc2F2ZWRTZWFyY2hOYW1lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS5zYXZlZHNlYXJjaF9uYW1lIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIHNldmVyaXR5IG9uIGEgc2NhbGUgb2YgMSB0byAxMCwgd2l0aCAxIGJlaW5nIHRoZVxuICAgICAgICAgKiBoaWdoZXN0IHNldmVyaXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoaXMgYWxlcnQncyBzZXZlcml0eSwgLTEgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgc2V2ZXJpdHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMucHJvcGVydGllcygpLnNldmVyaXR5LCAxMCkgfHwgLTE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIHNlYXJjaCBJRCAoU0lEKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGlzIGFsZXJ0J3MgU0lELCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHNpZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuc2lkIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHRpbWUgdGhpcyBhbGVydCB3YXMgdHJpZ2dlcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoaXMgYWxlcnQncyB0cmlnZ2VyIHRpbWUsIG9yIHtudWxsfSBpZiBub3QgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgdHJpZ2dlclRpbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLnRyaWdnZXJfdGltZSB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyByZW5kZXJlZCB0cmlnZ2VyIHRpbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBTcGx1bmsgNC4zIGFuZCBsYXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGlzIGFsZXJ0J3MgcmVuZGVyZWQgdHJpZ2dlciB0aW1lLCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHRyaWdnZXJUaW1lUmVuZGVyZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLnRyaWdnZXJfdGltZV9yZW5kZXJlZCB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiB0cmlnZ2VyZWQgYWxlcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gU3BsdW5rIDQuMyBhbmQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge051bWJlcn0gVGhlIG51bWJlciBvZiB0cmlnZ2VyZWQgYWxlcnRzLCBvciAtMSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgdHJpZ2dlcmVkQWxlcnRDb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5wcm9wZXJ0aWVzKCkudHJpZ2dlcmVkX2FsZXJ0cywgMTApIHx8IC0xO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IGFsZXJ0IGdyb3VwLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIGFsZXJ0IGdyb3VwLCB3aGljaCB5b3UgY2FuIHRoZW4gdmlldyBhbmRcbiAgICAgKiByZW1vdmUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgYWxlcnRzL2ZpcmVkX2FsZXJ0cy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuRmlyZWRBbGVydEdyb3VwID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmZpcmVkQWxlcnRzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgYHRyaWdnZXJlZF9hbGVydF9jb3VudGAgcHJvcGVydHksIHRoZSBjb3VudFxuICAgICAgICAgKiBvZiB0cmlnZ2VyZWQgYWxlcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjb3VudCBvZiB0cmlnZ2VyZWQgYWxlcnRzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgICAgICovXG4gICAgICAgIGNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyZWRfYWxlcnRfY291bnQsIDEwKSB8fCAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGZpcmVkIGluc3RhbmNlcyBvZiB0aGlzIGFsZXJ0LCB3aGljaCBpc1xuICAgICAgICAgKiBhIGxpc3Qgb2YgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydGAgaW5zdGFuY2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhbGVydEdyb3VwID0gc2VydmljZS5maXJlZEFsZXJ0R3JvdXBzKCkuaXRlbShcIk15QWxlcnRcIik7XG4gICAgICAgICAqICAgICAgYWxlcnRHcm91cC5saXN0KGZ1bmN0aW9uKGVyciwgZmlyZWRBbGVydHMsIGFsZXJ0KSB7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmaXJlZEFsZXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaXJlZCBhbGVydFwiLCBpLCBcIjpcIiwgZmlyZWRBbGVydHNbaV0uc2lkKTtcbiAgICAgICAgICogICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZmlyZWQgYWxlcnRzIGFyZSByZXRyaWV2ZWQ6IGAoZXJyLCBmaXJlZEFsZXJ0cywgYWxlcnRHcm91cClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICAgICAqL1xuICAgICAgICBsaXN0OiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcIlwiLCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBmaXJlZEFsZXJ0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YS5lbnRyeSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpcmVkQWxlcnREYXRhID0gcmVzcG9uc2UuZGF0YS5lbnRyeVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKGZpcmVkQWxlcnREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpcmVkQWxlcnQgPSBuZXcgcm9vdC5GaXJlZEFsZXJ0KHRoYXQuc2VydmljZSwgZmlyZWRBbGVydERhdGEubmFtZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyZWRBbGVydC5fbG9hZChmaXJlZEFsZXJ0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGZpcmVkQWxlcnRzLnB1c2goZmlyZWRBbGVydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpcmVkQWxlcnRzLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgYWxlcnQgZ3JvdXAuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdCA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5saXN0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZmlyZWQgYWxlcnRzIGZvciBhIHNhdmVkIHNlYXJjaC4gWW91IGNhblxuICAgICAqIGNyZWF0ZSBhbmQgbGlzdCBzYXZlZCBzZWFyY2hlcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvclxuICAgICAqIGdldCBhIHNwZWNpZmljIGFsZXJ0IGdyb3VwLiBcbiAgICAgKlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFsZXJ0cy9maXJlZF9hbGVydHNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovXG4gICAgcm9vdC5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuZmlyZWRBbGVydHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGFsZXJ0IGdyb3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBhbGVydCBncm91cC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXB9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRmlyZWRBbGVydEdyb3VwKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3VwcHJlc3MgcmVtb3ZpbmcgYWxlcnRzIHZpYSB0aGUgZmlyZWQgYWxlcnRzIGVuZHBvaW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRvIHJlbW92ZSBhbiBhbGVydCwgcmVtb3ZlIHRoZSBzYXZlZCBzZWFyY2ggd2l0aCB0aGUgc2FtZSBuYW1lLlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbmAuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9ufSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZW1vdmUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIFNwbHVuayBhcHAgdGhhdCB5b3UgY2FuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWwve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuQXBwbGljYXRpb24gPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIHVwZGF0ZSB0byBnZXQgdGhlIHVwZGF0ZWQgXG4gICAgICAgICAqIGl0ZW0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPblVwZGF0ZTogdHJ1ZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmFwcHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBTcGx1bmsgYXBwLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9ufSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvblxuICAgICAgICAgKi8gXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNldHVwSW5mbyAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2V0dXBJbmZvKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5mbyA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGVJbmZvKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHNldHVwIGluZm9ybWF0aW9uIGZvciBhIFNwbHVuayBhcHAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcCA9IHNlcnZpY2UuYXBwcygpLml0ZW0oXCJhcHBcIik7XG4gICAgICAgICAqICAgICAgYXBwLnNldHVwKGZ1bmN0aW9uKGVyciwgaW5mbywgc2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU0VUVVAgSU5GTzogXCIsIGluZm8pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzZXR1cCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQ6IGAoZXJyLCBpbmZvLCBhcHApYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWwve25hbWV9L3NldHVwXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgc2V0dXBJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJzZXR1cFwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLmVudHJ5LmNvbnRlbnQsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyBhbnkgaW5mb3JtYXRpb24gZm9yIGFuIHVwZGF0ZSB0byBhIGxvY2FsbHktaW5zdGFsbGVkIFNwbHVuayBhcHAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcCA9IHNlcnZpY2UuYXBwcygpLml0ZW0oXCJNeUFwcFwiKTtcbiAgICAgICAgICogICAgICBhcHAudXBkYXRlSW5mbyhmdW5jdGlvbihlcnIsIGluZm8sIGFwcCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlVQREFURSBJTkZPOiBcIiwgaW5mbyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHVwZGF0ZSBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQ6IGAoZXJyLCBpbmZvLCBhcHApYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWwve25hbWV9L3VwZGF0ZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZUluZm86IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInVwZGF0ZVwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLmVudHJ5LmNvbnRlbnQsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgU3BsdW5rIGFwcHMuIFlvdSBjYW4gY3JlYXRlIGFuZCBsaXN0IGFwcGxpY2F0aW9ucyBcbiAgICAgKiB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBhcHAuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgYXBwcy9sb2NhbFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5BcHBsaWNhdGlvbnMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgXG4gICAgICAgICAqIGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJuc1xuICAgICAgICAgKiAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmFwcHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGFwcC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IGFwcC4gRm9yIGRldGFpbHMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVGFwcHMjUE9TVF9hcHBzLjJGbG9jYWxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5QT1NUIGFwcHMvbG9jYWw8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9ufSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkFwcGxpY2F0aW9uKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwge30pO1xuICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCB7fSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHNlcnZlci9pbmZvXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5TZXJ2ZXJJbmZvID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5pbmZvO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNlcnZlckluZm9cbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBcInNlcnZlci1pbmZvXCI7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIFNwbHVuayB1c2VyLCB3aGljaCB5b3UgY2FuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGF1dGhlbnRpY2F0aW9uL3VzZXJzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuVXNlciA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuVXNlclxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMudXNlcnMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Vc2VyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIFNwbHVuayB1c2VybmFtZS5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Vc2VyfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Vc2VyYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIHt9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHVzZXJzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCB1c2VycyB1c2luZyBcbiAgICAgKiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyB1c2VyLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGF1dGhlbnRpY2F0aW9uL3VzZXJzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuVXNlcnNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuVXNlcnMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgXG4gICAgICAgICAqIGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJuc1xuICAgICAgICAgKiAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaE9uRW50aXR5Q3JlYXRpb246IHRydWUsXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy51c2VycztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSB1c2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgbmV3IHVzZXIuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVKOCN1c2VyYXV0aHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlVzZXIgYXV0aGVudGljYXRpb24gcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVXNlcmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuVXNlcih0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuVXNlcnNgLiBcbiAgICAgICAgICogXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcnN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCB7fSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyB1c2VyLiBcbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgZW5kcG9pbnQgcmVxdWlyZXMgYSBzcGVjaWFsIGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjgjdXNlcmF1dGhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Vc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgbmV3IGVudGl0eTogYChlcnIsIGNyZWF0ZWRFbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcIlwiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIHVzIHRvIHVzZSB0aGUgcGFzc2VkLWluIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0ge25hbWU6IHBhcmFtcy5uYW1lfTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHkgPSB0aGF0Lmluc3RhbnRpYXRlRW50aXR5KHByb3BzKTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHkuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxLndhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgU3BsdW5rIHZpZXcsIHdoaWNoIHlvdSBjYW4gdmlldywgbW9kaWZ5LCBhbmRcbiAgICAgKiByZW1vdmUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgZGF0YS91aS92aWV3cy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5WaWV3XG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LlZpZXcgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnZpZXdzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuVmlld2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2aWV3LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5WaWV3fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5WaWV3YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHZpZXdzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCB2aWV3cyB1c2luZyBcbiAgICAgKiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyB2aWV3LlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGEvdWkvdmlld3NcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5WaWV3cyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy52aWV3cztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSB2aWV3LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBuZXcgdmlldy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI1BPU1Rfc2NoZWR1bGVkLjJGdmlld3MuMkYuN0JuYW1lLjdEXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UE9TVCBzY2hlZHVsZWQvdmlld3Mve25hbWV9PC9hPiBlbmRwb2ludCBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5WaWV3fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5WaWV3YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuVmlldyh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld3N9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGluZGV4LCB3aGljaCB5b3UgY2FuIHVwZGF0ZSBhbmQgc3VibWl0IGV2ZW50cyB0by5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXMvbmFtZVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4XG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkluZGV4ID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuaW5kZXhlcyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluZGV4LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5JbmRleH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zdWJtaXRFdmVudCA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zdWJtaXRFdmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogU3VibWl0cyBhbiBldmVudCB0byB0aGlzIGluZGV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBpbmRleCA9IHNlcnZpY2UuaW5kZXhlcygpLml0ZW0oXCJfaW50ZXJuYWxcIik7XG4gICAgICAgICAqICAgICAgaW5kZXguc3VibWl0RXZlbnQoXCJBIG5ldyBldmVudFwiLCB7c291cmNldHlwZTogXCJteXNvdXJjZXR5cGVcIn0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0LCBpbmRleCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlN1Ym1pdHRlZCBldmVudDogXCIsIHJlc3VsdCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBUaGUgdGV4dCBmb3IgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcGFyYW1ldGVycyBmb3IgaW5kZXhpbmc6IFxuICAgICAgICAgKiAgICAtIGBob3N0YCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIGhvc3QgZmllbGQgZm9yIGV2ZW50cyBmcm9tIHRoaXMgZGF0YSBpbnB1dC4gXG4gICAgICAgICAqICAgIC0gYGhvc3RfcmVnZXhgIChfc3RyaW5nXyk6IEEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZXh0cmFjdCB0aGUgaG9zdCB2YWx1ZSBmcm9tIGVhY2ggZXZlbnQuIFxuICAgICAgICAgKiAgICAtIGBzb3VyY2VgIChfc3RyaW5nXyk6IFRoZSBzb3VyY2UgdmFsdWUgdG8gZmlsbCBpbiB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgaW5wdXQncyBldmVudHMuXG4gICAgICAgICAqICAgIC0gYHNvdXJjZXR5cGVgIChfc3RyaW5nXyk6IFRoZSBzb3VyY2V0eXBlIHRvIGFwcGx5IHRvIGV2ZW50cyBmcm9tIHRoaXMgaW5wdXQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyBzdWJtaXR0ZWQ6IGAoZXJyLCByZXN1bHQsIGluZGV4KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCByZWNlaXZlcnMvc2ltcGxlP2luZGV4PXtuYW1lfVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhcbiAgICAgICAgICovXG4gICAgICAgIHN1Ym1pdEV2ZW50OiBmdW5jdGlvbihldmVudCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGluZGV4IG5hbWVcbiAgICAgICAgICAgIHBhcmFtc1tcImluZGV4XCJdID0gdGhpcy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmxvZyhldmVudCwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0LCB0aGF0KTsgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UudmVyc2lvbkNvbXBhcmUoXCI1LjBcIikgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5kZXhlcyBjYW5ub3QgYmUgcmVtb3ZlZCBpbiBTcGx1bmsgNC54XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgICAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBpbmRleGVzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBpbmRleGVzIHVzaW5nIFxuICAgICAqIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIGluZGV4LlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGEvaW5kZXhlc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuSW5kZXhlcyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmluZGV4ZXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGluZGV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBuZXcgaW5kZXguIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVKMyNpbmRleHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPkluZGV4IHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkluZGV4fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5JbmRleGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuSW5kZXgodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5JbmRleGVzYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSW5kZXhlc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBpbmRleCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBpbmRleGVzID0gc2VydmljZS5pbmRleGVzKCk7XG4gICAgICAgICAqICAgICAgaW5kZXhlcy5jcmVhdGUoXCJOZXdJbmRleFwiLCB7YXNzdXJlVVRGODogdHJ1ZX0sIGZ1bmN0aW9uKGVyciwgbmV3SW5kZXgpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBBIG5hbWUgZm9yIHRoaXMgaW5kZXguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVKMyNpbmRleHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPkluZGV4IHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgbmV3IGluZGV4OiBgKGVyciwgY3JlYXRlZEluZGV4KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24obmFtZSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsZWQgdXMgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZSBvZiAocGFyYW1zLCBjYWxsYmFjayksXG4gICAgICAgICAgICAvLyBsZXRzIG1ha2UgaXQgd29ya1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KG5hbWUpICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBuYW1lO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJhbXMubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zW1wibmFtZVwiXSA9IG5hbWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBzdGFuemEsIHdoaWNoIHlvdSBjYW4gdXBkYXRlIGFuZCByZW1vdmUsIGZyb20gYSBcbiAgICAgKiBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgY29uZmlncy9jb25mLXtmaWxlfS97bmFtZX1gXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5Db25maWd1cmF0aW9uU3RhbnphID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uU3RhbnphXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lID09PSBcImRlZmF1bHRcIiA/IFwiX25ld1wiIDogdGhpcy5uYW1lO1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmNvbmZpZ3VyYXRpb25zICsgXCIvY29uZi1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmZpbGUpICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZSBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbmV3IHN0YW56YS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uU3RhbnphXG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgZmlsZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2Ygc3RhbnphcyBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eSBmaWxlLiBZb3UgY2FuXG4gICAgICogY3JlYXRlIGFuZCBsaXN0IHN0YW56YXMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgXG4gICAgICogc3RhbnphLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGNvbmZpZ3MvY29uZi17ZmlsZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5Db25maWd1cmF0aW9uRmlsZSA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoeyBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuY29uZmlndXJhdGlvbnMgKyBcIi9jb25mLVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBzdGFuemEgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIFlvdSBjYW5ub3QgZGlyZWN0bHkgdXBkYXRlIHRoZSBgQ29uZmlndXJhdGlvblN0YW56YWAgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHZpZXdpbmcgYGNvbmZpZ3MvY29uZi17ZmlsZX0vX25ld2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0RGVmYXVsdFN0YW56YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuQ29uZmlndXJhdGlvblN0YW56YSh0aGlzLnNlcnZpY2UsIHRoaXMubmFtZSwgXCJkZWZhdWx0XCIsIHRoaXMubmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgc3RhbnphIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIGtleS12YWx1ZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHN0YW56YS4gXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkNvbmZpZ3VyYXRpb25TdGFuemEodGhpcy5zZXJ2aWNlLCB0aGlzLm5hbWUsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGV9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc3RhbnphIGluIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBmaWxlID0gc2VydmljZS5jb25maWd1cmF0aW9ucygpLml0ZW0oXCJwcm9wc1wiKTtcbiAgICAgICAgICogICAgICBmaWxlLmNyZWF0ZShcIm15X3N0YW56YVwiLCBmdW5jdGlvbihlcnIsIG5ld1N0YW56YSkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNSRUFURURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGFuemFOYW1lIEEgbmFtZSBmb3IgdGhpcyBzdGFuemEuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgQSBkaWN0aW9uYXJ5IG9mIGtleS12YWx1ZSBwYWlycyB0byBwdXQgaW4gdGhpcyBzdGFuemEuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIHN0YW56YTogYChlcnIsIGNyZWF0ZWRTdGFuemEpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGNvbmZpZ3MvY29uZi17ZmlsZX1cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHN0YW56YU5hbWUsIHZhbHVlcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbGVkIHVzIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUgb2YgKHBhcmFtcywgY2FsbGJhY2spLFxuICAgICAgICAgICAgLy8gbGV0cyBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChzdGFuemFOYW1lKSAmJiB1dGlscy5pc0Z1bmN0aW9uKHZhbHVlcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gc3RhbnphTmFtZTtcbiAgICAgICAgICAgICAgICBzdGFuemFOYW1lID0gdmFsdWVzLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHZhbHVlcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcyB8fCB7fTtcbiAgICAgICAgICAgIHZhbHVlc1tcIm5hbWVcIl0gPSBzdGFuemFOYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIodmFsdWVzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBjb25maWd1cmF0aW9uIGZpbGVzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBcbiAgICAgKiBjb25maWd1cmF0aW9uIGZpbGVzIHVzaW5nIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIGZpbGUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgcHJvcGVydGllc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LkNvbmZpZ3VyYXRpb25zID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gZW50aXR5IGhhcyBiZWVuIGNyZWF0ZWQuIEJ5IFxuICAgICAgICAgKiBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnNcbiAgICAgICAgICogKGVjaG9lcykgdGhlIG5ldyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMucHJvcGVydGllcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGV9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIHRoaXMubmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2Uub3duZXIgPT09IFwiLVwiIHx8IG5hbWVzcGFjZS5hcHAgPT09IFwiLVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbnMgcmVxdWlyZXMgYSBub24td2lsZGNhcmQgb3duZXIvYXBwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgY29uZmlndXJhdGlvbnMgPSBzZXJ2aWNlLmNvbmZpZ3VyYXRpb25zKCk7XG4gICAgICAgICAqICAgICAgY29uZmlndXJhdGlvbnMuY3JlYXRlKFwibXlwcm9wc1wiLCBmdW5jdGlvbihlcnIsIG5ld0ZpbGUpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgQSBuYW1lIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGU6IGAoZXJyLCBjcmVhdGVkRmlsZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgcHJvcGVydGllc1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24oZmlsZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVtcIl9fY29uZlwiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiXCIsIHtfX2NvbmY6IGZpbGVuYW1lfSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHkgPSBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSh0aGF0LnNlcnZpY2UsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5LmZldGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydGVkLCBzbyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgZG9lc0ZpbGVFeGlzdDogYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gMS4gRmV0Y2ggZmlsZXMgbGlzdFxuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0X3YyKFwiXCIsICB7X19jb25mOiBmaWxlbmFtZX0pO1xuXG4gICAgICAgICAgICAgICAgLy8gMi4gRmlsdGVyIHRoZSBmaWxlc1xuICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IHJlc3BvbnNlPy5ib2R5Py5lbnRyeT8uZmlsdGVyKGYgPT4gZi5uYW1lID09PSBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgY29kZTpcIkZJTEVfTk9UX0ZPVU5EXCIsIG1lc3NhZ2U6IGBGaWxlIHdpdGggdGhlIG5hbWUgJyR7ZmlsZW5hbWV9JyBkb2VzIG5vdCBleGlzdC5gfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAzLiBDcmVhdGUgYSBsb2NhbCBpbnN0YW5jZVxuICAgICAgICAgICAgICAgIHZhciBjb25maWd1cmF0aW9uRmlsZSA9IG5ldyByb290LkNvbmZpZ3VyYXRpb25GaWxlKHRoYXQuc2VydmljZSwgZmlsZW5hbWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gNC4gTG9hZCB0aGUgZmlsZSBjb250ZW50XG4gICAgICAgICAgICAgICAgdmFyIGZldGNoZWRGaWxlID0gYXdhaXQgY29uZmlndXJhdGlvbkZpbGUuZmV0Y2hfdjIoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7ZmlsZTogZmV0Y2hlZEZpbGV9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvckNvZGU6XCJTWVNURU1fRVJST1JcIiwgZXJyb3JNZXNzYWdlOiBlcnJvcn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZG9lc1N0YW56YUV4aXN0OiBhc3luYyBmdW5jdGlvbihmaWxlLCBzdGFuemEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMS4gY2hlY2sgaWYgdGhlIHN0YW56YSBleGlzdHNcbiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hlZFN0YW56YSA9IGZpbGUuaXRlbShzdGFuemEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmKCFmZXRjaGVkU3RhbnphKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNvZGU6XCJTVEFOWkFfTk9UX0ZPVU5EXCIsIG1lc3NhZ2U6IGBTdGFuemEgd2l0aCB0aGUgbmFtZSAnJHtzdGFuemF9JyBkb2VzIG5vdCBleGlzdC5gfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3RhbnphOiBmZXRjaGVkU3RhbnphfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yQ29kZTpcIlNZU1RFTV9FUlJPUlwiLCBlcnJvck1lc3NhZ2U6IGVycm9yfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVfdjI6IGFzeW5jIGZ1bmN0aW9uIChjb25maWdzLCBzdmMsIGZpbGVuYW1lLCBzdGFuemEsIGtleVZhbHVlTWFwLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyAxLiBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHNcbiAgICAgICAgICAgIHZhciBkb2VzRmlsZUV4aXN0UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRvZXNGaWxlRXhpc3QoZmlsZW5hbWUpO1xuICAgICAgICAgICAgdmFyIGNvbmZpZ0ZpbGUgPSBkb2VzRmlsZUV4aXN0UmVzcG9uc2UuZmlsZTtcblxuICAgICAgICAgICAgLy8gMi4gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgY3JlYXRlIGEgbmV3IGZpbGVcbiAgICAgICAgICAgIGlmKCFjb25maWdGaWxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZG9lc0ZpbGVFeGlzdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4uLlwiKTtcblxuICAgICAgICAgICAgICAgIHRoYXQuY3JlYXRlKCB7IF9fY29uZjogZmlsZW5hbWUgfSwgXG4gICAgICAgICAgICAgICAgICAgIChlcnIsIG5ld0ZpbGUpID0+IGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIEZpbGUgY3JlYXRlZDogJHtmaWxlbmFtZX1gKSApO1xuXG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZSA9IG5ldyByb290LkNvbmZpZ3VyYXRpb25GaWxlKCB0aGF0LnNlcnZpY2UsIGZpbGVuYW1lICk7XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZSA9IGF3YWl0IGNvbmZpZ0ZpbGUuZmV0Y2hfdjIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaWYgdGhlIHN0YW56YSBleGlzdHNcbiAgICAgICAgICAgIHZhciBkb2VzU3RhbnphRXhpc3RSZXNwb25zZSA9IGF3YWl0IHRoaXMuZG9lc1N0YW56YUV4aXN0KGNvbmZpZ0ZpbGUsIHN0YW56YSk7XG4gICAgICAgICAgICB2YXIgY29uZmlnU3RhbnphID0gZG9lc1N0YW56YUV4aXN0UmVzcG9uc2Uuc3RhbnphO1xuXG4gICAgICAgICAgICAvLyAzLiBJZiB0aGUgc3RhbnphIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBzdGFuemEgd2l0aCBnaXZlbiBrZXlWYWx1ZU1hcFxuICAgICAgICAgICAgaWYoIWNvbmZpZ1N0YW56YSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRvZXNTdGFuemFFeGlzdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gc3RhbnphLi4uXCIpO1xuXG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZS5jcmVhdGUoc3RhbnphLCBrZXlWYWx1ZU1hcCwgZnVuY3Rpb24gKGVyciwgbmV3U3RhbnphKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIFN0YW56YSBjcmVhdGVkOiAke3N0YW56YX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDQuIElmIHRoZSBzdGFuemEgZXhpc3RzLCB1cGRhdGUgaXQgd2l0aCB0aGUga2V5VmFsdWVNYXBcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1N0YW56YS51cGRhdGUoa2V5VmFsdWVNYXAsIChlcnIsIHVwZGF0ZWRTdGFuemEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZ3VyYXRpb24gU3RhbnphIHVwZGF0ZWQ6ICR7c3RhbnphfWApO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIHNlYXJjaCBqb2IuIFlvdSBjYW4gcGVyZm9ybSBkaWZmZXJlbnQgb3BlcmF0aW9uc1xuICAgICAqIG9uIHRoaXMgam9iLCBzdWNoIGFzIHJlYWRpbmcgaXRzIHN0YXR1cywgY2FuY2VsaW5nIGl0LCBhbmQgZ2V0dGluZyByZXN1bHRzLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkpvYiA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5qb2JzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuSm9iYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNpZCBUaGUgc2VhcmNoIElEIGZvciB0aGlzIHNlYXJjaCBqb2IuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSm9iYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi8gXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHNpZCwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBzaWQ7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuc2lkID0gc2lkO1xuXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuY2FuY2VsICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY2FuY2VsKTtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVByZXZpZXcgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGlzYWJsZVByZXZpZXcpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQcmV2aWV3ICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5lbmFibGVQcmV2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZXZlbnRzKTtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemUgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmluYWxpemUpO1xuICAgICAgICAgICAgdGhpcy5wYXVzZSAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wYXVzZSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnByZXZpZXcpO1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZXN1bHRzKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNobG9nICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2VhcmNobG9nKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJpb3JpdHkgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2V0UHJpb3JpdHkpO1xuICAgICAgICAgICAgdGhpcy5zZXRUVEwgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zZXRUVEwpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5ICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zdW1tYXJ5KTtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudGltZWxpbmUpO1xuICAgICAgICAgICAgdGhpcy50b3VjaCAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy50b3VjaCk7XG4gICAgICAgICAgICB0aGlzLnVucGF1c2UgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVucGF1c2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW5jZWxzIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5jYW5jZWwoZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ0FOQ0VMTEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgc2VhcmNoIGlzIGRvbmU6IGAoZXJyKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiY2FuY2VsXCJ9LCBjYWxsYmFjayk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGVzIHByZXZpZXcgZ2VuZXJhdGlvbiBmb3IgYSBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLmRpc2FibGVQcmV2aWV3KGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiUFJFVklFVyBESVNBQkxFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhpcyBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGRpc2FibGVQcmV2aWV3OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImRpc2FibGVwcmV2aWV3XCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgcHJldmlldyBnZW5lcmF0aW9uIGZvciBhIHNlYXJjaCBqb2IuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLmRpc2FibGVQcmV2aWV3KGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiUFJFVklFVyBFTkFCTEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGlzIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlUHJldmlldzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJlbmFibGVwcmV2aWV3XCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGV2ZW50cyBvZiBhIHNlYXJjaCBqb2Igd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLmV2ZW50cyh7Y291bnQ6IDEwfSwgZnVuY3Rpb24oZXJyLCBldmVudHMsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkczogXCIsIGV2ZW50cy5maWVsZHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIGV2ZW50cy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI0dFVF9zZWFyY2guMkZqb2JzLjJGLjdCc2VhcmNoX2lkLjdELjJGZXZlbnRzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2V2ZW50czwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudHMgYXJlIHJldHJpZXZlZDogYChlcnIsIGV2ZW50cywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9ldmVudHNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgZXZlbnRzOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0X21vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcImV2ZW50c1wiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRmluYWxpemVzIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5maW5hbGl6ZShmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkpPQiBGSU5BTElaRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiZmluYWxpemVcIn0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBzZWFyY2ggam9iJ3MgZXZlbnRzIG9yIHJlc3VsdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIE9uZSBvZiB7XCJldmVudHNcIiwgXCJwcmV2aWV3XCIsIFwicmVzdWx0c1wifS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVyczpcbiAgICAgICAgICogICAgLSBgcGFnZXNpemVgIChfaW50ZWdlcl8pOiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybiBvbiBlYWNoIHJlcXVlc3QuIERlZmF1bHRzIHRvIGFzIG1hbnkgYXMgcG9zc2libGUuXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmF0b3Igb2JqZWN0IHdpdGggYSBgbmV4dChjYWxsYmFjaylgIG1ldGhvZCwgd2hlcmUgYGNhbGxiYWNrYCBpcyBvZiB0aGUgZm9ybSBgKGVyciwgcmVzdWx0cywgaGFzTW9yZVJlc3VsdHMpYC5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGl0ZXJhdG9yOiBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5QYWdpbmF0ZWRFbmRwb2ludEl0ZXJhdG9yKHRoaXNbdHlwZV0sIHBhcmFtcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhdXNlcyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IucGF1c2UoZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgUEFVU0VEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHBhdXNlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInBhdXNlXCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcbiAgICAgICAgICogR2V0cyB0aGUgcHJldmlldyByZXN1bHRzIGZvciBhIHNlYXJjaCBqb2Igd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnByZXZpZXcoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cywgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmllbGRzOiBcIiwgcmVzdWx0cy5maWVsZHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHByZXZpZXcgcmVzdWx0cy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI0dFVF9zZWFyY2guMkZqb2JzLjJGLjdCc2VhcmNoX2lkLjdELjJGcmVzdWx0c19wcmV2aWV3XCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3Jlc3VsdHNfcHJldmlldzwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBwcmV2aWV3IHJlc3VsdHMgYXJlIHJldHJpZXZlZCA6IGAoZXJyLCByZXN1bHRzLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3Jlc3VsdHNfcHJldmlld1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBwcmV2aWV3OiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0X21vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInJlc3VsdHNfcHJldmlld1wiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgcmVzdWx0cyBmb3IgYSBzZWFyY2ggam9iIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgICogXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayBjYW4gZ2V0IGB1bmRlZmluZWRgIGZvciBpdHMgYHJlc3VsdHNgIHBhcmFtZXRlciBpZiB0aGVcbiAgICAgICAgICogam9iIGlzIG5vdCB5ZXQgZG9uZS4gVG8gYXZvaWQgdGhpcywgdXNlIHRoZSBgSm9iLnRyYWNrKClgIG1ldGhvZCB0b1xuICAgICAgICAgKiB3YWl0IHVudGlsIHRoZSBqb2IgaXMgY29tcGxldGUgcHJpb3IgdG8gZmV0Y2hpbmcgdGhlIHJlc3VsdHMgd2l0aFxuICAgICAgICAgKiB0aGlzIG1ldGhvZC5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IucmVzdWx0cyh7Y291bnQ6IDEwfSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZHM6IFwiLCByZXN1bHRzLnJlc3VsdHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHNlYXJjaCByZXN1bHRzLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RzZWFyY2gjR0VUX3NlYXJjaC4yRmpvYnMuMkYuN0JzZWFyY2hfaWQuN0QuMkZyZXN1bHRzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3Jlc3VsdHM8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVzdWx0cyBhcmUgcmV0cmlldmVkOiBgKGVyciwgcmVzdWx0cywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHJlc3VsdHM6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfbW9kZSA9IHBhcmFtcy5vdXRwdXRfbW9kZSB8fCBcImpzb25fcm93c1wiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJyZXN1bHRzXCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBzZWFyY2ggbG9nIGZvciB0aGlzIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2Iuc2VhcmNobG9nKGZ1bmN0aW9uKGVyciwgc2VhcmNobG9nLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coc2VhcmNobG9nKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBsb2cgYW5kIGpvYjogYChlcnIsIHNlYXJjaGxvZywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9zZWFyY2gubG9nXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHNlYXJjaGxvZzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwic2VhcmNoLmxvZ1wiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBwcmlvcml0eSBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnNldFByaW9yaXR5KDYsIGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFBSSU9SSVRZIFNFVFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIFRoZSBwcmlvcml0eSAoYW4gaW50ZWdlciBiZXR3ZWVuIDEtMTApLiBBIGhpZ2hlciB2YWx1ZSBtZWFucyBhIGhpZ2hlciBwcmlvcml0eS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0UHJpb3JpdHk6IGZ1bmN0aW9uKHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInNldHByaW9yaXR5XCIsIHByaW9yaXR5OiB2YWx1ZX0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgdGltZSB0byBsaXZlIChUVEwpIGZvciB0aGUgc2VhcmNoIGpvYiwgd2hpY2ggaXMgdGhlIHRpbWUgYmVmb3JlXG4gICAgICAgICAqIHRoZSBzZWFyY2ggam9iIGV4cGlyZXMgYWZ0ZXIgaXQgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpcyBzdGlsbCBhdmFpbGFibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2Iuc2V0VFRMKDEwMDAsIGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFRUTCBTRVRcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgdGltZSB0byBsaXZlLCBpbiBzZWNvbmRzLiBcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0VFRMOiBmdW5jdGlvbih2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJzZXR0dGxcIiwgdHRsOiB2YWx1ZX0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgc3VtbWFyeSBmb3IgdGhpcyBzZWFyY2ggam9iIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2Iuc3VtbWFyeSh7dG9wX2NvdW50OiA1fSwgZnVuY3Rpb24oZXJyLCBzdW1tYXJ5LCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTdW1tYXJ5OiBcIiwgc3VtbWFyeSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIHN1bW1hcnkuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRnN1bW1hcnlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5HRVQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vc3VtbWFyeTwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzdW1tYXJ5IGFuZCBzZWFyY2ggam9iOiBgKGVyciwgc3VtbWFyeSwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9zdW1tbWFyeVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBzdW1tYXJ5OiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInN1bW1hcnlcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHRpbWVsaW5lIGZvciB0aGlzIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IudGltZWxpbmUoe3RpbWVfZm9ybWF0OiBcIiVjXCJ9LCBmdW5jdGlvbihlcnIsIGpvYiwgdGltZWxpbmUpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJUaW1lbGluZTogXCIsIHRpbWVsaW5lKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyB0aGUgdGltZWxpbmUuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRnRpbWVsaW5lXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3RpbWVsaW5lIDwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSB0aW1lbGluZSBhbmQgc2VhcmNoIGpvYjogYChlcnIsIHRpbWVsaW5lLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3RpbWVsaW5lXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHRpbWVsaW5lOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInRpbWVsaW5lXCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUb3VjaGVzIGEgc2VhcmNoIGpvYiwgd2hpY2ggbWVhbnMgZXh0ZW5kaW5nIHRoZSBleHBpcmF0aW9uIHRpbWUgb2YgXG4gICAgICAgICAqIHRoZSBzZWFyY2ggdG8gbm93IHBsdXMgdGhlIHRpbWUgdG8gbGl2ZSAoVFRMKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi50b3VjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgVE9VQ0hFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2g6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwidG91Y2hcIn0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydHMgcG9sbGluZyB0aGUgc3RhdHVzIG9mIHRoaXMgc2VhcmNoIGpvYiwgYW5kIGZpcmVzIGNhbGxiYWNrc1xuICAgICAgICAgKiB1cG9uIGVhY2ggc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEEgZGljdGlvbmFyeSBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzOlxuICAgICAgICAgKiAgICAtIGBwZXJpb2RgIChfaW50ZWdlcl8pOiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJldHdlZW4gZWFjaCBwb2xsLiBEZWZhdWx0cyB0byA1MDAuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjYWxsYmFja3MgQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbmFsIGNhbGxiYWNrczpcbiAgICAgICAgICogICAgLSBgcmVhZHlgOiBBIGZ1bmN0aW9uIGAoam9iKWAgaW52b2tlZCB3aGVuIHRoZSBqb2IncyBwcm9wZXJ0aWVzIGZpcnN0IGJlY29tZSBhdmFpbGFibGUuXG4gICAgICAgICAqICAgIC0gYHByb2dyZXNzYDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgd2hlbmV2ZXIgbmV3IGpvYiBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqICAgIC0gYGRvbmVgOiBBIGZ1bmN0aW9uIGAoam9iKWAgaW52b2tlZCBpZiB0aGUgam9iIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuIE5vIGZ1cnRoZXIgcG9sbGluZyBpcyBkb25lLlxuICAgICAgICAgKiAgICAtIGBmYWlsZWRgOiBBIGZ1bmN0aW9uIGAoam9iKWAgaW52b2tlZCBpZiB0aGUgam9iIGZhaWxzIGV4ZWN1dGluZyBvbiB0aGUgc2VydmVyLiBObyBmdXJ0aGVyIHBvbGxpbmcgaXMgZG9uZS5cbiAgICAgICAgICogICAgLSBgZXJyb3JgOiBBIGZ1bmN0aW9uIGAoZXJyKWAgaW52b2tlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcG9sbGluZy4gTm8gZnVydGhlciBwb2xsaW5nIGlzIGRvbmUuXG4gICAgICAgICAqIE9yLCBpZiBhIGZ1bmN0aW9uIGAoam9iKWAsIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBpdCBhcyBhIGBkb25lYCBjYWxsYmFjay5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgdHJhY2s6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgdmFyIHBlcmlvZCA9IG9wdGlvbnMucGVyaW9kIHx8IDUwMDsgLy8gbXNcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oY2FsbGJhY2tzKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG5vQ2FsbGJhY2tzQWZ0ZXJSZWFkeSA9IChcbiAgICAgICAgICAgICAgICAhY2FsbGJhY2tzLnByb2dyZXNzICYmXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5kb25lICYmXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5mYWlsZWQgJiZcbiAgICAgICAgICAgICAgICAhY2FsbGJhY2tzLmVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFja3MucmVhZHkgPSBjYWxsYmFja3MucmVhZHkgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wcm9ncmVzcyA9IGNhbGxiYWNrcy5wcm9ncmVzcyB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgY2FsbGJhY2tzLmRvbmUgPSBjYWxsYmFja3MuZG9uZSB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgY2FsbGJhY2tzLmZhaWxlZCA9IGNhbGxiYWNrcy5mYWlsZWQgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5lcnJvciA9IGNhbGxiYWNrcy5lcnJvciB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgdXNlIGJ5IHRlc3RzIG9ubHlcbiAgICAgICAgICAgIGNhbGxiYWNrcy5fcHJlcmVhZHkgPSBjYWxsYmFja3MuX3ByZXJlYWR5IHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBjYWxsYmFja3MuX3N0b3BwZWRBZnRlclJlYWR5ID0gY2FsbGJhY2tzLl9zdG9wcGVkQWZ0ZXJSZWFkeSB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgZW1pdHRlZFJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZG9uZUxvb3BpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIEFzeW5jLndoaWxzdChcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuICFkb25lTG9vcGluZzsgfSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbihuZXh0SXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZmV0Y2goZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlcmF0aW9uKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGF0Y2hTdGF0ZSA9IGpvYi5wcm9wZXJ0aWVzKCkuZGlzcGF0Y2hTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3RSZWFkeSA9IGRpc3BhdGNoU3RhdGUgPT09IFwiUVVFVUVEXCIgfHwgZGlzcGF0Y2hTdGF0ZSA9PT0gXCJQQVJTSU5HXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm90UmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuX3ByZXJlYWR5KGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtaXR0ZWRSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucmVhZHkoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlZFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogRG9uJ3Qga2VlcCBwb2xsaW5nIHRoZSBqb2IgaWYgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlciBvbmx5IGNhcmVzIGFib3V0IHRoZSBgcmVhZHlgIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9DYWxsYmFja3NBZnRlclJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuX3N0b3BwZWRBZnRlclJlYWR5KGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucHJvZ3Jlc3Moam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBqb2IucHJvcGVydGllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaFN0YXRlID09PSBcIkRPTkVcIiAmJiBwcm9wcy5pc0RvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmRvbmUoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZXJhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpc3BhdGNoU3RhdGUgPT09IFwiRkFJTEVEXCIgJiYgcHJvcHMuaXNGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZhaWxlZChqb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxvb3BpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jLnNsZWVwKHBlcmlvZCwgbmV4dEl0ZXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzdW1lcyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IudW5wYXVzZShmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgVU5QQVVTRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHVucGF1c2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwidW5wYXVzZVwifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBzZWFyY2ggam9icy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgc2VhcmNoIFxuICAgICAqIGpvYnMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgc2VhcmNoIGpvYi5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9ic1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuSm9icyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmpvYnM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgbmV3IGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSm9ifSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Kb2JgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9ic1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgc2lkID0gcHJvcHMuY29udGVudC5zaWQ7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkpvYih0aGlzLnNlcnZpY2UsIHNpZCwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuSm9ic2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYnN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9ic1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5jcmVhdGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2VhcmNoIGpvYiB3aXRoIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYGV4ZWNfbW9kZWAgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBzZWFyY2g6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9bm9ybWFsYCB0byByZXR1cm4gYSBzZWFyY2ggam9iIElEIGltbWVkaWF0ZWx5IChkZWZhdWx0KS5cbiAgICAgICAgICogICAgICBQb2xsIGZvciBjb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4geW91IGNhbiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0cy4gXG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9YmxvY2tpbmdgIHRvIHJldHVybiB0aGUgc2VhcmNoIGpvYiBJRCB3aGVuIHRoZSBzZWFyY2ggaGFzIGZpbmlzaGVkLlxuICAgICAgICAgKiBcbiAgICAgICAgICogVG8gcnVuIGEgb25lc2hvdCBzZWFyY2gsIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBidXQgcmF0aGVyIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHRzLCB1c2UgYFNlcnZpY2UuSm9icy5vbmVzaG90U2VhcmNoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBzZWFyY2ggam9iLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGNyZWF0ZWQgam9iOiBgKGVyciwgY3JlYXRlZEpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24ocXVlcnksIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbGVkIHVzIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUgb2YgKHBhcmFtcywgY2FsbGJhY2spLFxuICAgICAgICAgICAgLy8gbGV0cyBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChxdWVyeSkgJiYgdXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHF1ZXJ5O1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcGFyYW1zLnNlYXJjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IHF1ZXJ5OyBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKChwYXJhbXMuZXhlY19tb2RlIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwib25lc2hvdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHVzZSBzcGx1bmtqcy5TZXJ2aWNlLkpvYnMub25lc2hvdFNlYXJjaCBmb3IgZXhlY19tb2RlPW9uZXNob3RcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKFwiTXVzdCBwcm92aWRlIGEgcXVlcnkgdG8gY3JlYXRlIGEgc2VhcmNoIGpvYlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdChcIlwiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgam9iID0gbmV3IHJvb3QuSm9iKHRoYXQuc2VydmljZSwgcmVzcG9uc2UuZGF0YS5zaWQsIHRoYXQubmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgam9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzZWFyY2ggam9iIHdpdGggYSBnaXZlbiBzZWFyY2ggcXVlcnkgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBgZXhlY19tb2RlYCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHNlYXJjaDpcbiAgICAgICAgICpcbiAgICAgICAgICogICAgLSBVc2UgYGV4ZWNfbW9kZT1ub3JtYWxgIHRvIHJldHVybiBhIHNlYXJjaCBqb2IgSUQgaW1tZWRpYXRlbHkgKGRlZmF1bHQpLlxuICAgICAgICAgKiAgICAgIFBvbGwgZm9yIGNvbXBsZXRpb24gdG8gZmluZCBvdXQgd2hlbiB5b3UgY2FuIHJldHJpZXZlIHNlYXJjaCByZXN1bHRzLiBcbiAgICAgICAgICpcbiAgICAgICAgICogICAgLSBVc2UgYGV4ZWNfbW9kZT1ibG9ja2luZ2AgdG8gcmV0dXJuIHRoZSBzZWFyY2ggam9iIElEIHdoZW4gdGhlIHNlYXJjaCBoYXMgZmluaXNoZWQuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBUbyBydW4gYSBvbmVzaG90IHNlYXJjaCwgd2hpY2ggZG9lcyBub3QgY3JlYXRlIGEgam9iIGJ1dCByYXRoZXIgcmV0dXJucyB0aGUgc2VhcmNoIHJlc3VsdHMsIHVzZSBgU2VydmljZS5Kb2JzLm9uZXNob3RTZWFyY2hgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2JzID0gc2VydmljZS5qb2JzKCk7XG4gICAgICAgICAqICAgICAgam9icy5zZWFyY2goXCJzZWFyY2ggRVJST1JcIiwge2lkOiBcIm15am9iXzEyM1wifSwgZnVuY3Rpb24oZXJyLCBuZXdKb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCI6IG5ld0pvYi5zaWQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiAgICAgICAgKipOb3RlOioqIFRoaXMgbWV0aG9kIHRocm93cyBhbiBlcnJvciBpZiB0aGUgYGV4ZWNfbW9kZT1vbmVzaG90YCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIHdpdGggdGhlIHByb3BlcnRpZXMgZGljdGlvbmFyeS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBzZWFyY2ggam9iOiBgKGVyciwgY3JlYXRlZEpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIHNlYXJjaDogZnVuY3Rpb24ocXVlcnksIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShxdWVyeSwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgb25lc2hvdCBzZWFyY2ggZnJvbSBhIGdpdmVuIHNlYXJjaCBxdWVyeSBhbmQgcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9icyA9IHNlcnZpY2Uuam9icygpO1xuICAgICAgICAgKiAgICAgIGpvYnMub25lc2hvdFNlYXJjaChcInNlYXJjaCBFUlJPUlwiLCB7aWQ6IFwibXlqb2JfMTIzXCJ9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJSRVNVTFQgRklFTERTXCI6IHJlc3VsdHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuIFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoOlxuICAgICAgICAgKiAgICAtIGBvdXRwdXRfbW9kZWAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSByZXN1bHRzIChYTUwsIEpTT04sIG9yIENTVikuXG4gICAgICAgICAqICAgIC0gYGVhcmxpZXN0X3RpbWVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgZWFybGllc3QgdGltZSBpbiB0aGUgdGltZSByYW5nZSB0byBzZWFyY2guIFRoZSB0aW1lIHN0cmluZyBjYW4gYmUgYSBVVEMgdGltZSAod2l0aCBmcmFjdGlvbmFsIHNlY29uZHMpLCBhIHJlbGF0aXZlIHRpbWUgc3BlY2lmaWVyICh0byBub3cpLCBvciBhIGZvcm1hdHRlZCB0aW1lIHN0cmluZy5cbiAgICAgICAgICogICAgLSBgbGF0ZXN0X3RpbWVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgbGF0ZXN0IHRpbWUgaW4gdGhlIHRpbWUgcmFuZ2UgdG8gc2VhcmNoLiBUaGUgdGltZSBzdHJpbmcgY2FuIGJlIGEgVVRDIHRpbWUgKHdpdGggZnJhY3Rpb25hbCBzZWNvbmRzKSwgYSByZWxhdGl2ZSB0aW1lIHNwZWNpZmllciAodG8gbm93KSwgb3IgYSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXG4gICAgICAgICAqICAgIC0gYHJmYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgb25lIG9yIG1vcmUgZmllbGRzIHRvIGFkZCB0byB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoOiBgKGVyciwgcmVzdWx0cylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIG9uZXNob3RTZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QocXVlcnkpICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHBhcmFtcy5zZWFyY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSBxdWVyeTsgXG4gICAgICAgICAgICBwYXJhbXMuZXhlY19tb2RlID0gXCJvbmVzaG90XCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKFwiTXVzdCBwcm92aWRlIGEgcXVlcnkgdG8gY3JlYXRlIGEgc2VhcmNoIGpvYlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG91dHB1dE1vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLnF1YWxpZmllZFBhdGg7XG4gICAgICAgICAgICB2YXIgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgdmFyIHBvc3QgPSBwYXJhbXM7XG4gICAgICAgICAgICB2YXIgZ2V0ID0ge291dHB1dF9tb2RlOiBvdXRwdXRNb2RlfTtcbiAgICAgICAgICAgIHZhciBib2R5ID0gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMuc2VydmljZS5yZXF1ZXN0KFxuICAgICAgICAgICAgICAgIHBhdGgsIFxuICAgICAgICAgICAgICAgIG1ldGhvZCwgXG4gICAgICAgICAgICAgICAgZ2V0LCBcbiAgICAgICAgICAgICAgICBwb3N0LCBcbiAgICAgICAgICAgICAgICBib2R5LCBcbiAgICAgICAgICAgICAgICBoZWFkZXJzLCBcbiAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBmaWVsZCBvZiBhIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIGBEYXRhTW9kZWxDYWxjdWxhdGlvbmBcbiAgICAgKiBhbmQgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICpcbiAgICAgKiBIYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKiAgICAtIGBmaWVsZE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoaXMgZmllbGQuXG4gICAgICogICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6ICBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQuXG4gICAgICogICAgLSBgdHlwZWAgKF9zdHJpbmdfKTogVGhlIHR5cGUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKiAgICAtIGBtdWx0aXZhbHVlZGAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBtdWx0aXZhbHVlZC5cbiAgICAgKiAgICAtIGByZXF1aXJlZGAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cbiAgICAgKiAgICAtIGBoaWRkZW5gIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIGRhdGEgbW9kZWwgVUkuXG4gICAgICogICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZC5cbiAgICAgKiAgICAtIGBjb21tZW50YCAoX3N0cmluZ18pOiBBIGNvbW1lbnQgZm9yIHRoaXMgZmllbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBpc24ndCBvbmUuXG4gICAgICogICAgLSBgZmllbGRTZWFyY2hgIChfc3RyaW5nXyk6IEEgc2VhcmNoIHF1ZXJ5IGZyYWdtZW50IGZvciB0aGlzIGZpZWxkLlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogQW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiB0aGUgbGluZWFnZSBvZiB0aGUgZGF0YSBtb2RlbFxuICAgICAqICAgICAgICAgIG9uIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC5cbiAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHR5cGVzIGZvciBhIGRhdGEgbW9kZWwgZmllbGQ6XG4gICAgICogICAgLSBgc3RyaW5nYFxuICAgICAqICAgIC0gYGJvb2xlYW5gXG4gICAgICogICAgLSBgbnVtYmVyYFxuICAgICAqICAgIC0gYHRpbWVzdGFtcGBcbiAgICAgKiAgICAtIGBvYmplY3RDb3VudGBcbiAgICAgKiAgICAtIGBjaGlsZENvdW50YFxuICAgICAqICAgIC0gYGlwdjRgXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsRmllbGQgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICBfdHlwZXM6IFsgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJ0aW1lc3RhbXBcIiwgXCJvYmplY3RDb3VudFwiLCBcImNoaWxkQ291bnRcIiwgXCJpcHY0XCIsIFwiYm9vbGVhblwiXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBmaWVsZC5cbiAgICAgICAgICogU0RLIHVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAgLSBgZmllbGROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGlzIGZpZWxkLlxuICAgICAgICAgKiAgICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZC5cbiAgICAgICAgICogICAgIC0gYHR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgZmllbGQsIHNlZSB2YWxpZCB0eXBlcyBpbiBjbGFzcyBkb2NzLlxuICAgICAgICAgKiAgICAgLSBgbXVsdGl2YWx1ZWAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBtdWx0aXZhbHVlZC5cbiAgICAgICAgICogICAgIC0gYHJlcXVpcmVkYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9uIGV2ZW50cyBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAqICAgICAtIGBoaWRkZW5gIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIGRhdGEgbW9kZWwgVUkuXG4gICAgICAgICAqICAgICAtIGBlZGl0YWJsZWAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gYmUgZWRpdGVkLlxuICAgICAgICAgKiAgICAgLSBgY29tbWVudGAgKF9zdHJpbmdfKTogQSBjb21tZW50IGZvciB0aGlzIGZpZWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAgICAgKiAgICAgLSBgZmllbGRTZWFyY2hgIChfc3RyaW5nXyk6IEEgc2VhcmNoIHF1ZXJ5IGZyYWdtZW50IGZvciB0aGlzIGZpZWxkLlxuICAgICAgICAgKiAgICAgLSBgbGluZWFnZWAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgZmllbGRcbiAgICAgICAgICogICAgICAgICAgaXMgZGVmaW5lZCwgaXRlbXMgYXJlIGRlbGltaXRlZCBieSBhIGRvdC4gVGhpcyBpcyBjb252ZXJ0ZWQgaW50byBhbiBhcnJheSBvZlxuICAgICAgICAgKiAgICAgICAgICBzdHJpbmdzIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgICAgICAgICAgcHJvcHMub3duZXIgPSBwcm9wcy5vd25lciB8fCBcIlwiO1xuXG4gICAgICAgICAgICB0aGlzLm5hbWUgICAgICAgICAgID0gcHJvcHMuZmllbGROYW1lO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSAgICA9IHByb3BzLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdGhpcy50eXBlICAgICAgICAgICA9IHByb3BzLnR5cGU7XG4gICAgICAgICAgICB0aGlzLm11bHRpdmFsdWVkICAgID0gcHJvcHMubXVsdGl2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWQgICAgICAgPSBwcm9wcy5yZXF1aXJlZDtcbiAgICAgICAgICAgIHRoaXMuaGlkZGVuICAgICAgICAgPSBwcm9wcy5oaWRkZW47XG4gICAgICAgICAgICB0aGlzLmVkaXRhYmxlICAgICAgID0gcHJvcHMuZWRpdGFibGU7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgICAgICAgID0gcHJvcHMuY29tbWVudCB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlYXJjaCAgICA9IHByb3BzLmZpZWxkU2VhcmNoO1xuICAgICAgICAgICAgdGhpcy5saW5lYWdlICAgICAgICA9IHByb3BzLm93bmVyLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICAgIHRoaXMub3duZXIgICAgICAgICAgPSB0aGlzLmxpbmVhZ2VbdGhpcy5saW5lYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBzdHJpbmc/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIG51bWJlcj9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgZmllbGQgaXMgb2YgdHlwZSBudW1iZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNOdW1iZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgdGltZXN0YW1wP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIHRpbWVzdGFtcC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc1RpbWVzdGFtcDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0aW1lc3RhbXBcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBvYmplY3QgY291bnQ/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGNvdW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2JqZWN0Y291bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0Q291bnRcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBjaGlsZCBjb3VudD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgZmllbGQgaXMgb2YgdHlwZSBjaGlsZCBjb3VudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc0NoaWxkY291bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiY2hpbGRDb3VudFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIGlwdjQ/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgaXB2NC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc0lQdjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiaXB2NFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIGJvb2xlYW4/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgYm9vbGVhbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc0Jvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYm9vbGVhblwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29uc3RyYWludCBvbiBhIGBEYXRhTW9kZWxPYmplY3RgIG9yIGEgYERhdGFNb2RlbEZpZWxkYC5cbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYHF1ZXJ5YCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IGRlZmluaW5nIHRoaXMgZGF0YSBtb2RlbCBjb25zdHJhaW50LlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogVGhlIGxpbmVhZ2Ugb2YgdGhpcyBkYXRhIG1vZGVsIGNvbnN0cmFpbnQuXG4gICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCB0aGF0IG93bnNcbiAgICAgKiAgICAgICAgICB0aGlzIGRhdGEgbW9kZWwgY29uc3RyYWludC5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENvbnN0cmFpbnRcbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbENvbnN0cmFpbnQgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBjb25zdHJhaW50LlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byBzZXQ6XG4gICAgICAgICAqICAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgc2VhcmNoIHF1ZXJ5IHRoaXMgY29uc3RyYWludCBzcGVjaWZpZXMuXG4gICAgICAgICAqICAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHRoYXQgb3ducyB0aGlzXG4gICAgICAgICAqICAgICAgICAgIGNvbnN0cmFpbnQsIGl0ZW1zIGFyZSBkZWxpbWl0ZWQgYnkgYSBkb3QuIFRoaXMgaXMgY29udmVydGVkIGludG9cbiAgICAgICAgICogICAgICAgICAgYW4gYXJyYXkgb2Ygc3RyaW5ncyB1cG9uIGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENvbnN0cmFpbnRcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgICAgICAgICAgcHJvcHMub3duZXIgPSBwcm9wcy5vd25lciB8fCBcIlwiO1xuXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5ICAgPSBwcm9wcy5zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLmxpbmVhZ2UgPSBwcm9wcy5vd25lci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB0aGlzLm93bmVyICAgPSB0aGlzLmxpbmVhZ2VbdGhpcy5saW5lYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogVXNlZCBmb3Igc3BlY2lmeWluZyBhIGNhbGN1bGF0aW9uIG9uIGEgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICpcbiAgICAgKiBIYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKiAgICAtIGBpZGAgKF9zdHJpbmdfKTogVGhlIElEIGZvciB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24uXG4gICAgICogICAgLSBgdHlwZWAgKF9zdHJpbmdfKTogVGhlIHR5cGUgb2YgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLlxuICAgICAqICAgIC0gYGNvbW1lbnRgIChfc3RyaW5nX3xfbnVsbF8pOiBUaGUgY29tbWVudCBmb3IgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLCBvciBgbnVsbGAuXG4gICAgICogICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBUcnVlIGlmIHRoaXMgY2FsY3VsYXRpb24gY2FuIGJlIGVkaXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgY2FsY3VsYXRpb25cbiAgICAgKiAgICAgICAgICBpcyBkZWZpbmVkIGluIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBkYXRhIG1vZGVsIHRoYXQgdGhpcyBjYWxjdWxhdGlvbiBiZWxvbmdzIHRvLlxuICAgICAqICAgIC0gYG91dHB1dEZpZWxkc2AgKF9hcnJheV8pOiBUaGUgZmllbGRzIG91dHB1dCBieSB0aGlzIGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIFJleCBhbmQgRXZhbCB0eXBlcyBoYXZlIGFuIGFkZGl0aW9uYWwgcHJvcGVydHk6XG4gICAgICogICAgLSBgZXhwcmVzc2lvbmAgKF9zdHJpbmdfKTogVGhlIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGlzIGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIFJleCBhbmQgR2VvSVAgdHlwZXMgaGF2ZSBhbiBhZGRpdGlvbmFsIHByb3BlcnR5OlxuICAgICAqICAgIC0gYGlucHV0RmllbGRgIChfc3RyaW5nXyk6IFRoZSBmaWVsZCB0byB1c2UgZm9yIGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIExvb2t1cCB0eXBlIGhhcyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgbG9va3VwTmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhlIGxvb2t1cCB0byBwZXJmb3JtLlxuICAgICAqICAgIC0gYGlucHV0RmllbGRNYXBwaW5nc2AgKF9vYmplY3RfKTogVGhlIG1hcHBpbmdzIGZyb20gZmllbGRzIGluIHRoZSBldmVudHMgdG8gZmllbGRzIGluIHRoZSBsb29rdXAuXG4gICAgICpcbiAgICAgKiBWYWxpZCB0eXBlcyBvZiBjYWxjdWxhdGlvbnMgYXJlOlxuICAgICAqICAgIC0gYExvb2t1cGBcbiAgICAgKiAgICAtIGBFdmFsYFxuICAgICAqICAgIC0gYEdlb0lQYFxuICAgICAqICAgIC0gYFJleGBcbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICovXG4gICAgcm9vdC5EYXRhTW9kZWxDYWxjdWxhdGlvbiA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIF90eXBlczogW1wiTG9va3VwXCIsIFwiRXZhbFwiLCBcIkdlb0lQXCIsIFwiUmV4XCJdLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byBzZXQ6XG4gICAgICAgICAqICAgICAtIGBjYWxjdWxhdGlvbklEYCAoX3N0cmluZ18pOiBUaGUgSUQgb2YgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgICAgICogICAgIC0gYGNhbGN1bGF0aW9uVHlwZWAgKF9zdHJpbmdfKTogVGhlIHR5cGUgb2YgdGhpcyBjYWxjdWxhdGlvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiAgICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgY2FsY3VsYXRpb24gY2FuIGJlIGVkaXRlZC5cbiAgICAgICAgICogICAgIC0gYGNvbW1lbnRgIChfc3RyaW5nXyk6IEEgY29tbWVudCBmb3IgdGhpcyBjYWxjdWxhdGlvbiwgb3IgYG51bGxgIGlmIHRoZXJlIGlzbid0IG9uZS5cbiAgICAgICAgICogICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgbGluZWFnZSBvZiB0aGUgZGF0YSBtb2RlbCBvYmplY3Qgb24gd2hpY2ggdGhpcyBjYWxjdWxhdGlvblxuICAgICAgICAgKiAgICAgICAgICBpcyBkZWZpbmVkLCBpdGVtcyBhcmUgZGVsaW1pdGVkIGJ5IGEgZG90LiBUaGlzIGlzIGNvbnZlcnRlZCBpbnRvIGFuIGFycmF5IG9mXG4gICAgICAgICAqICAgICAgICAgIHN0cmluZ3MgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAqICAgICAtIGBvdXRwdXRGaWVsZHNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgdGhlIGZpZWxkcyB0aGlzIGNhbGN1bGF0aW9uIGdlbmVyYXRlcy5cbiAgICAgICAgICogICAgIC0gYGV4cHJlc3Npb25gIChfc3RyaW5nXyk6IFRoZSBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhpcyBjYWxjdWxhdGlvbjsgZXhjbHVzaXZlIHRvIGBFdmFsYCBhbmQgYFJleGAgY2FsY3VsYXRpb25zIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYGlucHV0RmllbGRgIChfc3RyaW5nXyk6IFRoZSBmaWVsZCB0byB1c2UgZm9yIGNhbGN1bGF0aW9uOyBleGNsdXNpdmUgdG8gYEdlb0lQYCBhbmQgYFJleGAgY2FsY3VsYXRpb25zIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYGxvb2t1cE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBsb29rdXAgdG8gcGVyZm9ybTsgZXhjbHVzaXZlIHRvIGBMb29rdXBgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBpbnB1dEZpZWxkTWFwcGluZ3NgIChfYXJyYXlfKTogT25lIGVsZW1lbnQgYXJyYXkgY29udGFpbmluZyBhbiBvYmplY3Qgd2l0aCB0aGUgbWFwcGluZ3MgZnJvbSBmaWVsZHMgaW4gdGhlIGV2ZW50cyB0byBmaWVsZHNcbiAgICAgICAgICogICAgICAgICBpbiB0aGUgbG9va3VwOyBleGNsdXNpdmUgdG8gYExvb2t1cGAgY2FsY3VsYXRpb25zIChvcHRpb25hbClcbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIHByb3BzLm93bmVyID0gcHJvcHMub3duZXIgfHwgXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5pZCAgICAgICAgICAgICA9IHByb3BzLmNhbGN1bGF0aW9uSUQ7XG4gICAgICAgICAgICB0aGlzLnR5cGUgICAgICAgICAgID0gcHJvcHMuY2FsY3VsYXRpb25UeXBlO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50ICAgICAgICA9IHByb3BzLmNvbW1lbnQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGUgICAgICAgPSBwcm9wcy5lZGl0YWJsZTtcbiAgICAgICAgICAgIHRoaXMubGluZWFnZSAgICAgICAgPSBwcm9wcy5vd25lci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB0aGlzLm93bmVyICAgICAgICAgID0gdGhpcy5saW5lYWdlW3RoaXMubGluZWFnZS5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgdGhpcy5vdXRwdXRGaWVsZHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMub3V0cHV0RmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRGaWVsZHNbcHJvcHMub3V0cHV0RmllbGRzW2ldLmZpZWxkTmFtZV0gPSBuZXcgcm9vdC5EYXRhTW9kZWxGaWVsZChwcm9wcy5vdXRwdXRGaWVsZHNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJFdmFsXCIgPT09IHRoaXMudHlwZSB8fCBcIlJleFwiID09PSB0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBwcm9wcy5leHByZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiR2VvSVBcIiA9PT0gdGhpcy50eXBlIHx8IFwiUmV4XCIgPT09IHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGaWVsZCA9IHByb3BzLmlucHV0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJMb29rdXBcIiA9PT0gdGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb29rdXBOYW1lID0gcHJvcHMubG9va3VwTmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RmllbGRNYXBwaW5ncyA9IHByb3BzLmxvb2t1cElucHV0c1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIG9mIG91dHB1dCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgb2Ygb3V0cHV0IGZpZWxkIG5hbWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIG91dHB1dEZpZWxkTmFtZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMub3V0cHV0RmllbGRzKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGVkaXRhYmxlP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBpcyBlZGl0YWJsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc0VkaXRhYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZWRpdGFibGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBvZiB0eXBlIGxvb2t1cD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgb2YgdHlwZSBsb29rdXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaXNMb29rdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTG9va3VwXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIG9mIHR5cGUgZXZhbD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgb2YgdHlwZSBldmFsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzRXZhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJFdmFsXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gb2YgdHlwZSBSZXg/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGlzIG9mIHR5cGUgUmV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzUmV4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlJleFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBvZiB0eXBlIEdlb0lQP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBpcyBvZiB0eXBlIEdlb0lQLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzR2VvSVA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiR2VvSVBcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUGl2b3QgcmVwcmVzZW50cyBkYXRhIGFib3V0IGEgcGl2b3QgcmVwb3J0IHJldHVybmVkIGJ5IHRoZSBTcGx1bmsgU2VydmVyLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgc2VydmljZWAgKF9zcGx1bmtqcy5TZXJ2aWNlXyk6IEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAqICAgIC0gYHNlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBzdHJpbmcgZm9yIHJ1bm5pbmcgdGhlIHBpdm90IHJlcG9ydC5cbiAgICAgKiAgICAtIGBkcmlsbGRvd25TZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggZm9yIHJ1bm5pbmcgdGhpcyBwaXZvdCByZXBvcnQgdXNpbmcgZHJpbGxkb3duLlxuICAgICAqICAgIC0gYG9wZW5JblNlYXJjaGAgKF9zdHJpbmdfKTogRXF1aXZhbGVudCB0byBzZWFyY2ggcGFyYW1ldGVyLCBidXQgbGlzdGVkIG1vcmUgc2ltcGx5LlxuICAgICAqICAgIC0gYHByZXR0eVF1ZXJ5YCAoX3N0cmluZ18pOiBFcXVpdmFsZW50IHRvIGBvcGVuSW5TZWFyY2hgLlxuICAgICAqICAgIC0gYHBpdm90U2VhcmNoYCAoX3N0cmluZ18pOiBBIHBpdm90IHNlYXJjaCBjb21tYW5kIGJhc2VkIG9uIHRoZSBuYW1lZCBkYXRhIG1vZGVsLlxuICAgICAqICAgIC0gYHRzdGF0c1NlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBmb3IgcnVubmluZyB0aGlzIHBpdm90IHJlcG9ydCB1c2luZyB0c3RhdHMuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5QaXZvdFxuICAgICAqL1xuICAgIHJvb3QuUGl2b3QgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgcGl2b3QuXG4gICAgICAgICAqIFNESyB1c2VycyBhcmUgbm90IGV4cGVjdGVkIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggc3RyaW5nIGZvciBydW5uaW5nIHRoZSBwaXZvdCByZXBvcnQuXG4gICAgICAgICAqICAgIC0gYGRyaWxsZG93bl9zZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggZm9yIHJ1bm5pbmcgdGhpcyBwaXZvdCByZXBvcnQgdXNpbmcgZHJpbGxkb3duLlxuICAgICAgICAgKiAgICAtIGBvcGVuX2luX3NlYXJjaGAgKF9zdHJpbmdfKTogRXF1aXZhbGVudCB0byBzZWFyY2ggcGFyYW1ldGVyLCBidXQgbGlzdGVkIG1vcmUgc2ltcGx5LlxuICAgICAgICAgKiAgICAtIGBwaXZvdF9zZWFyY2hgIChfc3RyaW5nXyk6IEEgcGl2b3Qgc2VhcmNoIGNvbW1hbmQgYmFzZWQgb24gdGhlIG5hbWVkIGRhdGEgbW9kZWwuXG4gICAgICAgICAqICAgIC0gYHRzdGF0c19zZWFyY2hgIChfc3RyaW5nX3xfbnVsbF8pOiBUaGUgc2VhcmNoIGZvciBydW5uaW5nIHRoaXMgcGl2b3QgcmVwb3J0IHVzaW5nIHRzdGF0cywgbnVsbCBpZiBhY2NlbGVyYXRpb24gaXMgZGlzYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaCA9IHByb3BzLnNlYXJjaDtcbiAgICAgICAgICAgIHRoaXMuZHJpbGxkb3duU2VhcmNoID0gcHJvcHMuZHJpbGxkb3duX3NlYXJjaDtcbiAgICAgICAgICAgIHRoaXMucHJldHR5UXVlcnkgPSB0aGlzLm9wZW5JblNlYXJjaCA9IHByb3BzLm9wZW5faW5fc2VhcmNoO1xuICAgICAgICAgICAgdGhpcy5waXZvdFNlYXJjaCA9IHByb3BzLnBpdm90X3NlYXJjaDtcbiAgICAgICAgICAgIHRoaXMudHN0YXRzU2VhcmNoID0gcHJvcHMudHN0YXRzX3NlYXJjaCB8fCBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnJ1biA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5ydW4pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydHMgYSBzZWFyY2ggam9iIHJ1bm5pbmcgdGhpcyBwaXZvdCwgYWNjZWxlcmF0ZWQgaWYgcG9zc2libGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYiAob3B0aW9uYWwpLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogICAgICAgICoqTm90ZToqKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBleGVjX21vZGU9b25lc2hvdGAgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBwcm9wZXJ0aWVzIGRpY3Rpb25hcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUgY3JlYXRpbmcgdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90XG4gICAgICAgICAqL1xuICAgICAgICBydW46IGZ1bmN0aW9uKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhcmdzO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXJncyB8fCBPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhcmdzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRzdGF0cyBpcyB1bmRlZmluZWQsIHVzZSBwaXZvdFNlYXJjaCAodHJ5IHRvIHJ1biBhbiBhY2NlbGVyYXRlZCBzZWFyY2ggaWYgcG9zc2libGUpXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2VhcmNoKHRoaXMudHN0YXRzU2VhcmNoIHx8IHRoaXMucGl2b3RTZWFyY2gsIGFyZ3MsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUGl2b3RTcGVjaWZpY2F0aW9uIHJlcHJlc2VudHMgYSBwaXZvdCB0byBiZSBkb25lIG9uIGEgcGFydGljdWxhciBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgKiBUaGUgdXNlciBjcmVhdGVzIGEgUGl2b3RTcGVjaWZpY2F0aW9uIG9uIHNvbWUgZGF0YSBtb2RlbCBvYmplY3QsIGFkZHMgZmlsdGVycywgcm93IHNwbGl0cyxcbiAgICAgKiBjb2x1bW4gc3BsaXRzLCBhbmQgY2VsbCB2YWx1ZXMsIHRoZW4gY2FsbHMgdGhlIHBpdm90IG1ldGhvZCB0byBxdWVyeSBzcGx1bmtkIGFuZFxuICAgICAqIGdldCBhIHNldCBvZiBTUEwgcXVlcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIENhbGwgdGhlIGBwaXZvdGAgbWV0aG9kIHRvIHF1ZXJ5IFNwbHVuayBmb3IgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHBpdm90LlxuICAgICAqXG4gICAgICogVGhpcyBjbGFzcyBzdXBwb3J0cyBhIGZsdWVudCBBUEksIGVhY2ggZnVuY3Rpb24gZXhjZXB0IGBpbml0YCwgYHRvSnNvbk9iamVjdGAgJiBgcGl2b3RgXG4gICAgICogcmV0dXJuIHRoZSBtb2RpZmllZCBgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25gIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICogICAgICAgICB2YXIgc2VhcmNoZXMgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAqICAgICAgICAgdmFyIHBpdm90U3BlY2lmaWNhdGlvbiA9IHNlYXJjaGVzLmNyZWF0ZVBpdm90U3BlY2lmaWNhdGlvbigpO1xuICAgICAqICAgICAgICAgcGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICogICAgICAgICAgICAgLmFkZFJvd1NwbGl0KFwidXNlclwiLCBcIkV4ZWN1dGluZyB1c2VyXCIpXG4gICAgICogICAgICAgICAgICAgLmFkZFJhbmdlQ29sdW1uU3BsaXQoXCJleGVjX3RpbWVcIiwge2xpbWl0OiA0fSlcbiAgICAgKiAgICAgICAgICAgICAuYWRkQ2VsbFZhbHVlKFwic2VhcmNoXCIsIFwiU2VhcmNoIFF1ZXJ5XCIsIFwidmFsdWVzXCIpXG4gICAgICogICAgICAgICAgICAgLnBpdm90KGZ1bmN0aW9uKGVyciwgcGl2b3QpIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHb3QgYSBQaXZvdCBvYmplY3QgZnJvbSB0aGUgU3BsdW5rIHNlcnZlciFcIik7XG4gICAgICogICAgICAgICAgICAgfSk7XG4gICAgICogICAgIH0pO1xuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZGF0YU1vZGVsT2JqZWN0YCAoX3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0Xyk6IFRoZSBgRGF0YU1vZGVsT2JqZWN0YCBmcm9tIHdoaWNoXG4gICAgICogICAgICAgIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAgd2FzIGNyZWF0ZWQuXG4gICAgICogICAgLSBgY29sdW1uc2AgKF9hcnJheV8pOiBUaGUgY29sdW1uIHNwbGl0cyBvbiB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAqICAgIC0gYHJvd3NgIChfYXJyYXlfKTogVGhlIHJvdyBzcGxpdHMgb24gdGhpcyBgUGl2b3RTcGVjaWZpY2F0aW9uYC5cbiAgICAgKiAgICAtIGBmaWx0ZXJzYCAoX2FycmF5Xyk6IFRoZSBmaWx0ZXJzIG9uIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICogICAgLSBgY2VsbHNgIChfYXJyYXlfKTogVGhlIGNlbGwgYWdncmVnYXRpb25zIGZvciB0aGlzYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICogICAgLSBgYWNjZWxlcmF0aW9uTmFtZXNwYWNlYCAoX3N0cmluZ198X251bGxfKTogVGhlIG5hbWUgb2YgdGhlIGBEYXRhTW9kZWxgIHRoYXQgb3ducyB0aGUgYERhdGFNb2RlbE9iamVjdGBcbiAgICAgKiAgICAgICAgb24gd2hpY2ggdGhpcyBgUGl2b3RTcGVjaWZpY2F0aW9uYCB3YXMgY3JlYXRlZCBpZiB0aGUgYERhdGFNb2RlbGAgaXMgYWNjZWxlcmF0ZWQuIEFsdGVybmF0aXZlbHksXG4gICAgICogICAgICAgIHlvdSBjYW4gc2V0IHRoaXMgcHJvcGVydHkgbWFudWFsbHkgdG8gdGhlIHNpZCBvZiBhbiBhY2NlbGVyYXRpb24gam9iIGluIHRoZSBmb3JtYXQgYHNpZD08c2lkPmAuXG4gICAgICpcbiAgICAgKiBWYWxpZCBjb21wYXJpc29uIHR5cGVzIGFyZTpcbiAgICAgKiAgICAtIGBib29sZWFuYFxuICAgICAqICAgIC0gYHN0cmluZ2BcbiAgICAgKiAgICAtIGBudW1iZXJgXG4gICAgICogICAgLSBgaXB2NGBcbiAgICAgKlxuICAgICAqIFZhbGlkIGJvb2xlYW4gY29tcGFyaXNvbnMgYXJlOlxuICAgICAqICAgIC0gYD1gXG4gICAgICogICAgLSBgaXNgXG4gICAgICogICAgLSBgaXNOdWxsYFxuICAgICAqICAgIC0gYGlzTm90TnVsbGBcbiAgICAgKlxuICAgICAqIFZhbGlkIHN0cmluZyBjb21wYXJpc29ucyBhcmU6XG4gICAgICogICAgLSBgPWBcbiAgICAgKiAgICAtIGBpc2BcbiAgICAgKiAgICAtIGBpc051bGxgXG4gICAgICogICAgLSBgaXNOb3ROdWxsYFxuICAgICAqICAgIC0gYGNvbnRhaW5zYFxuICAgICAqICAgIC0gYGRvZXNOb3RDb250YWluYFxuICAgICAqICAgIC0gYHN0YXJ0c1dpdGhgXG4gICAgICogICAgLSBgZW5kc1dpdGhgXG4gICAgICogICAgLSBgcmVnZXhgXG4gICAgICpcbiAgICAgKiBWYWxpZCBudW1iZXIgY29tcGFyaXNvbnMgYXJlOlxuICAgICAqICAgIC0gYD1gXG4gICAgICogICAgLSBgIT1gXG4gICAgICogICAgLSBgPGBcbiAgICAgKiAgICAtIGA+YFxuICAgICAqICAgIC0gYDw9YFxuICAgICAqICAgIC0gYD49YFxuICAgICAqICAgIC0gYGlzYFxuICAgICAqICAgIC0gYGlzTnVsbGBcbiAgICAgKiAgICAtIGBpc05vdE51bGxgXG4gICAgICpcbiAgICAgKiBWYWxpZCBpcHY0IGNvbXBhcmlzb25zIGFyZTpcbiAgICAgKiAgICAtIGBpc2BcbiAgICAgKiAgICAtIGBpc051bGxgXG4gICAgICogICAgLSBgaXNOb3ROdWxsYFxuICAgICAqICAgIC0gYGNvbnRhaW5zYFxuICAgICAqICAgIC0gYGRvZXNOb3RDb250YWluYFxuICAgICAqICAgIC0gYHN0YXJ0c1dpdGhgXG4gICAgICpcbiAgICAgKiBWYWxpZCBiaW5uaW5nIHZhbHVlcyBhcmU6XG4gICAgICogICAgLSBgYXV0b2BcbiAgICAgKiAgICAtIGB5ZWFyYFxuICAgICAqICAgIC0gYG1vbnRoYFxuICAgICAqICAgIC0gYGRheWBcbiAgICAgKiAgICAtIGBob3VyYFxuICAgICAqICAgIC0gYG1pbnV0ZWBcbiAgICAgKiAgICAtIGBzZWNvbmRgXG4gICAgICpcbiAgICAgKiBWYWxpZCBzb3J0IGRpcmVjdGlvbnMgYXJlOlxuICAgICAqICAgIC0gYEFTQ0VORElOR2BcbiAgICAgKiAgICAtIGBERUNFTkRJTkdgXG4gICAgICogICAgLSBgREVGQVVMVGBcbiAgICAgKlxuICAgICAqIFZhbGlkIHN0YXRzIGZ1bmN0aW9ucyBhcmU6XG4gICAgICogICAgLSBgbGlzdGBcbiAgICAgKiAgICAtIGB2YWx1ZXNgXG4gICAgICogICAgLSBgZmlyc3RgXG4gICAgICogICAgLSBgbGFzdGBcbiAgICAgKiAgICAtIGBjb3VudGBcbiAgICAgKiAgICAtIGBkY2BcbiAgICAgKiAgICAtIGBzdW1gXG4gICAgICogICAgLSBgYXZlcmFnZWBcbiAgICAgKiAgICAtIGBtYXhgXG4gICAgICogICAgLSBgbWluYFxuICAgICAqICAgIC0gYHN0ZGV2YFxuICAgICAqICAgIC0gYGR1cmF0aW9uYFxuICAgICAqICAgIC0gYGVhcmxpZXN0YFxuICAgICAqICAgIC0gYGxhdGVzdGBcbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAqL1xuICAgIHJvb3QuUGl2b3RTcGVjaWZpY2F0aW9uID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgX2NvbXBhcmlzb25zOiB7XG4gICAgICAgICAgICBib29sZWFuOiBbXCI9XCIsIFwiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIl0sXG4gICAgICAgICAgICBzdHJpbmc6IFtcIj1cIiwgXCJpc1wiLCBcImlzTnVsbFwiLCBcImlzTm90TnVsbFwiLCBcImNvbnRhaW5zXCIsIFwiZG9lc05vdENvbnRhaW5cIiwgXCJzdGFydHNXaXRoXCIsIFwiZW5kc1dpdGhcIiwgXCJyZWdleFwiXSxcbiAgICAgICAgICAgIG51bWJlcjogW1wiPVwiLCBcIiE9XCIsIFwiPFwiLCBcIj5cIiwgXCI8PVwiLCBcIj49XCIsIFwiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIl0sXG4gICAgICAgICAgICBpcHY0OiBbXCJpc1wiLCBcImlzTnVsbFwiLCBcImlzTm90TnVsbFwiLCBcImNvbnRhaW5zXCIsIFwiZG9lc05vdENvbnRhaW5cIiwgXCJzdGFydHNXaXRoXCJdXG4gICAgICAgIH0sXG4gICAgICAgIF9iaW5uaW5nOiBbXCJhdXRvXCIsIFwieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiXSxcbiAgICAgICAgX3NvcnREaXJlY3Rpb246IFtcIkFTQ0VORElOR1wiLCBcIkRFU0NFTkRJTkdcIiwgXCJERUZBVUxUXCJdLFxuICAgICAgICBfc3RhdHNGdW5jdGlvbnM6IFtcImxpc3RcIiwgXCJ2YWx1ZXNcIiwgXCJmaXJzdFwiLCBcImxhc3RcIiwgXCJjb3VudFwiLCBcImRjXCIsIFwic3VtXCIsIFwiYXZlcmFnZVwiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGV2XCIsIFwiZHVyYXRpb25cIiwgXCJlYXJsaWVzdFwiLCBcImxhdGVzdFwiXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWx9IHBhcmVudERhdGFNb2RlbCBUaGUgYERhdGFNb2RlbGAgdGhhdCBvd25zIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKGRhdGFNb2RlbE9iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWxPYmplY3QgPSBkYXRhTW9kZWxPYmplY3Q7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgICAgICAgICB0aGlzLmNlbGxzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uTmFtZXNwYWNlID0gZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5pc0FjY2VsZXJhdGVkKCkgPyBcbiAgICAgICAgICAgICAgICBkYXRhTW9kZWxPYmplY3QuZGF0YU1vZGVsLm5hbWUgOiBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnJ1biAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnJ1bik7XG4gICAgICAgICAgICB0aGlzLnBpdm90ID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnBpdm90KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIGFjY2VsZXJhdGlvbiBjYWNoZSBmb3IgdGhpcyBwaXZvdCBzcGVjaWZpY2F0aW9uIHRvIGEgam9iLFxuICAgICAgICAgKiB1c3VhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVMb2NhbEFjY2VsZXJhdGlvbkpvYiBvbiBhIERhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKiBpbnN0YW5jZSwgYXMgdGhlIGFjY2VsZXJhdGlvbiBjYWNoZSBmb3IgdGhpcyBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xzcGx1bmtqcy5TZXJ2aWNlLkpvYn0gc2lkIFRoZSBzaWQgb2YgYW4gYWNjZWxlcmF0aW9uIGpvYixcbiAgICAgICAgICogICAgIG9yLCBhIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBY2NlbGVyYXRpb25Kb2I6IGZ1bmN0aW9uKHNpZCkge1xuICAgICAgICAgICAgLy8gSWYgYSBzZWFyY2ggb2JqZWN0IGlzIHBhc3NlZCBpbiwgZ2V0IGl0cyBzaWRcbiAgICAgICAgICAgIGlmIChzaWQgJiYgc2lkIGluc3RhbmNlb2YgU2VydmljZS5Kb2IpIHtcbiAgICAgICAgICAgICAgICBzaWQgPSBzaWQuc2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXNpZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpZCB0byB1c2UgZm9yIGFjY2VsZXJhdGlvbiBtdXN0IG5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY2NlbGVyYXRpb25OYW1lc3BhY2UgPSBcInNpZD1cIiArIHNpZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBmaWx0ZXIgb24gYSBib29sZWFuIHZhbHVlZCBmaWVsZC4gVGhlIGZpbHRlciB3aWxsIGJlIGEgY29uc3RyYWludCBvZiB0aGUgZm9ybVxuICAgICAgICAgKiBgZmllbGQgYGNvbXBhcmlzb25gIGNvbXBhcmVUb2AsIGZvciBleGFtcGxlOiBgaXNfcmVtb3RlID0gZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIGZpbHRlciBvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcGFyaXNvblR5cGUgVGhlIHR5cGUgb2YgY29tcGFyaXNvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcGFyaXNvbk9wIFRoZSBjb21wYXJpc29uLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgY29tcGFyaXNvbnMsIGJhc2VkIG9uIHR5cGUuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb21wYXJlVG8gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGZpZWxkIHRvLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkRmlsdGVyOiBmdW5jdGlvbihmaWVsZE5hbWUsIGNvbXBhcmlzb25UeXBlLCBjb21wYXJpc29uT3AsIGNvbXBhcmVUbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBmaWx0ZXIgb24gYSBub25leGlzdGVudCBmaWVsZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGFyaXNvblR5cGUgIT09IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSkudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3QgYWRkIFwiICsgY29tcGFyaXNvblR5cGUgKyAgXG4gICAgICAgICAgICAgICAgICAgIFwiIGZpbHRlciBvbiBcIiArIGZpZWxkTmFtZSArIFxuICAgICAgICAgICAgICAgICAgICBcIiBiZWNhdXNlIGl0IGlzIG9mIHR5cGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyh0aGlzLl9jb21wYXJpc29uc1tjb21wYXJpc29uVHlwZV0sIGNvbXBhcmlzb25PcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IGFkZCBcIiArIGNvbXBhcmlzb25UeXBlICsgXG4gICAgICAgICAgICAgICAgICAgIFwiIGZpbHRlciBiZWNhdXNlIFwiICsgY29tcGFyaXNvbk9wICtcbiAgICAgICAgICAgICAgICAgICAgXCIgaXMgbm90IGEgdmFsaWQgY29tcGFyaXNvbiBvcGVyYXRvclwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKS5saW5lYWdlLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IGNvbXBhcmlzb25UeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB0eXBlIGRlcGVuZGVudFxuICAgICAgICAgICAgaWYgKHV0aWxzLmNvbnRhaW5zKFtcImJvb2xlYW5cIiwgXCJzdHJpbmdcIiwgXCJpcHY0XCIsIFwibnVtYmVyXCJdLCByZXQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXQucnVsZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcjogY29tcGFyaXNvbk9wLFxuICAgICAgICAgICAgICAgICAgICBjb21wYXJlVG86IGNvbXBhcmVUb1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChyZXQpO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIGxpbWl0IG9uIHRoZSBldmVudHMgc2hvd24gaW4gYSBwaXZvdCBieSBzb3J0aW5nIHRoZW0gYWNjb3JkaW5nIHRvIHNvbWUgZmllbGQsIHRoZW4gdGFraW5nXG4gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgbnVtYmVyIGZyb20gdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gZmlsdGVyIG9uLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc29ydEF0dHJpYnV0ZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gdXNlIGZvciBzb3J0aW5nLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc29ydERpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgZXZlbnRzLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgdHlwZXMuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW1pdCBUaGUgbnVtYmVyIG9mIHZhbHVlcyBmcm9tIHRoZSBzb3J0ZWQgbGlzdCB0byBhbGxvdyB0aHJvdWdoIHRoaXMgZmlsdGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdHNGdW5jdGlvbiBUaGUgc3RhdHMgZnVuY3Rpb24gdG8gdXNlIGZvciBhZ2dyZWdhdGlvbiBiZWZvcmUgc29ydGluZywgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkTGltaXRGaWx0ZXI6IGZ1bmN0aW9uKGZpZWxkTmFtZSwgc29ydEF0dHJpYnV0ZSwgc29ydERpcmVjdGlvbiwgbGltaXQsIHN0YXRzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhZGQgbGltaXQgZmlsdGVyIG9uIGEgbm9uZXhpc3RlbnQgZmllbGQuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSk7XG5cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnMoW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwib2JqZWN0Q291bnRcIl0sIGYudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGxpbWl0IGZpbHRlciBvbiBcIiArIGZpZWxkTmFtZSArIFwiIGJlY2F1c2UgaXQgaXMgb2YgdHlwZSBcIiArIGYudHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09PSBmLnR5cGUgJiYgIXV0aWxzLmNvbnRhaW5zKFtcImNvdW50XCIsIFwiZGNcIl0sIHN0YXRzRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gZm9yIGZpZWxkcyBvZiB0eXBlIHN0cmluZyBtdXN0IGJlIENPVU5UIG9yIERJU1RJTkNUX0NPVU5UOyBmb3VuZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzRnVuY3Rpb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PT0gZi50eXBlICYmICF1dGlscy5jb250YWlucyhbXCJjb3VudFwiLCBcImRjXCIsIFwiYXZlcmFnZVwiLCBcInN1bVwiXSwgc3RhdHNGdW5jdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBmb3IgZmllbGRzIG9mIHR5cGUgbnVtYmVyIG11c3QgYmUgb25lIG9mIENPVU5ULCBESVNUSU5DVF9DT1VOVCwgU1VNLCBvciBBVkVSQUdFOyBmb3VuZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzRnVuY3Rpb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJvYmplY3RDb3VudFwiID09PSBmLnR5cGUgJiYgIXV0aWxzLmNvbnRhaW5zKFtcImNvdW50XCJdLCBzdGF0c0Z1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIGZvciBmaWVsZHMgb2YgdHlwZSBvYmplY3QgY291bnQgbXVzdCBiZSBDT1VOVDsgZm91bmQgXCIgKyBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGZpbHRlciA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5saW5lYWdlLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBzb3J0QXR0cmlidXRlLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU93bmVyOiB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShzb3J0QXR0cmlidXRlKS5saW5lYWdlLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgICAgIHNvcnREaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXG4gICAgICAgICAgICAgICAgbGltaXRBbW91bnQ6IGxpbWl0LFxuICAgICAgICAgICAgICAgIHN0YXRzRm46IHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBBc3N1bWVkIFwiaGlnaGVzdFwiIGlzIHByZWZlcnJlZCBmb3Igd2hlbiBzb3J0RGlyZWN0aW9uIGlzIFwiREVGQVVMVFwiXG4gICAgICAgICAgICBmaWx0ZXIubGltaXRUeXBlID0gXCJBU0NFTkRJTkdcIiA9PT0gc29ydERpcmVjdGlvbiA/IFwibG93ZXN0XCIgOiBcImhpZ2hlc3RcIjtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5wdXNoKGZpbHRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSByb3cgc3BsaXQgb24gYSBudW1lcmljIG9yIHN0cmluZyB2YWx1ZWQgZmllbGQsIHNwbGl0dGluZyBvbiBlYWNoIGRpc3RpbmN0IHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFJvd1NwbGl0OiBmdW5jdGlvbihmaWVsZE5hbWUsIGxhYmVsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyhbXCJudW1iZXJcIiwgXCJzdHJpbmdcIl0sIGYudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCBudW1iZXIgb3Igc3RyaW5nLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJvdyA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgcm93LmRpc3BsYXkgPSBcImFsbFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaChyb3cpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgcm93IHNwbGl0IG9uIGEgbnVtZXJpYyBmaWVsZCwgc3BsaXR0aW5nIGludG8gbnVtZXJpYyByYW5nZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgc3BsaXQgZ2VuZXJhdGVzIGJpbnMgd2l0aCBlZGdlcyBlcXVpdmFsZW50IHRvIHRoZVxuICAgICAgICAgKiBjbGFzc2ljIGxvb3AgJ2ZvciBpIGluIDxzdGFydD4gdG8gPGVuZD4gYnkgPHN0ZXA+JyBidXQgd2l0aCBhIG1heGltdW1cbiAgICAgICAgICogbnVtYmVyIG9mIGJpbnMgPGxpbWl0Pi4gVGhpcyBkaXNwYXRjaGVzIHRvIHRoZSBzdGF0cyBhbmQgeHlzZXJpZXMgc2VhcmNoIGNvbW1hbmRzLlxuICAgICAgICAgKiBTZWUgdGhlaXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQW4gb3B0aW9uYWwgZGljdGlvbmFyeSBvZiBjb2xsZWN0aW9uIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbiBvcHRpb25zOlxuICAgICAgICAgKiAgICAtIGBzdGFydGAgKF9pbnRlZ2VyXyk6IFRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHJhbmdlLCBvciBudWxsIHRvIHRha2UgdGhlIGxvd2VzdCB2YWx1ZSBpbiB0aGUgZXZlbnRzLlxuICAgICAgICAgKiAgICAtIGBlbmRgIChfaW50ZWdlcl8pOiBUaGUgdmFsdWUgZm9yIHRoZSBlbmQgb2YgdGhlIGxhc3QgcmFuZ2UsIG9yIG51bGwgdG8gdGFrZSB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgZXZlbnRzLlxuICAgICAgICAgKiAgICAtIGBzdGVwYCAoX2ludGVnZXJfKTogVGhlIHRoZSB3aWR0aCBvZiBlYWNoIHJhbmdlLCBvciBudWxsIHRvIGhhdmUgU3BsdW5rIGNhbGN1bGF0ZSBpdC5cbiAgICAgICAgICogICAgLSBgbGltaXRgIChfaW50ZWdlcl8pOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmFuZ2VzIHRvIHNwbGl0IGludG8sIG9yIG51bGwgZm9yIG5vIGxpbWl0LlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkUmFuZ2VSb3dTcGxpdDogZnVuY3Rpb24oZmllbGQsIGxhYmVsLCByYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgbnVtYmVyLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB1cGRhdGVSYW5nZXMgPSB7fTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLnN0YXJ0KSAmJiByYW5nZXMuc3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZXMuc3RhcnQgPSByYW5nZXMuc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5lbmQpICYmIHJhbmdlcy5lbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZXMuZW5kID0gcmFuZ2VzLmVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLnN0ZXApICYmIHJhbmdlcy5zdGVwICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLnNpemUgPSByYW5nZXMuc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLmxpbWl0KSAmJiByYW5nZXMubGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZXMubWF4TnVtYmVyT2YgPSByYW5nZXMubGltaXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLm93bmVyLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJyYW5nZXNcIixcbiAgICAgICAgICAgICAgICByYW5nZXM6IHVwZGF0ZVJhbmdlc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSByb3cgc3BsaXQgb24gYSBib29sZWFuIHZhbHVlZCBmaWVsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRydWVEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgdHJ1ZSB2YWx1ZWQgcm93IGxhYmVsLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmFsc2VEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgZmFsc2UgdmFsdWVkIHJvdyBsYWJlbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZEJvb2xlYW5Sb3dTcGxpdDogZnVuY3Rpb24oZmllbGQsIGxhYmVsLCB0cnVlRGlzcGxheVZhbHVlLCBmYWxzZURpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChcImJvb2xlYW5cIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgYm9vbGVhbi5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLm93bmVyLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgdHJ1ZUxhYmVsOiB0cnVlRGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGZhbHNlTGFiZWw6IGZhbHNlRGlzcGxheVZhbHVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIHJvdyBzcGxpdCBvbiBhIHRpbWVzdGFtcCB2YWx1ZWQgZmllbGQsIGJpbm5lZCBieSB0aGUgc3BlY2lmaWVkIGJ1Y2tldCBzaXplLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGFiZWwgQSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGlzIHNldCBvZiByb3dzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmlubmluZyBUaGUgc2l6ZSBvZiBiaW5zIHRvIHVzZSwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkVGltZXN0YW1wUm93U3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBsYWJlbCwgYmlubmluZykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChcInRpbWVzdGFtcFwiICE9PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCB0aW1lc3RhbXAuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyh0aGlzLl9iaW5uaW5nLCBiaW5uaW5nKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmlubmluZyBcIiArIGJpbm5pbmcgKyBcIiBmb3VuZC4gVmFsaWQgdmFsdWVzIGFyZTogXCIgKyB0aGlzLl9iaW5uaW5nLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLm93bmVyLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBiaW5uaW5nXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7ICAgICAgICAgICAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZWQgZmllbGQsIHByb2R1Y2luZyBhIGNvbHVtbiBmb3JcbiAgICAgICAgICogZWFjaCBkaXN0aW5jdCB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRDb2x1bW5TcGxpdDogZnVuY3Rpb24oZmllbGROYW1lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyhbXCJudW1iZXJcIiwgXCJzdHJpbmdcIl0sIGYudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCBudW1iZXIgb3Igc3RyaW5nLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbCA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb2wuZGlzcGxheSA9IFwiYWxsXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBjb2x1bW4gc3BsaXQgb24gYSBudW1lcmljIGZpZWxkLCBzcGxpdHRpbmcgdGhlIHZhbHVlcyBpbnRvIHJhbmdlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgc3RhcnRgIChfaW50ZWdlcl8pOiBUaGUgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByYW5nZSwgb3IgbnVsbCB0byB0YWtlIHRoZSBsb3dlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgZW5kYCAoX2ludGVnZXJfKTogVGhlIHZhbHVlIGZvciB0aGUgZW5kIG9mIHRoZSBsYXN0IHJhbmdlLCBvciBudWxsIHRvIHRha2UgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgc3RlcGAgKF9pbnRlZ2VyXyk6IFRoZSB0aGUgd2lkdGggb2YgZWFjaCByYW5nZSwgb3IgbnVsbCB0byBoYXZlIFNwbHVuayBjYWxjdWxhdGUgaXQuXG4gICAgICAgICAqICAgIC0gYGxpbWl0YCAoX2ludGVnZXJfKTogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJhbmdlcyB0byBzcGxpdCBpbnRvLCBvciBudWxsIGZvciBubyBsaW1pdC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFJhbmdlQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSwgcmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIG51bWJlci5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluIFNwbHVuayA2LjAuMS4xLCBkYXRhIG1vZGVscyBpbmNvcnJlY3RseSBleHBlY3Qgc3RyaW5ncyBmb3IgdGhlc2UgZmllbGRzXG4gICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIG51bWJlcnMuIEluIDYuMSwgdGhpcyBpcyBmaXhlZCBhbmQgYm90aCBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICB2YXIgdXBkYXRlZFJhbmdlcyA9IHt9O1xuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuc3RhcnQpICYmIHJhbmdlcy5zdGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWRSYW5nZXMuc3RhcnQgPSByYW5nZXMuc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5lbmQpICYmIHJhbmdlcy5lbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLmVuZCA9IHJhbmdlcy5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5zdGVwKSAmJiByYW5nZXMuc3RlcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWRSYW5nZXMuc2l6ZSA9IHJhbmdlcy5zdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMubGltaXQpICYmIHJhbmdlcy5saW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWRSYW5nZXMubWF4TnVtYmVyT2YgPSByYW5nZXMubGltaXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJyYW5nZXNcIixcbiAgICAgICAgICAgICAgICByYW5nZXM6IHVwZGF0ZWRSYW5nZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBjb2x1bW4gc3BsaXQgb24gYSBib29sZWFuIHZhbHVlZCBmaWVsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRydWVEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgdHJ1ZSB2YWx1ZWQgY29sdW1uIGxhYmVsLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmFsc2VEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgZmFsc2UgdmFsdWVkIGNvbHVtbiBsYWJlbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZEJvb2xlYW5Db2x1bW5TcGxpdDogZnVuY3Rpb24oZmllbGROYW1lLCB0cnVlRGlzcGxheVZhbHVlLCBmYWxzZURpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmIChcImJvb2xlYW5cIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgYm9vbGVhbi5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgdHJ1ZUxhYmVsOiB0cnVlRGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGZhbHNlTGFiZWw6IGZhbHNlRGlzcGxheVZhbHVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgdGltZXN0YW1wIHZhbHVlZCBmaWVsZCwgYmlubmVkIGJ5IHRoZSBzcGVjaWZpZWQgYnVja2V0IHNpemUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBiaW5uaW5nIFRoZSBzaXplIG9mIGJpbnMgdG8gdXNlLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgdHlwZXMuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRUaW1lc3RhbXBDb2x1bW5TcGxpdDogZnVuY3Rpb24oZmllbGQsIGJpbm5pbmcpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJ0aW1lc3RhbXBcIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgdGltZXN0YW1wLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnModGhpcy5fYmlubmluZywgYmlubmluZykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJpbm5pbmcgXCIgKyBiaW5uaW5nICsgXCIgZm91bmQuIFZhbGlkIHZhbHVlcyBhcmU6IFwiICsgdGhpcy5fYmlubmluZy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBiaW5uaW5nXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7ICAgICAgICAgICAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGFuIGFnZ3JlZ2F0ZSB0byBlYWNoIGNlbGwgb2YgdGhlIHBpdm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIGFnZ3JlZ2F0ZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIGEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBhZ2dyZWdhdGUuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0c0Z1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB1c2UgZm9yIGFnZ3JlZ2F0aW9uLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgc3RhdHMgZnVuY3Rpb25zLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkQ2VsbFZhbHVlOiBmdW5jdGlvbihmaWVsZE5hbWUsIGxhYmVsLCBzdGF0c0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAodXRpbHMuY29udGFpbnMoW1wic3RyaW5nXCIsIFwiaXB2NFwiXSwgZi50eXBlKSAmJlxuICAgICAgICAgICAgICAgICF1dGlscy5jb250YWlucyhbXG4gICAgICAgICAgICAgICAgICAgIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZhbHVlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImZpcnN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGFzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGNcIl0sIHN0YXRzRnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gb24gc3RyaW5nIGFuZCBJUHY0IGZpZWxkcyBtdXN0IGJlIG9uZSBvZjpcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGxpc3QsIGRpc3RpbmN0X3ZhbHVlcywgZmlyc3QsIGxhc3QsIGNvdW50LCBvciBkaXN0aW5jdF9jb3VudDsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFwibnVtYmVyXCIgPT09IGYudHlwZSAmJiBcbiAgICAgICAgICAgICAgICAhdXRpbHMuY29udGFpbnMoW1xuICAgICAgICAgICAgICAgICAgICBcInN1bVwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYXZlcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0ZGV2XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIF0sIHN0YXRzRnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gb24gbnVtYmVyIGZpZWxkIG11c3QgYmUgbXVzdCBiZSBvbmUgb2Y6XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBzdW0sIGNvdW50LCBhdmVyYWdlLCBtYXgsIG1pbiwgc3RkZXYsIGxpc3QsIG9yIGRpc3RpbmN0X3ZhbHVlczsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChcInRpbWVzdGFtcFwiID09PSBmLnR5cGUgJiZcbiAgICAgICAgICAgICAgICAhdXRpbHMuY29udGFpbnMoW1xuICAgICAgICAgICAgICAgICAgICBcImR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWFybGllc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsYXRlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwidmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgXSwgc3RhdHNGdW5jdGlvbilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBvbiB0aW1lc3RhbXAgZmllbGQgbXVzdCBiZSBvbmUgb2Y6XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBkdXJhdGlvbiwgZWFybGllc3QsIGxhdGVzdCwgbGlzdCwgb3IgZGlzdGluY3QgdmFsdWVzOyBmb3VuZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHV0aWxzLmNvbnRhaW5zKFtcIm9iamVjdENvdW50XCIsIFwiY2hpbGRDb3VudFwiXSwgZi50eXBlKSAmJlxuICAgICAgICAgICAgICAgIFwiY291bnRcIiAhPT0gc3RhdHNGdW5jdGlvblxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIG9uIGNoaWxkY291bnQgYW5kIG9iamVjdGNvdW50IGZpZWxkcyBtdXN0IGJlIGNvdW50OyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZm91bmQgXCIgKyBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFwiYm9vbGVhblwiID09PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIGJvb2xlYW4gdmFsdWVkIGZpZWxkcyBhcyBjZWxsIHZhbHVlcy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2VsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHNwYXJrbGluZTogZmFsc2UsIC8vIE5vdCBwcm9wZXJseSBpbXBsZW1lbnRlZCBpbiBjb3JlIHlldC5cbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RhdHNGdW5jdGlvblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlYWR5IG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIEpTT04gcmVhZHkgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdG9Kc29uT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YU1vZGVsOiB0aGlzLmRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwubmFtZSxcbiAgICAgICAgICAgICAgICBiYXNlQ2xhc3M6IHRoaXMuZGF0YU1vZGVsT2JqZWN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgcm93czogdGhpcy5yb3dzLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBjZWxsczogdGhpcy5jZWxscyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1ZXJ5IFNwbHVuayBmb3IgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byBhIHBpdm90IHJlcG9ydFxuICAgICAgICAgKiBmb3IgdGhpcyBkYXRhIG1vZGVsLCBkZWZpbmVkIGJ5IHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBzZWFyY2hlcyA9IGRhdGFNb2RlbHMuaXRlbShcImludGVybmFsX2F1ZGl0X2xvZ3NcIikub2JqZWN0QnlOYW1lKFwic2VhcmNoZXNcIik7XG4gICAgICAgICAqICAgICAgICAgIHZhciBwaXZvdFNwZWMgPSBzZWFyY2hlcy5jcmVhdGVQaXZvdFNwZWNpZmljYXRpb24oKTtcbiAgICAgICAgICogICAgICAgICAgLy8gVXNlIG9mIHRoZSBmbHVlbnQgQVBJXG4gICAgICAgICAqICAgICAgICAgIHBpdm90U3BlYy5hZGRSb3dTcGxpdChcInVzZXJcIiwgXCJFeGVjdXRpbmcgdXNlclwiKVxuICAgICAgICAgKiAgICAgICAgICAgICAgLmFkZFJhbmdlQ29sdW1uU3BsaXQoXCJleGVjX3RpbWVcIiwge3N0YXJ0OiAwLCBlbmQ6IDEyLCBzdGVwOiA1LCBsaW1pdDogNH0pXG4gICAgICAgICAqICAgICAgICAgICAgICAuYWRkQ2VsbFZhbHVlKFwic2VhcmNoXCIsIFwiU2VhcmNoIFF1ZXJ5XCIsIFwidmFsdWVzXCIpXG4gICAgICAgICAqICAgICAgICAgICAgICAucGl2b3QoZnVuY3Rpb24ocGl2b3RFcnIsIHBpdm90KSB7XG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQaXZvdCBzZWFyY2ggaXM6XCIsIHBpdm90LnNlYXJjaCk7XG4gICAgICAgICAqICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gZG9uZSBnZXR0aW5nIHRoZSBwaXZvdDogYChlcnIsIHBpdm90KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHBpdm90OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHN2YyA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5zZXJ2aWNlO1xuXG4gICAgICAgICAgICB2YXIgYXJncyA9IHtcbiAgICAgICAgICAgICAgICBwaXZvdF9qc29uOiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSnNvbk9iamVjdCgpKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZCh0aGlzLmFjY2VsZXJhdGlvbk5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzLm5hbWVzcGFjZSA9IHRoaXMuYWNjZWxlcmF0aW9uTmFtZXNwYWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gc3ZjLmdldChQYXRocy5waXZvdCArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5uYW1lKSwgYXJncywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVyci5kYXRhLm1lc3NhZ2VzWzBdLnRleHQpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5lbnRyeSAmJiByZXNwb25zZS5kYXRhLmVudHJ5WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG5ldyByb290LlBpdm90KHN2YywgcmVzcG9uc2UuZGF0YS5lbnRyeVswXS5jb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoXCJEaWRuJ3QgZ2V0IGEgUGl2b3QgcmVwb3J0IGJhY2sgZnJvbSBTcGx1bmtcIiksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHdyYXAgdXAgdGhlIGBQaXZvdFNwZWNpZmljYXRpb24ucGl2b3QoKWAgYW5kXG4gICAgICAgICAqIGBQaXZvdC5ydW4oKWAgZnVuY3Rpb24gY2FsbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFF1ZXJ5IFNwbHVuayBmb3IgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byBhIHBpdm90IHJlcG9ydFxuICAgICAgICAgKiBmb3IgdGhpcyBkYXRhIG1vZGVsLCBkZWZpbmVkIGJ5IHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmA7IHRoZW4sXG4gICAgICAgICAqIHN0YXJ0cyBhIHNlYXJjaCBqb2IgcnVubmluZyB0aGlzIHBpdm90LCBhY2NlbGVyYXRlZCBpZiBwb3NzaWJsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmRhdGFNb2RlbHMoKS5mZXRjaChmdW5jdGlvbihmZXRjaEVyciwgZGF0YU1vZGVscykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgc2VhcmNoZXMgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAgICAgKiAgICAgICAgICB2YXIgcGl2b3RTcGVjID0gc2VhcmNoZXMuY3JlYXRlUGl2b3RTcGVjaWZpY2F0aW9uKCk7XG4gICAgICAgICAqICAgICAgICAgIC8vIFVzZSBvZiB0aGUgZmx1ZW50IEFQSVxuICAgICAgICAgKiAgICAgICAgICBwaXZvdFNwZWMuYWRkUm93U3BsaXQoXCJ1c2VyXCIsIFwiRXhlY3V0aW5nIHVzZXJcIilcbiAgICAgICAgICogICAgICAgICAgICAgIC5hZGRSYW5nZUNvbHVtblNwbGl0KFwiZXhlY190aW1lXCIsIHtzdGFydDogMCwgZW5kOiAxMiwgc3RlcDogNSwgbGltaXQ6IDR9KVxuICAgICAgICAgKiAgICAgICAgICAgICAgLmFkZENlbGxWYWx1ZShcInNlYXJjaFwiLCBcIlNlYXJjaCBRdWVyeVwiLCBcInZhbHVlc1wiKVxuICAgICAgICAgKiAgICAgICAgICAgICAgLnJ1bihmdW5jdGlvbihlcnIsIGpvYiwgcGl2b3QpIHtcbiAgICAgICAgICogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkpvYiBTSUQgaXM6XCIsIGpvYi5zaWQpO1xuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGl2b3Qgc2VhcmNoIGlzOlwiLCBwaXZvdC5zZWFyY2gpO1xuICAgICAgICAgKiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYiAob3B0aW9uYWwpLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogICAgICAgICoqTm90ZToqKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBleGVjX21vZGU9b25lc2hvdGAgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBwcm9wZXJ0aWVzIGRpY3Rpb25hcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUgZ2V0dGluZyB0aGUgcGl2b3Q6IGAoZXJyLCBqb2IsIHBpdm90KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHJ1bjogZnVuY3Rpb24oYXJncywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgYXJncyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyA9IGFyZ3MgfHwge307XG5cbiAgICAgICAgICAgIHRoaXMucGl2b3QoZnVuY3Rpb24oZXJyLCBwaXZvdCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpdm90LnJ1bihhcmdzLCBBc3luYy5hdWdtZW50KGNhbGxiYWNrLCBwaXZvdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIG9uZSBvZiB0aGUgc3RydWN0dXJlZCB2aWV3cyBpbiBhIGBEYXRhTW9kZWxgLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZGF0YU1vZGVsYCAoX3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXyk6IFRoZSBgRGF0YU1vZGVsYCB0byB3aGljaCB0aGlzIGBEYXRhTW9kZWxPYmplY3RgIGJlbG9uZ3MuXG4gICAgICogICAgLSBgbmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhpcyBgRGF0YU1vZGVsT2JqZWN0YC5cbiAgICAgKiAgICAtIGBkaXNwbGF5TmFtZWAgKF9zdHJpbmdfKTogVGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhpcyBgRGF0YU1vZGVsT2JqZWN0YC5cbiAgICAgKiAgICAtIGBwYXJlbnROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGBEYXRhTW9kZWxPYmplY3RgIHRvIHRoaXMgb25lLlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogQW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiB0aGUgbGluZWFnZSBvZiB0aGUgZGF0YSBtb2RlbFxuICAgICAqICAgICAgICAgIG9uIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC5cbiAgICAgKiAgICAtIGBmaWVsZHNgIChfb2JqZWN0Xyk6IEEgZGljdGlvbmFyeSBvZiBgRGF0YU1vZGVsRmllbGRgIG9iamVjdHMsIGFjY2Vzc2libGUgYnkgbmFtZS5cbiAgICAgKiAgICAtIGBjb25zdHJhaW50c2AgKF9hcnJheV8pOiBBbiBhcnJheSBvZiBgRGF0YU1vZGVsQ29uc3RyYWludGAgb2JqZWN0cy5cbiAgICAgKiAgICAtIGBjYWxjdWxhdGlvbnNgIChfb2JqZWN0Xyk6IEEgZGljdGlvbmFyeSBvZiBgRGF0YU1vZGVsQ2FsY3VsYXRpb25gIG9iamVjdHMsIGFjY2Vzc2libGUgYnkgSUQuXG4gICAgICpcbiAgICAgKiBCYXNlU2VhcmNoIGhhcyBhbiBhZGRpdGlvbmFsIHByb3BlcnR5OlxuICAgICAqICAgIC0gYGJhc2VTZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggcXVlcnkgd3JhcHBlZCBieSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAqXG4gICAgICogQmFzZVRyYW5zYWN0aW9uIGhhcyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZ3JvdXBCeUZpZWxkc2AgKF9zdHJpbmdfKTogVGhlIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBncm91cCBldmVudHMgaW50byB0cmFuc2FjdGlvbnMuXG4gICAgICogICAgLSBgb2JqZWN0c1RvR3JvdXBgIChfYXJyYXlfKTogTmFtZXMgb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSB1bmlvbmVkXG4gICAgICogICAgICAgIGFuZCBzcGxpdCBpbnRvIHRyYW5zYWN0aW9ucy5cbiAgICAgKiAgICAtIGBtYXhTcGFuYCAoX3N0cmluZ18pOiBUaGUgbWF4aW11bSB0aW1lIHNwYW4gb2YgYSB0cmFuc2FjdGlvbi5cbiAgICAgKiAgICAtIGBtYXhQYXVzZWAgKF9zdHJpbmdfKTogVGhlIG1heGltdW0gcGF1c2UgdGltZSBvZiBhIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICovXG4gICAgcm9vdC5EYXRhTW9kZWxPYmplY3QgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqIFNESyB1c2VycyBhcmUgbm90IGV4cGVjdGVkIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHRvIHNldDpcbiAgICAgICAgICogICAgIC0gYG9iamVjdE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIGZvciB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKiAgICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICogICAgIC0gYHBhcmVudE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKiAgICAgLSBgbGluZWFnZWAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgdGhhdCBvd25zIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QsXG4gICAgICAgICAqICAgICAgICAgIGl0ZW1zIGFyZSBkZWxpbWl0ZWQgYnkgYSBkb3QuIFRoaXMgaXMgY29udmVydGVkIGludG8gYW4gYXJyYXkgb2ZcbiAgICAgICAgICogICAgICAgICAgc3RyaW5ncyB1cG9uIGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICogICAgIC0gYGZpZWxkc2AgKF9hcnJheV8pOiBBbiBhcnJheSBvZiBkYXRhIG1vZGVsIGZpZWxkcy5cbiAgICAgICAgICogICAgIC0gYGNvbnN0cmFpbnRzYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIGRhdGEgbW9kZWwgY29uc3RyYWludHMuXG4gICAgICAgICAqICAgICAtIGBjYWxjdWxhdGlvbnNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqICAgICAtIGBiYXNlU2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHdyYXBwZWQgYnkgdGhpcyBkYXRhIG1vZGVsIG9iamVjdDsgZXhjbHVzaXZlIHRvIEJhc2VTZWFyY2ggKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgZ3JvdXBCeUZpZWxkc2AgKF9hcnJheV8pOiBUaGUgZmllbGRzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdyb3VwIGV2ZW50cyBpbnRvIHRyYW5zYWN0aW9uczsgZXhjbHVzaXZlIHRvIEJhc2VUcmFuc2FjdGlvbiAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBvYmplY3RzVG9Hcm91cGAgKF9hcnJheV8pOiBOYW1lcyBvZiB0aGUgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHVuaW9uZWRcbiAgICAgICAgICogICAgICAgICBhbmQgc3BsaXQgaW50byB0cmFuc2FjdGlvbnM7IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgbWF4U3BhbmAgKF9zdHJpbmdfKTogVGhlIG1heGltdW0gdGltZSBzcGFuIG9mIGEgdHJhbnNhY3Rpb247IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgbWF4UGF1c2VgIChfc3RyaW5nXyk6IFRoZSBtYXhpbXVtIHBhdXNlIHRpbWUgb2YgYSB0cmFuc2FjdGlvbjsgZXhjbHVzaXZlIHRvIEJhc2VUcmFuc2FjdGlvbiAob3B0aW9uYWwpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWx9IHBhcmVudERhdGFNb2RlbCBUaGUgYERhdGFNb2RlbGAgdGhhdCBvd25zIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHByb3BzLCBwYXJlbnREYXRhTW9kZWwpIHtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgfHwge307XG4gICAgICAgICAgICBwcm9wcy5vd25lciA9IHByb3BzLm93bmVyIHx8IFwiXCI7XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsICAgICAgICAgICAgICA9IHBhcmVudERhdGFNb2RlbDtcbiAgICAgICAgICAgIHRoaXMubmFtZSAgICAgICAgICAgICAgICAgICA9IHByb3BzLm9iamVjdE5hbWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lICAgICAgICAgICAgPSBwcm9wcy5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50TmFtZSAgICAgICAgICAgICA9IHByb3BzLnBhcmVudE5hbWU7XG4gICAgICAgICAgICB0aGlzLmxpbmVhZ2UgICAgICAgICAgICAgICAgPSBwcm9wcy5saW5lYWdlLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICAgICAgLy8gUHJvcGVydGllcyBleGNsdXNpdmUgdG8gQmFzZVRyYW5zYWN0aW9uXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJncm91cEJ5RmllbGRzXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cEJ5RmllbGRzID0gcHJvcHMuZ3JvdXBCeUZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShcIm9iamVjdHNUb0dyb3VwXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzVG9Hcm91cCA9IHByb3BzLm9iamVjdHNUb0dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwidHJhbnNhY3Rpb25NYXhUaW1lU3BhblwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4U3BhbiA9IHByb3BzLnRyYW5zYWN0aW9uTWF4VGltZVNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJ0cmFuc2FjdGlvbk1heFBhdXNlXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXhQYXVzZSA9IHByb3BzLnRyYW5zYWN0aW9uTWF4UGF1c2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3BlcnR5IGV4Y2x1c2l2ZSB0byBCYXNlU2VhcmNoXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJiYXNlU2VhcmNoXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlU2VhcmNoID0gcHJvcHMuYmFzZVNlYXJjaDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUGFyc2UgZmllbGRzXG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkc1twcm9wcy5maWVsZHNbaV0uZmllbGROYW1lXSA9IG5ldyByb290LkRhdGFNb2RlbEZpZWxkKHByb3BzLmZpZWxkc1tpXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJhaW50cy5wdXNoKG5ldyByb290LkRhdGFNb2RlbENvbnN0cmFpbnQocHJvcHMuY29uc3RyYWludHNbal0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUGFyc2UgY2FsY3VsYXRpb25zXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwcm9wcy5jYWxjdWxhdGlvbnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0aW9uc1twcm9wcy5jYWxjdWxhdGlvbnNba10uY2FsY3VsYXRpb25JRF0gPSBuZXcgcm9vdC5EYXRhTW9kZWxDYWxjdWxhdGlvbihwcm9wcy5jYWxjdWxhdGlvbnNba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGEgQmFzZVNlYXJjaD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGlzIHRoZSByb290IHR5cGUsIEJhc2VTZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGlzQmFzZVNlYXJjaDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHRoaXMuYmFzZVNlYXJjaCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QgaXMgYSBCYXNlVHJhbnNhY3Rpb24/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCBpcyB0aGUgcm9vdCB0eXBlLCBCYXNlVHJhbnNhY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGlzQmFzZVRyYW5zYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQodGhpcy5tYXhTcGFuKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB0aGUgbmFtZXMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGZpZWxkcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGZpZWxkTmFtZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmllbGRzKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGRhdGEgbW9kZWwgZmllbGQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIGZpZWxkIG9uIHRoaXNcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkfG51bGx9IFRoZSBkYXRhIG1vZGVsIGZpZWxkXG4gICAgICAgICAqIGZyb20gdGhpcyBkYXRhIG1vZGVsIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgbnVsbCBpZiBpdCB0aGUgXG4gICAgICAgICAqIGZpZWxkIGJ5IHRoYXQgbmFtZSBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBmaWVsZEJ5TmFtZTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZEZpZWxkcygpW25hbWVdIHx8IHRoaXMuZmllbGRzW25hbWVdIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIG1vZGVsIGZpZWxkcyBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMsIGFuZCB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3MgZmllbGRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgYHNwbHVuay5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkYCBvYmplY3RzXG4gICAgICAgICAqIHdoaWNoIGluY2x1ZGVzIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBmaWVsZHMsIGFuZCB0aGUgZmllbGRzIGZyb21cbiAgICAgICAgICogdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgYWxsRmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIG1lcmdlIGZpZWxkcyBhbmQgY2FsY3VsYXRlZEZpZWxkcygpXG4gICAgICAgICAgICB2YXIgY29tYmluZWRGaWVsZHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZiBpbiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcy5oYXNPd25Qcm9wZXJ0eShmKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZEZpZWxkc1tmXSA9IHRoaXMuZmllbGRzW2ZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNhbGN1bGF0ZWRGaWVsZHMgPSB0aGlzLmNhbGN1bGF0ZWRGaWVsZHMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGNmIGluIGNhbGN1bGF0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShjZikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRGaWVsZHNbY2ZdID0gY2FsY3VsYXRlZEZpZWxkc1tjZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29tYmluZWRGaWVsZHM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgb2YgdGhlIGZpZWxkIG5hbWVzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMsIGFuZCB0aGUgbmFtZXMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGZpZWxkcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMsIGFuZCB0aGUgbmFtZXMgb2YgZmllbGRzIG9uIFxuICAgICAgICAgKiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBhbGxGaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFsbEZpZWxkcygpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIG1vZGVsIGZpZWxkcyBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBgc3BsdW5rLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRgIG9iamVjdHNcbiAgICAgICAgICogb2YgdGhlIGZpZWxkcyBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNhbGN1bGF0ZWRGaWVsZHM6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgZmllbGRzID0ge307XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGNhbGN1bGF0aW9ucywgZ2V0IHRoZWlyIGZpZWxkc1xuICAgICAgICAgICAgdmFyIGtleXMgPSB0aGlzLmNhbGN1bGF0aW9uSURzKCk7XG4gICAgICAgICAgICB2YXIgY2FsY3VsYXRpb25zID0gdGhpcy5jYWxjdWxhdGlvbnM7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY3VsYXRpb24gPSBjYWxjdWxhdGlvbnNba2V5c1tpXV07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCBjYWxjdWxhdGlvbi5vdXRwdXRGaWVsZE5hbWVzKCkubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzW2NhbGN1bGF0aW9uLm91dHB1dEZpZWxkTmFtZXMoKVtmXV0gPSBjYWxjdWxhdGlvbi5vdXRwdXRGaWVsZHNbY2FsY3VsYXRpb24ub3V0cHV0RmllbGROYW1lcygpW2ZdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIFxuICAgICAgICAgKiBkYXRhIG1vZGVsIG9iamVjdCdzIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgY2FsY3VsYXRlZEZpZWxkTmFtZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2FsY3VsYXRlZEZpZWxkcygpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QgY29udGFpbnMgdGhlIGZpZWxkIHdpdGggdGhlXG4gICAgICAgICAqIG5hbWUgcGFzc2VkIGluIHRoZSBgZmllbGROYW1lYCBwYXJhbWV0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGxvb2sgZm9yLlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjb250YWlucyB0aGUgZmllbGQgYnkgbmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgaGFzRmllbGQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmNvbnRhaW5zKHRoaXMuYWxsRmllbGROYW1lcygpLCBmaWVsZE5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBJRHMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzXG4gICAgICAgICAqIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgSURzIG9mIHRoaXMgZGF0YSBtb2RlbFxuICAgICAgICAgKiBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNhbGN1bGF0aW9uSURzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhbGN1bGF0aW9ucyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvY2FsIGFjY2VsZXJhdGlvbiBpcyB0c2lkeCBhY2NlbGVyYXRpb24gb2YgYSBkYXRhIG1vZGVsIG9iamVjdCB0aGF0IGlzIGhhbmRsZWRcbiAgICAgICAgICogbWFudWFsbHkgYnkgYSB1c2VyLiBZb3UgY3JlYXRlIGEgam9iIHdoaWNoIGdlbmVyYXRlcyBhbiBpbmRleCwgYW5kIHRoZW4gdXNlIHRoYXRcbiAgICAgICAgICogaW5kZXggaW4geW91ciBwaXZvdHMgb24gdGhlIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgbmFtZXNwYWNlIGNyZWF0ZWQgYnkgdGhlIGpvYiBpcyAnc2lkPXtzaWR9JyB3aGVyZSB7c2lkfSBpcyB0aGUgam9iJ3Mgc2lkLiBZb3VcbiAgICAgICAgICogd291bGQgdXNlIGl0IGluIGFub3RoZXIgam9iIGJ5IHN0YXJ0aW5nIHlvdXIgc2VhcmNoIHF1ZXJ5IHdpdGggYHwgdHN0YXRzIC4uLiBmcm9tIHNpZD17c2lkfSB8IC4uLmBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHRzaWR4IGluZGV4IGNyZWF0ZWQgYnkgdGhpcyBqb2IgaXMgZGVsZXRlZCB3aGVuIHRoZSBqb2IgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgYnkgU3BsdW5rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1hbmFnZSB0aGlzIGpvYiwgaW5jbHVkaW5nIGNhbmNlbGxpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBvYmplY3QgPSBkYXRhTW9kZWxzLml0ZW0oXCJzb21lX2RhdGFfbW9kZWxcIikub2JqZWN0QnlOYW1lKFwic29tZV9vYmplY3RcIik7XG4gICAgICAgICAqICAgICAgICAgIG9iamVjdC5jcmVhdGVMb2NhbEFjY2VsZXJhdGlvbkpvYihcIi0xZFwiLCBmdW5jdGlvbihlcnIsIGFjY2VsZXJhdGlvbkpvYikge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgam9iIGhhcyBuYW1lOlwiLCBhY2NlbGVyYXRpb25Kb2IubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH0pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZWFybGllc3RUaW1lIEEgdGltZSBtb2RpZmllciAoZS5nLiwgXCItMndcIikgc2V0dGluZyB0aGUgZWFybGllc3QgdGltZSB0byBpbmRleC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBhY2NlbGVyYXRpb25Kb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlTG9jYWxBY2NlbGVyYXRpb25Kb2I6IGZ1bmN0aW9uKGVhcmxpZXN0VGltZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIGVhcmxpZXN0VGltZSBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBzZXQgY2FsbGJhY2sgdG8gaXRzIHZhbHVlXG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24oZWFybGllc3RUaW1lKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZWFybGllc3RUaW1lO1xuICAgICAgICAgICAgICAgIGVhcmxpZXN0VGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gXCJ8IGRhdGFtb2RlbCBcXFwiXCIgKyB0aGlzLmRhdGFNb2RlbC5uYW1lICsgXCJcXFwiIFwiICsgdGhpcy5uYW1lICsgXCIgc2VhcmNoIHwgdHNjb2xsZWN0XCI7XG4gICAgICAgICAgICB2YXIgYXJncyA9IGVhcmxpZXN0VGltZSA/IHtlYXJsaWVzdF90aW1lOiBlYXJsaWVzdFRpbWV9IDoge307XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLnNlcnZpY2Uuc2VhcmNoKHF1ZXJ5LCBhcmdzLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN0YXJ0IGEgc2VhcmNoIGpvYiB0aGF0IGFwcGxpZXMgcXVlcnlTdWZmaXggdG8gYWxsIHRoZSBldmVudHMgaW4gdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmRhdGFNb2RlbHMoKS5mZXRjaChmdW5jdGlvbihlcnIsIGRhdGFNb2RlbHMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIG9iamVjdCA9IGRhdGFNb2RlbHMuaXRlbShcImludGVybmFsX2F1ZGl0X2xvZ3NcIikub2JqZWN0QnlOYW1lKFwic2VhcmNoZXNcIik7XG4gICAgICAgICAqICAgICAgICAgIG9iamVjdC5zdGFydFNlYXJjaCh7fSwgXCJ8IGhlYWQgNVwiLCBmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgam9iIGhhcyBuYW1lOlwiLCBqb2IubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH0pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqICAgICAgICAqKk5vdGU6KiogVGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBgZXhlY19tb2RlPW9uZXNob3RgIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcHJvcGVydGllcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnlTdWZmaXggQSBzZWFyY2ggcXVlcnksIHN0YXJ0aW5nIHdpdGggYSAnfCcgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBjb21tYW5kIHRvIGZldGNoIHRoZSBjb250ZW50cyBvZiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IChlLmcuLCBcInwgaGVhZCAzXCIpLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgc2VhcmNoIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBzdGFydFNlYXJjaDogZnVuY3Rpb24ocGFyYW1zLCBxdWVyeVN1ZmZpeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBxdWVyeSA9IFwifCBkYXRhbW9kZWwgXCIgKyB0aGlzLmRhdGFNb2RlbC5uYW1lICsgXCIgXCIgKyB0aGlzLm5hbWUgKyBcIiBzZWFyY2hcIjtcbiAgICAgICAgICAgIC8vIFByZXBlbmQgYSBzcGFjZSB0byB0aGUgcXVlcnlTdWZmaXgsIG9yIHNldCBpdCB0byBhbiBlbXB0eSBzdHJpbmcgaWYgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIHF1ZXJ5U3VmZml4ID0gKHF1ZXJ5U3VmZml4KSA/IChcIiBcIiArIHF1ZXJ5U3VmZml4KSA6IChcIlwiKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLnNlcnZpY2Uuc2VhcmNoKHF1ZXJ5ICsgcXVlcnlTdWZmaXgsIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHRoaXMgb25lIGluaGVyaXRzIGZyb20gaWYgaXQgaXMgYSB1c2VyIGRlZmluZWQsXG4gICAgICAgICAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3R8bnVsbH0gVGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIHBhcmVudFxuICAgICAgICAgKiAgICAgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIHVzZXIgZGVmaW5lZCBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgcGFyZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFNb2RlbC5vYmplY3RCeU5hbWUodGhpcy5wYXJlbnROYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgbmV3IFBpdm90IFNwZWNpZmljYXRpb24sIGFjY2VwdHMgbm8gcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IEEgbmV3IHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBpdm90U3BlY2lmaWNhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBQYXNzIGluIHRoaXMgRGF0YU1vZGVsT2JqZWN0IHRvIGNyZWF0ZSBhIFBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlBpdm90U3BlY2lmaWNhdGlvbih0aGlzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBkYXRhIG1vZGVsIG9uIHRoZSBzZXJ2ZXIuIERhdGEgbW9kZWxzXG4gICAgICogY29udGFpbiBgRGF0YU1vZGVsT2JqZWN0YCBpbnN0YW5jZXMsIHdoaWNoIHNwZWNpZnkgc3RydWN0dXJlZFxuICAgICAqIHZpZXdzIG9uIFNwbHVuayBkYXRhLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGFtb2RlbC9tb2RlbC97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsID0gU2VydmljZS5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmRhdGFNb2RlbHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgZGF0YSBtb2RlbC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSAoT3B0aW9uYWwpIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgb2YgdGhpcyBkYXRhIG1vZGVsOlxuICAgICAgICAgKiAgICAtIGBhY2NlbGVyYXRpb25gIChfc3RyaW5nXyk6IEEgSlNPTiBvYmplY3Qgd2l0aCBhbiBgZW5hYmxlZGAga2V5LCByZXByZXNlbnRpbmcgaWYgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LlxuICAgICAgICAgKiAgICAtIGBjb25jaXNlYCAoX3N0cmluZ18pOiBJbmRpY2F0ZXMgd2hldGhlciB0byBsaXN0IGEgY29uY2lzZSBKU09OIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIG1vZGVsLCBzaG91bGQgYWx3YXlzIGJlIFwiMFwiLlxuICAgICAgICAgKiAgICAtIGBkZXNjcmlwdGlvbmAgKF9zdHJpbmdfKTogVGhlIEpTT04gZGVzY3JpYmluZyB0aGUgZGF0YSBtb2RlbC5cbiAgICAgICAgICogICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIGRpc3BsYXllZCBmb3IgdGhlIGRhdGEgbW9kZWwgaW4gU3BsdW5rIFdlYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlLCBwcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgbm90IGdpdmVuIGEgNHRoIGFyZywgYXNzdW1lIHRoZSBuYW1lc3BhY2Ugd2FzIG9taXR0ZWRcbiAgICAgICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBwcm9wcyA9IG5hbWVzcGFjZTtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLmFjY2VsZXJhdGlvbiA9IEpTT04ucGFyc2UocHJvcHMuY29udGVudC5hY2NlbGVyYXRpb24pIHx8IHt9O1xuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZWxlcmF0aW9uLmhhc093blByb3BlcnR5KFwiZW5hYmxlZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGVuYWJsZWQgcHJvcGVydHkgdG8gYSBib29sZWFuXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24uZW5hYmxlZCA9ICEhdGhpcy5hY2NlbGVyYXRpb24uZW5hYmxlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29uY2lzZT0wIChmYWxzZSkgZm9yY2VzIHRoZSBzZXJ2ZXIgdG8gcmV0dXJuIGFsbCBkZXRhaWxzIG9mIHRoZSBuZXdseSBjcmVhdGVkIGRhdGEgbW9kZWwuXG4gICAgICAgICAgICAvLyB3ZSBkbyBub3Qgd2FudCBhIHN1bW1hcnkgb2YgdGhpcyBkYXRhIG1vZGVsXG4gICAgICAgICAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KFwiY29uY2lzZVwiKSB8fCB1dGlscy5pc1VuZGVmaW5lZChwcm9wcy5jb25jaXNlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2lzZSA9IFwiMFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGF0YU1vZGVsRGVmaW5pdGlvbiA9IEpTT04ucGFyc2UocHJvcHMuY29udGVudC5kZXNjcmlwdGlvbik7XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0TmFtZXMgPSBkYXRhTW9kZWxEZWZpbml0aW9uLm9iamVjdE5hbWVMaXN0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRhdGFNb2RlbERlZmluaXRpb24uZGlzcGxheU5hbWU7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YU1vZGVsRGVmaW5pdGlvbi5kZXNjcmlwdGlvbjtcblxuICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG9iamVjdHMgZm9yIHRoaXMgZGF0YSBtb2RlbCAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgb2JqcyA9IGRhdGFNb2RlbERlZmluaXRpb24ub2JqZWN0cztcbiAgICAgICAgICAgIHRoaXMub2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzLnB1c2gobmV3IHJvb3QuRGF0YU1vZGVsT2JqZWN0KG9ianNbaV0sIHRoaXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW1vdmUgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVwZGF0ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZCBvciBub3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgaXNBY2NlbGVyYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmFjY2VsZXJhdGlvbi5lbmFibGVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgZGF0YSBtb2RlbCBvYmplY3QgZnJvbSB0aGlzIGRhdGEgbW9kZWxcbiAgICAgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fG51bGx9IGEgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIG9iamVjdEJ5TmFtZTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmplY3RzW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0c1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIGV4aXN0cyBpbiB0aGlzIGRhdGEgbW9kZWwgb3Igbm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGhhcyBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICAgICAqL1xuICAgICAgICBoYXNPYmplY3Q6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5jb250YWlucyh0aGlzLm9iamVjdE5hbWVzLCBuYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgZGF0YSBtb2RlbCBvbiB0aGUgc2VydmVyLCB1c2VkIHRvIHVwZGF0ZSBhY2NlbGVyYXRpb24gc2V0dGluZ3MuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byB1cGRhdGUgdGhlIG9iamVjdCB3aXRoOlxuICAgICAgICAgKiAgICAgLSBgYWNjZWxlcmF0aW9uYCAoX29iamVjdF8pOiBUaGUgYWNjZWxlcmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZGF0YSBtb2RlbC5cbiAgICAgICAgICogICAgICAgICBWYWxpZCBrZXlzIGFyZTogYGVuYWJsZWRgLCBgZWFybGllc3RUaW1lYCwgYGNyb25TY2hlZHVsZWAuXG4gICAgICAgICAqICAgICAgICAgQW55IGtleXMgbm90IHNldCB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSBhY2NlbGVyYXRpb24gc2V0dGluZ3MgYWxyZWFkeVxuICAgICAgICAgKiAgICAgICAgIHNldCBvbiB0aGlzIGRhdGEgbW9kZWwuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBkYXRhIG1vZGVsIGlzIHVwZGF0ZWQ6IGAoZXJyLCBkYXRhTW9kZWwpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9wcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc1VuZGVmaW5lZChjYWxsYmFjaykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHByb3BzO1xuICAgICAgICAgICAgICAgIHByb3BzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoXCJNdXN0IHNwZWNpZnkgYSBwcm9wcyBhcmd1bWVudCB0byB1cGRhdGUgYSBkYXRhIG1vZGVsLlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBFeGl0IGlmIHByb3BzIGlzbid0IHNldCwgdG8gYXZvaWQgY2FsbGluZyB0aGUgY2FsbGJhY2sgdHdpY2UuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiQ2Fubm90IHNldCAnbmFtZScgZmllbGQgaW4gJ3VwZGF0ZSdcIiksIHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRXhpdCBpZiB0aGUgbmFtZSBpcyBzZXQsIHRvIGF2b2lkIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHR3aWNlLlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdXBkYXRlZFByb3BzID0ge1xuICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbjogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBwcm9wcy5hY2NjZWxlcmF0aW9uICYmIHByb3BzLmFjY2VsZXJhdGlvbi5lbmFibGVkIHx8IHRoaXMuYWNjZWxlcmF0aW9uLmVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGVhcmxpZXN0X3RpbWU6IHByb3BzLmFjY2NlbGVyYXRpb24gJiYgcHJvcHMuYWNjZWxlcmF0aW9uLmVhcmxpZXN0VGltZSB8fCB0aGlzLmFjY2VsZXJhdGlvbi5lYXJsaWVzdFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGNyb25fc2NoZWR1bGU6IHByb3BzLmFjY2NlbGVyYXRpb24gJiYgcHJvcHMuYWNjZWxlcmF0aW9uLmNyb25TY2hlZHVsZSB8fCB0aGlzLmFjY2VsZXJhdGlvbi5jcm9uU2NoZWR1bGVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdChcIlwiLCB1cGRhdGVkUHJvcHMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YU1vZGVsTmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocmVzcG9uc2UuZGF0YS5lbnRyeVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG5ldyByb290LkRhdGFNb2RlbCh0aGF0LnNlcnZpY2UsIHJlc3BvbnNlLmRhdGEuZW50cnlbMF0ubmFtZSwgZGF0YU1vZGVsTmFtZXNwYWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBkYXRhIG1vZGVscy4gWW91IGNhbiBjcmVhdGUgYW5kXG4gICAgICogbGlzdCBkYXRhIG1vZGVscyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvclxuICAgICAqIGdldCBhIHNwZWNpZmljIGRhdGEgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgZGF0YW1vZGVsL21vZGVsXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVscyA9IFNlcnZpY2UuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmRhdGFNb2RlbHM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzYC5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgKE9wdGlvbmFsKSBuYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2UgfHwge307XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmNyZWF0ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYERhdGFNb2RlbGAgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEl0IGlzIHByZWZlcnJlZCB0aGF0IHlvdSBjcmVhdGUgZGF0YSBtb2RlbHMgdGhyb3VnaCB0aGUgU3BsdW5rXG4gICAgICAgICAqIEVudGVycHJpc2Ugd2l0aCBhIGJyb3dzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIHRvIGNyZWF0ZS4gSWYgaXQgY29udGFpbnMgc3BhY2VzIHRoZXkgd2lsbCBiZSByZXBsYWNlZFxuICAgICAgICAgKiAgICAgd2l0aCB1bmRlcnNjb3Jlcy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBgRGF0YU1vZGVsYCBvYmplY3Q6IGAoZXJyLCBjcmVhdGVkRGF0YU1vZGVsKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKG5hbWUsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGdldCAobmFtZSwgY2FsbGJhY2spIGluc3RlYWQgb2YgKG5hbWUsIHBhcmFtcywgY2FsbGJhY2spXG4gICAgICAgICAgICAvLyBkbyB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlIHN3YXBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XG5cbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3QoXCJcIiwge25hbWU6IG5hbWUsIGRlc2NyaXB0aW9uOiBKU09OLnN0cmluZ2lmeShwYXJhbXMpfSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhTW9kZWwgPSBuZXcgcm9vdC5EYXRhTW9kZWwodGhhdC5zZXJ2aWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdLm5hbWUsIHRoYXQubmFtZXNwYWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdXNlZCB0byBjcmVhdGUgYSBcbiAgICAgICAgICogYERhdGFNb2RlbGAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsfSBBIG5ldyBgRGF0YU1vZGVsYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5EYXRhTW9kZWwodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UsIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyohKi9cbiAgICAvLyBJdGVyYXRlcyBvdmVyIGFuIGVuZHBvaW50J3MgcmVzdWx0cy5cbiAgICByb290LlBhZ2luYXRlZEVuZHBvaW50SXRlcmF0b3IgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICBpbml0OiBmdW5jdGlvbihlbmRwb2ludCwgcGFyYW1zKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX2VuZHBvaW50ID0gZW5kcG9pbnQ7XG4gICAgICAgICAgICB0aGlzLl9wYWdlc2l6ZSA9IHBhcmFtcy5wYWdlc2l6ZSB8fCAwO1xuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8vIEZldGNoZXMgdGhlIG5leHQgcGFnZSBmcm9tIHRoZSBlbmRwb2ludC5cbiAgICAgICAgbmV4dDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDogdGhpcy5fcGFnZXNpemUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLl9vZmZzZXRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5kcG9pbnQocGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1SZXN1bHRzID0gKHJlc3VsdHMucm93cyA/IHJlc3VsdHMucm93cy5sZW5ndGggOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb2Zmc2V0ICs9IG51bVJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzLCBudW1SZXN1bHRzID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKCk7Il19 \ No newline at end of file diff --git a/node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js b/node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js new file mode 100644 index 000000000..2b64393bb --- /dev/null +++ b/node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js @@ -0,0 +1,2875 @@ +function cov_1ks4ntaci2(){var path="/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js";var hash="1e13507780108878ff5a225bb0ab3d0d383df74e";var global=new Function("return this")();var gcv="__coverage__";var coverageData={path:"/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js",statementMap:{"0":{start:{line:16,column:0},end:{line:5803,column:5}},"1":{start:{line:19,column:22},end:{line:19,column:42}},"2":{start:{line:20,column:22},end:{line:20,column:39}},"3":{start:{line:21,column:22},end:{line:21,column:40}},"4":{start:{line:22,column:22},end:{line:22,column:46}},"5":{start:{line:23,column:22},end:{line:23,column:53}},"6":{start:{line:24,column:22},end:{line:24,column:40}},"7":{start:{line:26,column:15},end:{line:26,column:30}},"8":{start:{line:27,column:18},end:{line:27,column:22}},"9":{start:{line:37,column:22},end:{line:41,column:6}},"10":{start:{line:39,column:12},end:{line:39,column:47}},"11":{start:{line:51,column:4},end:{line:664,column:7}},"12":{start:{line:73,column:12},end:{line:73,column:47}},"13":{start:{line:77,column:12},end:{line:77,column:72}},"14":{start:{line:78,column:12},end:{line:78,column:66}},"15":{start:{line:79,column:12},end:{line:79,column:76}},"16":{start:{line:80,column:12},end:{line:80,column:69}},"17":{start:{line:81,column:12},end:{line:81,column:75}},"18":{start:{line:82,column:12},end:{line:82,column:66}},"19":{start:{line:83,column:12},end:{line:83,column:67}},"20":{start:{line:84,column:12},end:{line:84,column:73}},"21":{start:{line:85,column:12},end:{line:85,column:67}},"22":{start:{line:86,column:12},end:{line:86,column:78}},"23":{start:{line:87,column:12},end:{line:87,column:72}},"24":{start:{line:106,column:12},end:{line:116,column:15}},"25":{start:{line:136,column:12},end:{line:136,column:47}},"26":{start:{line:164,column:12},end:{line:164,column:60}},"27":{start:{line:192,column:12},end:{line:192,column:53}},"28":{start:{line:218,column:12},end:{line:218,column:59}},"29":{start:{line:244,column:12},end:{line:244,column:62}},"30":{start:{line:271,column:12},end:{line:271,column:71}},"31":{start:{line:300,column:12},end:{line:300,column:50}},"32":{start:{line:312,column:12},end:{line:312,column:56}},"33":{start:{line:337,column:12},end:{line:337,column:40}},"34":{start:{line:366,column:12},end:{line:366,column:51}},"35":{start:{line:397,column:12},end:{line:400,column:13}},"36":{start:{line:398,column:16},end:{line:398,column:37}},"37":{start:{line:399,column:16},end:{line:399,column:33}},"38":{start:{line:402,column:23},end:{line:402,column:53}},"39":{start:{line:403,column:12},end:{line:403,column:56}},"40":{start:{line:420,column:12},end:{line:423,column:13}},"41":{start:{line:421,column:16},end:{line:421,column:37}},"42":{start:{line:422,column:16},end:{line:422,column:33}},"43":{start:{line:424,column:22},end:{line:424,column:56}},"44":{start:{line:425,column:12},end:{line:425,column:43}},"45":{start:{line:453,column:12},end:{line:456,column:13}},"46":{start:{line:454,column:16},end:{line:454,column:37}},"47":{start:{line:455,column:16},end:{line:455,column:33}},"48":{start:{line:458,column:23},end:{line:458,column:53}},"49":{start:{line:459,column:12},end:{line:459,column:63}},"50":{start:{line:478,column:12},end:{line:478,column:49}},"51":{start:{line:480,column:23},end:{line:480,column:27}},"52":{start:{line:481,column:22},end:{line:497,column:14}},"53":{start:{line:482,column:16},end:{line:496,column:17}},"54":{start:{line:483,column:20},end:{line:483,column:34}},"55":{start:{line:486,column:35},end:{line:486,column:74}},"56":{start:{line:487,column:31},end:{line:487,column:60}},"57":{start:{line:488,column:20},end:{line:495,column:23}},"58":{start:{line:489,column:24},end:{line:494,column:25}},"59":{start:{line:490,column:28},end:{line:490,column:35}},"60":{start:{line:493,column:28},end:{line:493,column:60}},"61":{start:{line:499,column:12},end:{line:499,column:23}},"62":{start:{line:517,column:12},end:{line:517,column:49}},"63":{start:{line:519,column:29},end:{line:519,column:54}},"64":{start:{line:520,column:12},end:{line:520,column:46}},"65":{start:{line:544,column:12},end:{line:547,column:13}},"66":{start:{line:545,column:16},end:{line:545,column:34}},"67":{start:{line:546,column:16},end:{line:546,column:28}},"68":{start:{line:549,column:12},end:{line:549,column:49}},"69":{start:{line:550,column:12},end:{line:550,column:34}},"70":{start:{line:552,column:12},end:{line:552,column:29}},"71":{start:{line:554,column:12},end:{line:561,column:15}},"72":{start:{line:555,column:16},end:{line:560,column:17}},"73":{start:{line:556,column:20},end:{line:556,column:34}},"74":{start:{line:559,column:20},end:{line:559,column:50}},"75":{start:{line:581,column:12},end:{line:584,column:13}},"76":{start:{line:582,column:16},end:{line:582,column:33}},"77":{start:{line:583,column:16},end:{line:583,column:27}},"78":{start:{line:586,column:12},end:{line:586,column:49}},"79":{start:{line:587,column:25},end:{line:590,column:13}},"80":{start:{line:592,column:12},end:{line:600,column:15}},"81":{start:{line:593,column:16},end:{line:599,column:17}},"82":{start:{line:594,column:20},end:{line:594,column:34}},"83":{start:{line:597,column:34},end:{line:597,column:63}},"84":{start:{line:598,column:20},end:{line:598,column:50}},"85":{start:{line:625,column:12},end:{line:628,column:13}},"86":{start:{line:626,column:16},end:{line:626,column:34}},"87":{start:{line:627,column:16},end:{line:627,column:28}},"88":{start:{line:630,column:12},end:{line:630,column:49}},"89":{start:{line:631,column:12},end:{line:631,column:34}},"90":{start:{line:634,column:12},end:{line:636,column:13}},"91":{start:{line:635,column:16},end:{line:635,column:46}},"92":{start:{line:638,column:23},end:{line:638,column:45}},"93":{start:{line:639,column:25},end:{line:639,column:31}},"94":{start:{line:640,column:26},end:{line:640,column:56}},"95":{start:{line:641,column:23},end:{line:641,column:28}},"96":{start:{line:642,column:22},end:{line:642,column:28}},"97":{start:{line:643,column:23},end:{line:643,column:25}},"98":{start:{line:645,column:22},end:{line:660,column:13}},"99":{start:{line:653,column:20},end:{line:658,column:21}},"100":{start:{line:654,column:24},end:{line:654,column:38}},"101":{start:{line:657,column:24},end:{line:657,column:54}},"102":{start:{line:662,column:12},end:{line:662,column:23}},"103":{start:{line:674,column:4},end:{line:815,column:7}},"104":{start:{line:686,column:12},end:{line:688,column:13}},"105":{start:{line:687,column:16},end:{line:687,column:61}},"106":{start:{line:690,column:12},end:{line:692,column:13}},"107":{start:{line:691,column:16},end:{line:691,column:60}},"108":{start:{line:694,column:12},end:{line:694,column:35}},"109":{start:{line:695,column:12},end:{line:695,column:47}},"110":{start:{line:699,column:12},end:{line:699,column:53}},"111":{start:{line:700,column:12},end:{line:700,column:56}},"112":{start:{line:701,column:12},end:{line:701,column:54}},"113":{start:{line:702,column:12},end:{line:702,column:53}},"114":{start:{line:722,column:22},end:{line:722,column:40}},"115":{start:{line:726,column:12},end:{line:728,column:13}},"116":{start:{line:727,column:16},end:{line:727,column:42}},"117":{start:{line:730,column:12},end:{line:734,column:14}},"118":{start:{line:738,column:22},end:{line:738,column:40}},"119":{start:{line:742,column:12},end:{line:744,column:13}},"120":{start:{line:743,column:16},end:{line:743,column:42}},"121":{start:{line:746,column:12},end:{line:749,column:14}},"122":{start:{line:769,column:22},end:{line:769,column:40}},"123":{start:{line:773,column:12},end:{line:775,column:13}},"124":{start:{line:774,column:16},end:{line:774,column:42}},"125":{start:{line:777,column:12},end:{line:781,column:14}},"126":{start:{line:801,column:22},end:{line:801,column:40}},"127":{start:{line:805,column:12},end:{line:807,column:13}},"128":{start:{line:806,column:16},end:{line:806,column:42}},"129":{start:{line:809,column:12},end:{line:813,column:14}},"130":{start:{line:828,column:4},end:{line:916,column:7}},"131":{start:{line:844,column:27},end:{line:844,column:60}},"132":{start:{line:846,column:12},end:{line:846,column:43}},"133":{start:{line:847,column:12},end:{line:847,column:39}},"134":{start:{line:848,column:12},end:{line:848,column:34}},"135":{start:{line:849,column:12},end:{line:849,column:29}},"136":{start:{line:853,column:12},end:{line:853,column:60}},"137":{start:{line:854,column:12},end:{line:854,column:60}},"138":{start:{line:855,column:12},end:{line:855,column:65}},"139":{start:{line:856,column:12},end:{line:856,column:60}},"140":{start:{line:857,column:12},end:{line:857,column:59}},"141":{start:{line:866,column:12},end:{line:866,column:50}},"142":{start:{line:878,column:12},end:{line:878,column:48}},"143":{start:{line:879,column:12},end:{line:879,column:43}},"144":{start:{line:892,column:12},end:{line:892,column:50}},"145":{start:{line:903,column:12},end:{line:903,column:36}},"146":{start:{line:914,column:12},end:{line:914,column:31}},"147":{start:{line:929,column:4},end:{line:1238,column:7}},"148":{start:{line:954,column:12},end:{line:954,column:50}},"149":{start:{line:958,column:12},end:{line:958,column:58}},"150":{start:{line:959,column:12},end:{line:959,column:58}},"151":{start:{line:960,column:12},end:{line:960,column:59}},"152":{start:{line:961,column:12},end:{line:961,column:59}},"153":{start:{line:962,column:12},end:{line:962,column:59}},"154":{start:{line:963,column:12},end:{line:963,column:58}},"155":{start:{line:964,column:12},end:{line:964,column:56}},"156":{start:{line:965,column:12},end:{line:965,column:59}},"157":{start:{line:966,column:12},end:{line:966,column:60}},"158":{start:{line:967,column:12},end:{line:967,column:62}},"159":{start:{line:968,column:12},end:{line:968,column:59}},"160":{start:{line:969,column:12},end:{line:969,column:60}},"161":{start:{line:970,column:12},end:{line:970,column:59}},"162":{start:{line:973,column:12},end:{line:973,column:34}},"163":{start:{line:974,column:12},end:{line:974,column:34}},"164":{start:{line:975,column:12},end:{line:975,column:34}},"165":{start:{line:976,column:12},end:{line:976,column:34}},"166":{start:{line:988,column:12},end:{line:988,column:80}},"167":{start:{line:992,column:12},end:{line:997,column:14}},"168":{start:{line:999,column:12},end:{line:999,column:36}},"169":{start:{line:1002,column:12},end:{line:1002,column:58}},"170":{start:{line:1003,column:12},end:{line:1003,column:74}},"171":{start:{line:1004,column:12},end:{line:1004,column:58}},"172":{start:{line:1005,column:12},end:{line:1005,column:58}},"173":{start:{line:1006,column:12},end:{line:1006,column:60}},"174":{start:{line:1007,column:12},end:{line:1007,column:60}},"175":{start:{line:1008,column:12},end:{line:1008,column:60}},"176":{start:{line:1020,column:12},end:{line:1020,column:32}},"177":{start:{line:1032,column:12},end:{line:1032,column:29}},"178":{start:{line:1044,column:12},end:{line:1044,column:31}},"179":{start:{line:1055,column:12},end:{line:1055,column:32}},"180":{start:{line:1066,column:12},end:{line:1066,column:33}},"181":{start:{line:1077,column:12},end:{line:1077,column:35}},"182":{start:{line:1096,column:12},end:{line:1099,column:13}},"183":{start:{line:1097,column:16},end:{line:1097,column:35}},"184":{start:{line:1098,column:16},end:{line:1098,column:29}},"185":{start:{line:1100,column:12},end:{line:1100,column:49}},"186":{start:{line:1102,column:12},end:{line:1102,column:36}},"187":{start:{line:1104,column:23},end:{line:1104,column:27}},"188":{start:{line:1105,column:12},end:{line:1113,column:15}},"189":{start:{line:1106,column:16},end:{line:1112,column:17}},"190":{start:{line:1107,column:20},end:{line:1107,column:34}},"191":{start:{line:1110,column:20},end:{line:1110,column:75}},"192":{start:{line:1111,column:20},end:{line:1111,column:41}},"193":{start:{line:1125,column:12},end:{line:1125,column:49}},"194":{start:{line:1127,column:23},end:{line:1127,column:27}},"195":{start:{line:1128,column:12},end:{line:1130,column:15}},"196":{start:{line:1129,column:16},end:{line:1129,column:30}},"197":{start:{line:1143,column:12},end:{line:1143,column:49}},"198":{start:{line:1145,column:12},end:{line:1147,column:13}},"199":{start:{line:1146,column:16},end:{line:1146,column:71}},"200":{start:{line:1149,column:23},end:{line:1149,column:27}},"201":{start:{line:1150,column:22},end:{line:1168,column:14}},"202":{start:{line:1151,column:16},end:{line:1167,column:17}},"203":{start:{line:1152,column:20},end:{line:1152,column:52}},"204":{start:{line:1153,column:20},end:{line:1153,column:40}},"205":{start:{line:1155,column:21},end:{line:1167,column:17}},"206":{start:{line:1156,column:20},end:{line:1163,column:23}},"207":{start:{line:1157,column:24},end:{line:1162,column:25}},"208":{start:{line:1158,column:28},end:{line:1158,column:35}},"209":{start:{line:1161,column:28},end:{line:1161,column:60}},"210":{start:{line:1166,column:20},end:{line:1166,column:40}},"211":{start:{line:1170,column:12},end:{line:1170,column:23}},"212":{start:{line:1182,column:12},end:{line:1182,column:49}},"213":{start:{line:1184,column:23},end:{line:1184,column:27}},"214":{start:{line:1185,column:12},end:{line:1192,column:15}},"215":{start:{line:1186,column:16},end:{line:1191,column:17}},"216":{start:{line:1187,column:20},end:{line:1187,column:34}},"217":{start:{line:1190,column:20},end:{line:1190,column:41}},"218":{start:{line:1204,column:12},end:{line:1204,column:49}},"219":{start:{line:1206,column:23},end:{line:1206,column:27}},"220":{start:{line:1207,column:12},end:{line:1214,column:15}},"221":{start:{line:1208,column:16},end:{line:1213,column:17}},"222":{start:{line:1209,column:20},end:{line:1209,column:34}},"223":{start:{line:1212,column:20},end:{line:1212,column:41}},"224":{start:{line:1226,column:12},end:{line:1226,column:49}},"225":{start:{line:1228,column:23},end:{line:1228,column:27}},"226":{start:{line:1229,column:12},end:{line:1236,column:15}},"227":{start:{line:1230,column:16},end:{line:1235,column:17}},"228":{start:{line:1231,column:20},end:{line:1231,column:34}},"229":{start:{line:1234,column:20},end:{line:1234,column:41}},"230":{start:{line:1248,column:4},end:{line:1579,column:7}},"231":{start:{line:1273,column:12},end:{line:1273,column:50}},"232":{start:{line:1277,column:12},end:{line:1277,column:66}},"233":{start:{line:1278,column:12},end:{line:1278,column:66}},"234":{start:{line:1279,column:12},end:{line:1279,column:67}},"235":{start:{line:1280,column:12},end:{line:1280,column:65}},"236":{start:{line:1281,column:12},end:{line:1281,column:65}},"237":{start:{line:1282,column:12},end:{line:1282,column:78}},"238":{start:{line:1285,column:12},end:{line:1285,column:38}},"239":{start:{line:1286,column:12},end:{line:1286,column:38}},"240":{start:{line:1287,column:12},end:{line:1287,column:38}},"241":{start:{line:1288,column:12},end:{line:1288,column:38}},"242":{start:{line:1289,column:12},end:{line:1289,column:38}},"243":{start:{line:1301,column:12},end:{line:1301,column:50}},"244":{start:{line:1314,column:12},end:{line:1314,column:36}},"245":{start:{line:1316,column:27},end:{line:1316,column:29}},"246":{start:{line:1317,column:33},end:{line:1317,column:35}},"247":{start:{line:1318,column:37},end:{line:1318,column:59}},"248":{start:{line:1319,column:12},end:{line:1331,column:13}},"249":{start:{line:1319,column:24},end:{line:1319,column:25}},"250":{start:{line:1320,column:28},end:{line:1320,column:49}},"251":{start:{line:1321,column:29},end:{line:1321,column:58}},"252":{start:{line:1322,column:16},end:{line:1322,column:36}},"253":{start:{line:1323,column:16},end:{line:1323,column:38}},"254":{start:{line:1325,column:16},end:{line:1330,column:17}},"255":{start:{line:1326,column:20},end:{line:1326,column:61}},"256":{start:{line:1329,column:20},end:{line:1329,column:59}},"257":{start:{line:1332,column:12},end:{line:1332,column:44}},"258":{start:{line:1333,column:12},end:{line:1333,column:50}},"259":{start:{line:1334,column:12},end:{line:1334,column:62}},"260":{start:{line:1335,column:12},end:{line:1335,column:62}},"261":{start:{line:1336,column:12},end:{line:1336,column:64}},"262":{start:{line:1348,column:12},end:{line:1348,column:31}},"263":{start:{line:1359,column:12},end:{line:1359,column:32}},"264":{start:{line:1370,column:12},end:{line:1370,column:33}},"265":{start:{line:1389,column:12},end:{line:1392,column:13}},"266":{start:{line:1390,column:16},end:{line:1390,column:35}},"267":{start:{line:1391,column:16},end:{line:1391,column:29}},"268":{start:{line:1393,column:12},end:{line:1393,column:49}},"269":{start:{line:1395,column:12},end:{line:1395,column:36}},"270":{start:{line:1396,column:12},end:{line:1398,column:13}},"271":{start:{line:1397,column:16},end:{line:1397,column:34}},"272":{start:{line:1400,column:23},end:{line:1400,column:27}},"273":{start:{line:1401,column:22},end:{line:1409,column:14}},"274":{start:{line:1402,column:16},end:{line:1408,column:17}},"275":{start:{line:1403,column:20},end:{line:1403,column:34}},"276":{start:{line:1406,column:20},end:{line:1406,column:46}},"277":{start:{line:1407,column:20},end:{line:1407,column:41}},"278":{start:{line:1411,column:12},end:{line:1411,column:23}},"279":{start:{line:1415,column:12},end:{line:1415,column:36}},"280":{start:{line:1416,column:12},end:{line:1418,column:13}},"281":{start:{line:1417,column:16},end:{line:1417,column:34}},"282":{start:{line:1420,column:23},end:{line:1420,column:27}},"283":{start:{line:1421,column:27},end:{line:1421,column:57}},"284":{start:{line:1423,column:12},end:{line:1423,column:38}},"285":{start:{line:1424,column:12},end:{line:1424,column:24}},"286":{start:{line:1449,column:12},end:{line:1451,column:13}},"287":{start:{line:1450,column:16},end:{line:1450,column:33}},"288":{start:{line:1453,column:12},end:{line:1455,column:13}},"289":{start:{line:1454,column:16},end:{line:1454,column:64}},"290":{start:{line:1457,column:12},end:{line:1459,column:13}},"291":{start:{line:1458,column:16},end:{line:1458,column:136}},"292":{start:{line:1461,column:27},end:{line:1461,column:31}},"293":{start:{line:1462,column:12},end:{line:1504,column:13}},"294":{start:{line:1463,column:31},end:{line:1463,column:55}},"295":{start:{line:1465,column:16},end:{line:1500,column:17}},"296":{start:{line:1470,column:20},end:{line:1470,column:39}},"297":{start:{line:1472,column:21},end:{line:1500,column:17}},"298":{start:{line:1476,column:20},end:{line:1476,column:84}},"299":{start:{line:1477,column:20},end:{line:1482,column:21}},"300":{start:{line:1478,column:24},end:{line:1478,column:43}},"301":{start:{line:1481,column:24},end:{line:1481,column:36}},"302":{start:{line:1484,column:21},end:{line:1500,column:17}},"303":{start:{line:1488,column:20},end:{line:1488,column:77}},"304":{start:{line:1493,column:20},end:{line:1499,column:21}},"305":{start:{line:1493,column:32},end:{line:1493,column:33}},"306":{start:{line:1494,column:37},end:{line:1494,column:48}},"307":{start:{line:1495,column:24},end:{line:1495,column:88}},"308":{start:{line:1496,column:24},end:{line:1498,column:25}},"309":{start:{line:1497,column:28},end:{line:1497,column:42}},"310":{start:{line:1503,column:16},end:{line:1503,column:28}},"311":{start:{line:1525,column:12},end:{line:1525,column:49}},"312":{start:{line:1526,column:23},end:{line:1526,column:27}},"313":{start:{line:1527,column:22},end:{line:1554,column:14}},"314":{start:{line:1528,column:16},end:{line:1553,column:17}},"315":{start:{line:1529,column:20},end:{line:1529,column:34}},"316":{start:{line:1532,column:32},end:{line:1532,column:51}},"317":{start:{line:1533,column:20},end:{line:1535,column:21}},"318":{start:{line:1534,column:24},end:{line:1534,column:41}},"319":{start:{line:1537,column:33},end:{line:1537,column:62}},"320":{start:{line:1538,column:20},end:{line:1538,column:40}},"321":{start:{line:1540,column:20},end:{line:1552,column:21}},"322":{start:{line:1541,column:24},end:{line:1548,column:27}},"323":{start:{line:1542,column:28},end:{line:1547,column:29}},"324":{start:{line:1543,column:32},end:{line:1543,column:39}},"325":{start:{line:1546,column:32},end:{line:1546,column:64}},"326":{start:{line:1551,column:24},end:{line:1551,column:47}},"327":{start:{line:1556,column:12},end:{line:1556,column:23}},"328":{start:{line:1575,column:12},end:{line:1575,column:49}},"329":{start:{line:1577,column:12},end:{line:1577,column:47}},"330":{start:{line:1589,column:4},end:{line:1843,column:7}},"331":{start:{line:1596,column:12},end:{line:1596,column:77}},"332":{start:{line:1614,column:12},end:{line:1614,column:29}},"333":{start:{line:1615,column:12},end:{line:1615,column:57}},"334":{start:{line:1617,column:12},end:{line:1617,column:67}},"335":{start:{line:1618,column:12},end:{line:1618,column:64}},"336":{start:{line:1619,column:12},end:{line:1619,column:63}},"337":{start:{line:1620,column:12},end:{line:1620,column:68}},"338":{start:{line:1637,column:12},end:{line:1637,column:78}},"339":{start:{line:1657,column:12},end:{line:1657,column:49}},"340":{start:{line:1659,column:23},end:{line:1659,column:27}},"341":{start:{line:1660,column:22},end:{line:1662,column:14}},"342":{start:{line:1661,column:16},end:{line:1661,column:36}},"343":{start:{line:1664,column:12},end:{line:1664,column:23}},"344":{start:{line:1689,column:12},end:{line:1692,column:13}},"345":{start:{line:1690,column:16},end:{line:1690,column:35}},"346":{start:{line:1691,column:16},end:{line:1691,column:29}},"347":{start:{line:1694,column:12},end:{line:1694,column:49}},"348":{start:{line:1695,column:12},end:{line:1695,column:36}},"349":{start:{line:1697,column:23},end:{line:1697,column:27}},"350":{start:{line:1698,column:22},end:{line:1708,column:14}},"351":{start:{line:1699,column:16},end:{line:1702,column:17}},"352":{start:{line:1700,column:20},end:{line:1700,column:34}},"353":{start:{line:1701,column:20},end:{line:1701,column:27}},"354":{start:{line:1704,column:26},end:{line:1704,column:43}},"355":{start:{line:1705,column:26},end:{line:1705,column:73}},"356":{start:{line:1707,column:16},end:{line:1707,column:42}},"357":{start:{line:1710,column:12},end:{line:1710,column:23}},"358":{start:{line:1726,column:12},end:{line:1726,column:69}},"359":{start:{line:1749,column:12},end:{line:1752,column:13}},"360":{start:{line:1750,column:16},end:{line:1750,column:35}},"361":{start:{line:1751,column:16},end:{line:1751,column:29}},"362":{start:{line:1754,column:12},end:{line:1754,column:49}},"363":{start:{line:1755,column:12},end:{line:1755,column:36}},"364":{start:{line:1757,column:23},end:{line:1757,column:27}},"365":{start:{line:1758,column:12},end:{line:1776,column:15}},"366":{start:{line:1759,column:16},end:{line:1762,column:17}},"367":{start:{line:1760,column:20},end:{line:1760,column:34}},"368":{start:{line:1761,column:20},end:{line:1761,column:27}},"369":{start:{line:1764,column:27},end:{line:1764,column:29}},"370":{start:{line:1765,column:27},end:{line:1765,column:52}},"371":{start:{line:1766,column:16},end:{line:1773,column:17}},"372":{start:{line:1766,column:28},end:{line:1766,column:29}},"373":{start:{line:1767,column:34},end:{line:1767,column:56}},"374":{start:{line:1768,column:36},end:{line:1768,column:74}},"375":{start:{line:1769,column:30},end:{line:1769,column:81}},"376":{start:{line:1771,column:20},end:{line:1771,column:39}},"377":{start:{line:1772,column:20},end:{line:1772,column:35}},"378":{start:{line:1775,column:16},end:{line:1775,column:43}},"379":{start:{line:1795,column:12},end:{line:1795,column:49}},"380":{start:{line:1797,column:23},end:{line:1797,column:27}},"381":{start:{line:1798,column:12},end:{line:1800,column:15}},"382":{start:{line:1799,column:16},end:{line:1799,column:65}},"383":{start:{line:1816,column:12},end:{line:1816,column:34}},"384":{start:{line:1818,column:12},end:{line:1841,column:13}},"385":{start:{line:1819,column:29},end:{line:1819,column:40}},"386":{start:{line:1820,column:26},end:{line:1835,column:18}},"387":{start:{line:1821,column:20},end:{line:1834,column:21}},"388":{start:{line:1822,column:24},end:{line:1822,column:38}},"389":{start:{line:1825,column:24},end:{line:1825,column:67}},"390":{start:{line:1826,column:24},end:{line:1833,column:27}},"391":{start:{line:1827,column:28},end:{line:1832,column:29}},"392":{start:{line:1828,column:32},end:{line:1828,column:39}},"393":{start:{line:1831,column:32},end:{line:1831,column:64}},"394":{start:{line:1837,column:16},end:{line:1837,column:27}},"395":{start:{line:1840,column:16},end:{line:1840,column:53}},"396":{start:{line:1854,column:4},end:{line:1893,column:7}},"397":{start:{line:1861,column:12},end:{line:1861,column:39}},"398":{start:{line:1873,column:34},end:{line:1873,column:70}},"399":{start:{line:1874,column:12},end:{line:1874,column:83}},"400":{start:{line:1891,column:12},end:{line:1891,column:57}},"401":{start:{line:1903,column:4},end:{line:1931,column:7}},"402":{start:{line:1910,column:12},end:{line:1910,column:80}},"403":{start:{line:1928,column:12},end:{line:1928,column:29}},"404":{start:{line:1929,column:12},end:{line:1929,column:57}},"405":{start:{line:1941,column:4},end:{line:1991,column:7}},"406":{start:{line:1957,column:12},end:{line:1957,column:42}},"407":{start:{line:1971,column:34},end:{line:1971,column:70}},"408":{start:{line:1972,column:12},end:{line:1972,column:87}},"409":{start:{line:1989,column:12},end:{line:1989,column:57}},"410":{start:{line:2002,column:4},end:{line:2143,column:7}},"411":{start:{line:2009,column:12},end:{line:2009,column:75}},"412":{start:{line:2021,column:12},end:{line:2021,column:51}},"413":{start:{line:2031,column:12},end:{line:2031,column:56}},"414":{start:{line:2045,column:12},end:{line:2045,column:51}},"415":{start:{line:2057,column:12},end:{line:2057,column:70}},"416":{start:{line:2067,column:12},end:{line:2067,column:62}},"417":{start:{line:2078,column:12},end:{line:2078,column:66}},"418":{start:{line:2088,column:12},end:{line:2088,column:49}},"419":{start:{line:2098,column:12},end:{line:2098,column:58}},"420":{start:{line:2110,column:12},end:{line:2110,column:67}},"421":{start:{line:2122,column:12},end:{line:2122,column:74}},"422":{start:{line:2140,column:12},end:{line:2140,column:29}},"423":{start:{line:2141,column:12},end:{line:2141,column:57}},"424":{start:{line:2154,column:4},end:{line:2243,column:7}},"425":{start:{line:2161,column:12},end:{line:2161,column:75}},"426":{start:{line:2173,column:12},end:{line:2173,column:78}},"427":{start:{line:2194,column:12},end:{line:2197,column:13}},"428":{start:{line:2195,column:16},end:{line:2195,column:35}},"429":{start:{line:2196,column:16},end:{line:2196,column:29}},"430":{start:{line:2199,column:12},end:{line:2199,column:49}},"431":{start:{line:2200,column:12},end:{line:2200,column:36}},"432":{start:{line:2202,column:23},end:{line:2202,column:27}},"433":{start:{line:2203,column:12},end:{line:2220,column:15}},"434":{start:{line:2204,column:16},end:{line:2207,column:17}},"435":{start:{line:2205,column:20},end:{line:2205,column:34}},"436":{start:{line:2206,column:20},end:{line:2206,column:27}},"437":{start:{line:2209,column:34},end:{line:2209,column:36}},"438":{start:{line:2210,column:27},end:{line:2210,column:52}},"439":{start:{line:2211,column:16},end:{line:2217,column:17}},"440":{start:{line:2211,column:29},end:{line:2211,column:30}},"441":{start:{line:2212,column:41},end:{line:2212,column:63}},"442":{start:{line:2213,column:36},end:{line:2213,column:81}},"443":{start:{line:2214,column:37},end:{line:2214,column:102}},"444":{start:{line:2215,column:20},end:{line:2215,column:53}},"445":{start:{line:2216,column:20},end:{line:2216,column:49}},"446":{start:{line:2219,column:16},end:{line:2219,column:50}},"447":{start:{line:2238,column:12},end:{line:2238,column:29}},"448":{start:{line:2239,column:12},end:{line:2239,column:57}},"449":{start:{line:2241,column:12},end:{line:2241,column:52}},"450":{start:{line:2255,column:4},end:{line:2306,column:7}},"451":{start:{line:2262,column:12},end:{line:2262,column:37}},"452":{start:{line:2274,column:34},end:{line:2274,column:70}},"453":{start:{line:2275,column:12},end:{line:2275,column:87}},"454":{start:{line:2284,column:12},end:{line:2284,column:95}},"455":{start:{line:2301,column:12},end:{line:2301,column:57}},"456":{start:{line:2303,column:12},end:{line:2303,column:78}},"457":{start:{line:2304,column:12},end:{line:2304,column:56}},"458":{start:{line:2316,column:4},end:{line:2409,column:7}},"459":{start:{line:2331,column:12},end:{line:2331,column:68}},"460":{start:{line:2345,column:12},end:{line:2345,column:29}},"461":{start:{line:2346,column:12},end:{line:2346,column:50}},"462":{start:{line:2348,column:12},end:{line:2348,column:63}},"463":{start:{line:2349,column:12},end:{line:2349,column:64}},"464":{start:{line:2368,column:12},end:{line:2368,column:49}},"465":{start:{line:2370,column:23},end:{line:2370,column:27}},"466":{start:{line:2371,column:12},end:{line:2378,column:15}},"467":{start:{line:2372,column:16},end:{line:2377,column:17}},"468":{start:{line:2373,column:20},end:{line:2373,column:34}},"469":{start:{line:2376,column:20},end:{line:2376,column:70}},"470":{start:{line:2397,column:12},end:{line:2397,column:49}},"471":{start:{line:2399,column:23},end:{line:2399,column:27}},"472":{start:{line:2400,column:12},end:{line:2407,column:15}},"473":{start:{line:2401,column:16},end:{line:2406,column:17}},"474":{start:{line:2402,column:20},end:{line:2402,column:34}},"475":{start:{line:2405,column:20},end:{line:2405,column:70}},"476":{start:{line:2419,column:4},end:{line:2462,column:7}},"477":{start:{line:2435,column:12},end:{line:2435,column:30}},"478":{start:{line:2447,column:12},end:{line:2447,column:70}},"479":{start:{line:2460,column:12},end:{line:2460,column:50}},"480":{start:{line:2471,column:4},end:{line:2494,column:7}},"481":{start:{line:2478,column:12},end:{line:2478,column:30}},"482":{start:{line:2491,column:12},end:{line:2491,column:38}},"483":{start:{line:2492,column:12},end:{line:2492,column:50}},"484":{start:{line:2504,column:4},end:{line:2528,column:7}},"485":{start:{line:2511,column:12},end:{line:2511,column:69}},"486":{start:{line:2525,column:12},end:{line:2525,column:29}},"487":{start:{line:2526,column:12},end:{line:2526,column:50}},"488":{start:{line:2538,column:4},end:{line:2618,column:7}},"489":{start:{line:2554,column:12},end:{line:2554,column:31}},"490":{start:{line:2566,column:12},end:{line:2566,column:63}},"491":{start:{line:2579,column:12},end:{line:2579,column:50}},"492":{start:{line:2593,column:12},end:{line:2593,column:49}},"493":{start:{line:2595,column:23},end:{line:2595,column:27}},"494":{start:{line:2596,column:22},end:{line:2614,column:14}},"495":{start:{line:2597,column:16},end:{line:2613,column:17}},"496":{start:{line:2598,column:20},end:{line:2598,column:34}},"497":{start:{line:2602,column:32},end:{line:2602,column:51}},"498":{start:{line:2604,column:33},end:{line:2604,column:62}},"499":{start:{line:2605,column:20},end:{line:2612,column:23}},"500":{start:{line:2606,column:24},end:{line:2611,column:25}},"501":{start:{line:2607,column:28},end:{line:2607,column:35}},"502":{start:{line:2610,column:28},end:{line:2610,column:60}},"503":{start:{line:2616,column:12},end:{line:2616,column:23}},"504":{start:{line:2628,column:4},end:{line:2656,column:7}},"505":{start:{line:2635,column:12},end:{line:2635,column:69}},"506":{start:{line:2653,column:12},end:{line:2653,column:29}},"507":{start:{line:2654,column:12},end:{line:2654,column:57}},"508":{start:{line:2666,column:4},end:{line:2705,column:7}},"509":{start:{line:2673,column:12},end:{line:2673,column:31}},"510":{start:{line:2685,column:34},end:{line:2685,column:70}},"511":{start:{line:2686,column:12},end:{line:2686,column:76}},"512":{start:{line:2703,column:12},end:{line:2703,column:57}},"513":{start:{line:2714,column:4},end:{line:2792,column:7}},"514":{start:{line:2721,column:12},end:{line:2721,column:71}},"515":{start:{line:2739,column:12},end:{line:2739,column:29}},"516":{start:{line:2740,column:12},end:{line:2740,column:57}},"517":{start:{line:2742,column:12},end:{line:2742,column:66}},"518":{start:{line:2767,column:12},end:{line:2770,column:13}},"519":{start:{line:2768,column:16},end:{line:2768,column:34}},"520":{start:{line:2769,column:16},end:{line:2769,column:28}},"521":{start:{line:2772,column:12},end:{line:2772,column:49}},"522":{start:{line:2773,column:12},end:{line:2773,column:34}},"523":{start:{line:2776,column:12},end:{line:2776,column:40}},"524":{start:{line:2778,column:23},end:{line:2778,column:27}},"525":{start:{line:2779,column:12},end:{line:2781,column:15}},"526":{start:{line:2780,column:16},end:{line:2780,column:44}},"527":{start:{line:2785,column:12},end:{line:2790,column:13}},"528":{start:{line:2786,column:16},end:{line:2786,column:75}},"529":{start:{line:2789,column:16},end:{line:2789,column:45}},"530":{start:{line:2802,column:4},end:{line:2873,column:7}},"531":{start:{line:2809,column:12},end:{line:2809,column:33}},"532":{start:{line:2821,column:34},end:{line:2821,column:70}},"533":{start:{line:2822,column:12},end:{line:2822,column:77}},"534":{start:{line:2839,column:12},end:{line:2839,column:57}},"535":{start:{line:2862,column:12},end:{line:2866,column:13}},"536":{start:{line:2863,column:16},end:{line:2863,column:34}},"537":{start:{line:2864,column:16},end:{line:2864,column:30}},"538":{start:{line:2865,column:16},end:{line:2865,column:35}},"539":{start:{line:2868,column:12},end:{line:2868,column:34}},"540":{start:{line:2869,column:12},end:{line:2869,column:34}},"541":{start:{line:2871,column:12},end:{line:2871,column:49}},"542":{start:{line:2883,column:4},end:{line:2914,column:7}},"543":{start:{line:2890,column:23},end:{line:2890,column:67}},"544":{start:{line:2891,column:12},end:{line:2891,column:116}},"545":{start:{line:2910,column:12},end:{line:2910,column:29}},"546":{start:{line:2911,column:12},end:{line:2911,column:29}},"547":{start:{line:2912,column:12},end:{line:2912,column:57}},"548":{start:{line:2925,column:4},end:{line:3017,column:7}},"549":{start:{line:2932,column:12},end:{line:2932,column:83}},"550":{start:{line:2946,column:12},end:{line:2946,column:100}},"551":{start:{line:2958,column:34},end:{line:2958,column:70}},"552":{start:{line:2959,column:12},end:{line:2959,column:102}},"553":{start:{line:2977,column:12},end:{line:2977,column:29}},"554":{start:{line:2978,column:12},end:{line:2978,column:57}},"555":{start:{line:3001,column:12},end:{line:3005,column:13}},"556":{start:{line:3002,column:16},end:{line:3002,column:34}},"557":{start:{line:3003,column:16},end:{line:3003,column:36}},"558":{start:{line:3004,column:16},end:{line:3004,column:41}},"559":{start:{line:3007,column:12},end:{line:3010,column:13}},"560":{start:{line:3008,column:16},end:{line:3008,column:34}},"561":{start:{line:3009,column:16},end:{line:3009,column:28}},"562":{start:{line:3012,column:12},end:{line:3012,column:34}},"563":{start:{line:3013,column:12},end:{line:3013,column:40}},"564":{start:{line:3015,column:12},end:{line:3015,column:49}},"565":{start:{line:3027,column:4},end:{line:3213,column:7}},"566":{start:{line:3043,column:12},end:{line:3043,column:36}},"567":{start:{line:3055,column:12},end:{line:3055,column:88}},"568":{start:{line:3072,column:12},end:{line:3074,column:13}},"569":{start:{line:3073,column:16},end:{line:3073,column:84}},"570":{start:{line:3076,column:12},end:{line:3076,column:57}},"571":{start:{line:3098,column:12},end:{line:3100,column:13}},"572":{start:{line:3099,column:16},end:{line:3099,column:46}},"573":{start:{line:3102,column:12},end:{line:3102,column:49}},"574":{start:{line:3104,column:23},end:{line:3104,column:27}},"575":{start:{line:3105,column:22},end:{line:3120,column:14}},"576":{start:{line:3106,column:16},end:{line:3119,column:17}},"577":{start:{line:3107,column:20},end:{line:3107,column:34}},"578":{start:{line:3110,column:33},end:{line:3110,column:83}},"579":{start:{line:3111,column:20},end:{line:3118,column:23}},"580":{start:{line:3112,column:24},end:{line:3117,column:25}},"581":{start:{line:3113,column:28},end:{line:3113,column:35}},"582":{start:{line:3116,column:28},end:{line:3116,column:60}},"583":{start:{line:3122,column:12},end:{line:3122,column:23}},"584":{start:{line:3126,column:12},end:{line:3150,column:13}},"585":{start:{line:3127,column:27},end:{line:3127,column:31}},"586":{start:{line:3130,column:31},end:{line:3130,column:73}},"587":{start:{line:3133,column:28},end:{line:3133,column:83}},"588":{start:{line:3133,column:63},end:{line:3133,column:82}},"589":{start:{line:3136,column:16},end:{line:3138,column:17}},"590":{start:{line:3137,column:20},end:{line:3137,column:113}},"591":{start:{line:3141,column:40},end:{line:3141,column:90}},"592":{start:{line:3144,column:34},end:{line:3144,column:68}},"593":{start:{line:3146,column:16},end:{line:3146,column:43}},"594":{start:{line:3149,column:16},end:{line:3149,column:72}},"595":{start:{line:3154,column:12},end:{line:3168,column:13}},"596":{start:{line:3157,column:36},end:{line:3157,column:53}},"597":{start:{line:3159,column:16},end:{line:3164,column:17}},"598":{start:{line:3160,column:20},end:{line:3160,column:115}},"599":{start:{line:3163,column:20},end:{line:3163,column:51}},"600":{start:{line:3167,column:16},end:{line:3167,column:72}},"601":{start:{line:3172,column:12},end:{line:3172,column:49}},"602":{start:{line:3173,column:23},end:{line:3173,column:27}},"603":{start:{line:3176,column:40},end:{line:3176,column:74}},"604":{start:{line:3177,column:29},end:{line:3177,column:55}},"605":{start:{line:3180,column:12},end:{line:3189,column:13}},"606":{start:{line:3181,column:16},end:{line:3181,column:51}},"607":{start:{line:3182,column:16},end:{line:3182,column:68}},"608":{start:{line:3184,column:16},end:{line:3185,column:95}},"609":{start:{line:3185,column:38},end:{line:3185,column:92}},"610":{start:{line:3187,column:16},end:{line:3187,column:82}},"611":{start:{line:3188,column:16},end:{line:3188,column:57}},"612":{start:{line:3192,column:42},end:{line:3192,column:88}},"613":{start:{line:3193,column:31},end:{line:3193,column:61}},"614":{start:{line:3196,column:12},end:{line:3211,column:13}},"615":{start:{line:3197,column:16},end:{line:3197,column:53}},"616":{start:{line:3198,column:16},end:{line:3198,column:70}},"617":{start:{line:3200,column:16},end:{line:3203,column:19}},"618":{start:{line:3201,column:20},end:{line:3201,column:75}},"619":{start:{line:3202,column:20},end:{line:3202,column:31}},"620":{start:{line:3207,column:16},end:{line:3210,column:19}},"621":{start:{line:3208,column:20},end:{line:3208,column:75}},"622":{start:{line:3209,column:20},end:{line:3209,column:31}},"623":{start:{line:3223,column:4},end:{line:3814,column:7}},"624":{start:{line:3230,column:12},end:{line:3230,column:68}},"625":{start:{line:3248,column:12},end:{line:3248,column:28}},"626":{start:{line:3249,column:12},end:{line:3249,column:57}},"627":{start:{line:3250,column:12},end:{line:3250,column:27}},"628":{start:{line:3254,column:12},end:{line:3254,column:64}},"629":{start:{line:3255,column:12},end:{line:3255,column:72}},"630":{start:{line:3256,column:12},end:{line:3256,column:71}},"631":{start:{line:3257,column:12},end:{line:3257,column:64}},"632":{start:{line:3258,column:12},end:{line:3258,column:66}},"633":{start:{line:3259,column:12},end:{line:3259,column:63}},"634":{start:{line:3260,column:12},end:{line:3260,column:65}},"635":{start:{line:3261,column:12},end:{line:3261,column:65}},"636":{start:{line:3262,column:12},end:{line:3262,column:67}},"637":{start:{line:3263,column:12},end:{line:3263,column:69}},"638":{start:{line:3264,column:12},end:{line:3264,column:64}},"639":{start:{line:3265,column:12},end:{line:3265,column:65}},"640":{start:{line:3266,column:12},end:{line:3266,column:66}},"641":{start:{line:3267,column:12},end:{line:3267,column:63}},"642":{start:{line:3268,column:12},end:{line:3268,column:65}},"643":{start:{line:3287,column:22},end:{line:3287,column:72}},"644":{start:{line:3289,column:12},end:{line:3289,column:23}},"645":{start:{line:3308,column:12},end:{line:3308,column:49}},"646":{start:{line:3310,column:23},end:{line:3310,column:27}},"647":{start:{line:3311,column:22},end:{line:3313,column:14}},"648":{start:{line:3312,column:16},end:{line:3312,column:36}},"649":{start:{line:3315,column:12},end:{line:3315,column:23}},"650":{start:{line:3334,column:12},end:{line:3334,column:49}},"651":{start:{line:3336,column:23},end:{line:3336,column:27}},"652":{start:{line:3337,column:22},end:{line:3339,column:14}},"653":{start:{line:3338,column:16},end:{line:3338,column:36}},"654":{start:{line:3341,column:12},end:{line:3341,column:23}},"655":{start:{line:3361,column:12},end:{line:3361,column:49}},"656":{start:{line:3362,column:12},end:{line:3362,column:34}},"657":{start:{line:3363,column:12},end:{line:3363,column:67}},"658":{start:{line:3365,column:23},end:{line:3365,column:27}},"659":{start:{line:3366,column:12},end:{line:3373,column:15}},"660":{start:{line:3367,column:16},end:{line:3372,column:17}},"661":{start:{line:3368,column:20},end:{line:3368,column:34}},"662":{start:{line:3371,column:20},end:{line:3371,column:56}},"663":{start:{line:3392,column:12},end:{line:3392,column:49}},"664":{start:{line:3394,column:23},end:{line:3394,column:27}},"665":{start:{line:3395,column:22},end:{line:3397,column:14}},"666":{start:{line:3396,column:16},end:{line:3396,column:36}},"667":{start:{line:3399,column:12},end:{line:3399,column:23}},"668":{start:{line:3414,column:12},end:{line:3414,column:74}},"669":{start:{line:3433,column:12},end:{line:3433,column:49}},"670":{start:{line:3435,column:23},end:{line:3435,column:27}},"671":{start:{line:3436,column:22},end:{line:3438,column:14}},"672":{start:{line:3437,column:16},end:{line:3437,column:36}},"673":{start:{line:3440,column:12},end:{line:3440,column:23}},"674":{start:{line:3460,column:12},end:{line:3460,column:49}},"675":{start:{line:3461,column:12},end:{line:3461,column:34}},"676":{start:{line:3462,column:12},end:{line:3462,column:67}},"677":{start:{line:3464,column:23},end:{line:3464,column:27}},"678":{start:{line:3465,column:12},end:{line:3472,column:15}},"679":{start:{line:3466,column:16},end:{line:3471,column:17}},"680":{start:{line:3467,column:20},end:{line:3467,column:34}},"681":{start:{line:3470,column:20},end:{line:3470,column:56}},"682":{start:{line:3497,column:12},end:{line:3497,column:49}},"683":{start:{line:3498,column:12},end:{line:3498,column:34}},"684":{start:{line:3499,column:12},end:{line:3499,column:67}},"685":{start:{line:3501,column:23},end:{line:3501,column:27}},"686":{start:{line:3502,column:12},end:{line:3509,column:15}},"687":{start:{line:3503,column:16},end:{line:3508,column:17}},"688":{start:{line:3504,column:20},end:{line:3504,column:34}},"689":{start:{line:3507,column:20},end:{line:3507,column:56}},"690":{start:{line:3528,column:12},end:{line:3528,column:49}},"691":{start:{line:3530,column:23},end:{line:3530,column:27}},"692":{start:{line:3531,column:12},end:{line:3538,column:15}},"693":{start:{line:3532,column:16},end:{line:3537,column:17}},"694":{start:{line:3533,column:20},end:{line:3533,column:34}},"695":{start:{line:3536,column:20},end:{line:3536,column:56}},"696":{start:{line:3558,column:12},end:{line:3558,column:49}},"697":{start:{line:3560,column:23},end:{line:3560,column:27}},"698":{start:{line:3561,column:22},end:{line:3563,column:14}},"699":{start:{line:3562,column:16},end:{line:3562,column:36}},"700":{start:{line:3565,column:12},end:{line:3565,column:23}},"701":{start:{line:3586,column:12},end:{line:3586,column:49}},"702":{start:{line:3588,column:23},end:{line:3588,column:27}},"703":{start:{line:3589,column:22},end:{line:3591,column:14}},"704":{start:{line:3590,column:16},end:{line:3590,column:36}},"705":{start:{line:3593,column:12},end:{line:3593,column:23}},"706":{start:{line:3613,column:12},end:{line:3613,column:49}},"707":{start:{line:3615,column:23},end:{line:3615,column:27}},"708":{start:{line:3616,column:12},end:{line:3623,column:15}},"709":{start:{line:3617,column:16},end:{line:3622,column:17}},"710":{start:{line:3618,column:20},end:{line:3618,column:34}},"711":{start:{line:3621,column:20},end:{line:3621,column:56}},"712":{start:{line:3643,column:12},end:{line:3643,column:49}},"713":{start:{line:3645,column:23},end:{line:3645,column:27}},"714":{start:{line:3646,column:12},end:{line:3653,column:15}},"715":{start:{line:3647,column:16},end:{line:3652,column:17}},"716":{start:{line:3648,column:20},end:{line:3648,column:34}},"717":{start:{line:3651,column:20},end:{line:3651,column:56}},"718":{start:{line:3673,column:12},end:{line:3673,column:49}},"719":{start:{line:3675,column:23},end:{line:3675,column:27}},"720":{start:{line:3676,column:22},end:{line:3678,column:14}},"721":{start:{line:3677,column:16},end:{line:3677,column:36}},"722":{start:{line:3680,column:12},end:{line:3680,column:23}},"723":{start:{line:3700,column:25},end:{line:3700,column:46}},"724":{start:{line:3702,column:12},end:{line:3706,column:13}},"725":{start:{line:3703,column:16},end:{line:3705,column:18}},"726":{start:{line:3709,column:16},end:{line:3712,column:32}},"727":{start:{line:3715,column:12},end:{line:3715,column:63}},"728":{start:{line:3716,column:12},end:{line:3716,column:69}},"729":{start:{line:3717,column:12},end:{line:3717,column:61}},"730":{start:{line:3718,column:12},end:{line:3718,column:65}},"731":{start:{line:3719,column:12},end:{line:3719,column:63}},"732":{start:{line:3722,column:12},end:{line:3722,column:71}},"733":{start:{line:3723,column:12},end:{line:3723,column:89}},"734":{start:{line:3725,column:23},end:{line:3725,column:27}},"735":{start:{line:3726,column:31},end:{line:3726,column:36}},"736":{start:{line:3727,column:30},end:{line:3727,column:35}},"737":{start:{line:3728,column:12},end:{line:3786,column:14}},"738":{start:{line:3729,column:29},end:{line:3729,column:49}},"739":{start:{line:3731,column:20},end:{line:3779,column:23}},"740":{start:{line:3732,column:24},end:{line:3735,column:25}},"741":{start:{line:3733,column:28},end:{line:3733,column:47}},"742":{start:{line:3734,column:28},end:{line:3734,column:35}},"743":{start:{line:3737,column:44},end:{line:3737,column:74}},"744":{start:{line:3738,column:39},end:{line:3738,column:96}},"745":{start:{line:3739,column:24},end:{line:3776,column:25}},"746":{start:{line:3740,column:28},end:{line:3740,column:53}},"747":{start:{line:3743,column:28},end:{line:3756,column:29}},"748":{start:{line:3744,column:32},end:{line:3744,column:53}},"749":{start:{line:3745,column:32},end:{line:3745,column:52}},"750":{start:{line:3749,column:32},end:{line:3755,column:33}},"751":{start:{line:3750,column:36},end:{line:3750,column:70}},"752":{start:{line:3752,column:36},end:{line:3752,column:55}},"753":{start:{line:3753,column:36},end:{line:3753,column:52}},"754":{start:{line:3754,column:36},end:{line:3754,column:43}},"755":{start:{line:3758,column:28},end:{line:3758,column:52}},"756":{start:{line:3760,column:40},end:{line:3760,column:56}},"757":{start:{line:3762,column:28},end:{line:3775,column:29}},"758":{start:{line:3763,column:32},end:{line:3763,column:52}},"759":{start:{line:3765,column:32},end:{line:3765,column:51}},"760":{start:{line:3766,column:32},end:{line:3766,column:48}},"761":{start:{line:3767,column:32},end:{line:3767,column:39}},"762":{start:{line:3769,column:33},end:{line:3775,column:29}},"763":{start:{line:3770,column:32},end:{line:3770,column:54}},"764":{start:{line:3772,column:32},end:{line:3772,column:51}},"765":{start:{line:3773,column:32},end:{line:3773,column:48}},"766":{start:{line:3774,column:32},end:{line:3774,column:39}},"767":{start:{line:3778,column:24},end:{line:3778,column:59}},"768":{start:{line:3782,column:20},end:{line:3784,column:21}},"769":{start:{line:3783,column:24},end:{line:3783,column:45}},"770":{start:{line:3805,column:12},end:{line:3805,column:49}},"771":{start:{line:3807,column:23},end:{line:3807,column:27}},"772":{start:{line:3808,column:22},end:{line:3810,column:14}},"773":{start:{line:3809,column:16},end:{line:3809,column:36}},"774":{start:{line:3812,column:12},end:{line:3812,column:23}},"775":{start:{line:3824,column:4},end:{line:4015,column:7}},"776":{start:{line:3831,column:12},end:{line:3831,column:30}},"777":{start:{line:3843,column:22},end:{line:3843,column:39}},"778":{start:{line:3844,column:34},end:{line:3844,column:70}},"779":{start:{line:3845,column:12},end:{line:3845,column:68}},"780":{start:{line:3862,column:12},end:{line:3862,column:57}},"781":{start:{line:3866,column:12},end:{line:3866,column:60}},"782":{start:{line:3889,column:12},end:{line:3893,column:13}},"783":{start:{line:3890,column:16},end:{line:3890,column:34}},"784":{start:{line:3891,column:16},end:{line:3891,column:31}},"785":{start:{line:3892,column:16},end:{line:3892,column:38}},"786":{start:{line:3895,column:12},end:{line:3895,column:49}},"787":{start:{line:3896,column:12},end:{line:3896,column:34}},"788":{start:{line:3897,column:12},end:{line:3897,column:34}},"789":{start:{line:3899,column:12},end:{line:3901,column:13}},"790":{start:{line:3900,column:16},end:{line:3900,column:104}},"791":{start:{line:3903,column:12},end:{line:3906,column:13}},"792":{start:{line:3904,column:16},end:{line:3904,column:72}},"793":{start:{line:3905,column:16},end:{line:3905,column:23}},"794":{start:{line:3907,column:23},end:{line:3907,column:27}},"795":{start:{line:3908,column:12},end:{line:3916,column:15}},"796":{start:{line:3909,column:16},end:{line:3915,column:17}},"797":{start:{line:3910,column:20},end:{line:3910,column:34}},"798":{start:{line:3913,column:30},end:{line:3913,column:91}},"799":{start:{line:3914,column:20},end:{line:3914,column:40}},"800":{start:{line:3945,column:12},end:{line:3945,column:56}},"801":{start:{line:3972,column:12},end:{line:3976,column:13}},"802":{start:{line:3973,column:16},end:{line:3973,column:34}},"803":{start:{line:3974,column:16},end:{line:3974,column:31}},"804":{start:{line:3975,column:16},end:{line:3975,column:38}},"805":{start:{line:3978,column:12},end:{line:3978,column:49}},"806":{start:{line:3979,column:12},end:{line:3979,column:34}},"807":{start:{line:3980,column:12},end:{line:3980,column:34}},"808":{start:{line:3981,column:12},end:{line:3981,column:41}},"809":{start:{line:3983,column:12},end:{line:3985,column:13}},"810":{start:{line:3984,column:16},end:{line:3984,column:72}},"811":{start:{line:3987,column:29},end:{line:3987,column:62}},"812":{start:{line:3989,column:23},end:{line:3989,column:41}},"813":{start:{line:3990,column:25},end:{line:3990,column:31}},"814":{start:{line:3991,column:26},end:{line:3991,column:28}},"815":{start:{line:3992,column:23},end:{line:3992,column:29}},"816":{start:{line:3993,column:22},end:{line:3993,column:47}},"817":{start:{line:3994,column:23},end:{line:3994,column:27}},"818":{start:{line:3996,column:22},end:{line:4011,column:13}},"819":{start:{line:4004,column:20},end:{line:4009,column:21}},"820":{start:{line:4005,column:24},end:{line:4005,column:38}},"821":{start:{line:4008,column:24},end:{line:4008,column:54}},"822":{start:{line:4013,column:12},end:{line:4013,column:23}},"823":{start:{line:4047,column:4},end:{line:4164,column:7}},"824":{start:{line:4072,column:12},end:{line:4072,column:32}},"825":{start:{line:4073,column:12},end:{line:4073,column:44}},"826":{start:{line:4075,column:12},end:{line:4075,column:50}},"827":{start:{line:4076,column:12},end:{line:4076,column:52}},"828":{start:{line:4077,column:12},end:{line:4077,column:45}},"829":{start:{line:4078,column:12},end:{line:4078,column:51}},"830":{start:{line:4079,column:12},end:{line:4079,column:49}},"831":{start:{line:4080,column:12},end:{line:4080,column:47}},"832":{start:{line:4081,column:12},end:{line:4081,column:49}},"833":{start:{line:4082,column:12},end:{line:4082,column:56}},"834":{start:{line:4083,column:12},end:{line:4083,column:52}},"835":{start:{line:4084,column:12},end:{line:4084,column:57}},"836":{start:{line:4085,column:12},end:{line:4085,column:72}},"837":{start:{line:4096,column:12},end:{line:4096,column:42}},"838":{start:{line:4107,column:12},end:{line:4107,column:42}},"839":{start:{line:4118,column:12},end:{line:4118,column:45}},"840":{start:{line:4129,column:12},end:{line:4129,column:47}},"841":{start:{line:4140,column:12},end:{line:4140,column:46}},"842":{start:{line:4151,column:12},end:{line:4151,column:40}},"843":{start:{line:4162,column:12},end:{line:4162,column:43}},"844":{start:{line:4177,column:4},end:{line:4199,column:7}},"845":{start:{line:4192,column:12},end:{line:4192,column:32}},"846":{start:{line:4193,column:12},end:{line:4193,column:44}},"847":{start:{line:4195,column:12},end:{line:4195,column:40}},"848":{start:{line:4196,column:12},end:{line:4196,column:50}},"849":{start:{line:4197,column:12},end:{line:4197,column:65}},"850":{start:{line:4232,column:4},end:{line:4350,column:7}},"851":{start:{line:4258,column:12},end:{line:4258,column:32}},"852":{start:{line:4259,column:12},end:{line:4259,column:44}},"853":{start:{line:4261,column:12},end:{line:4261,column:54}},"854":{start:{line:4262,column:12},end:{line:4262,column:56}},"855":{start:{line:4263,column:12},end:{line:4263,column:56}},"856":{start:{line:4264,column:12},end:{line:4264,column:49}},"857":{start:{line:4265,column:12},end:{line:4265,column:57}},"858":{start:{line:4266,column:12},end:{line:4266,column:72}},"859":{start:{line:4268,column:12},end:{line:4268,column:35}},"860":{start:{line:4269,column:12},end:{line:4271,column:13}},"861":{start:{line:4269,column:25},end:{line:4269,column:26}},"862":{start:{line:4270,column:16},end:{line:4270,column:116}},"863":{start:{line:4273,column:12},end:{line:4275,column:13}},"864":{start:{line:4274,column:16},end:{line:4274,column:51}},"865":{start:{line:4276,column:12},end:{line:4278,column:13}},"866":{start:{line:4277,column:16},end:{line:4277,column:51}},"867":{start:{line:4279,column:12},end:{line:4282,column:13}},"868":{start:{line:4280,column:16},end:{line:4280,column:51}},"869":{start:{line:4281,column:16},end:{line:4281,column:64}},"870":{start:{line:4293,column:12},end:{line:4293,column:50}},"871":{start:{line:4304,column:12},end:{line:4304,column:35}},"872":{start:{line:4315,column:12},end:{line:4315,column:42}},"873":{start:{line:4326,column:12},end:{line:4326,column:40}},"874":{start:{line:4337,column:12},end:{line:4337,column:39}},"875":{start:{line:4348,column:12},end:{line:4348,column:41}},"876":{start:{line:4366,column:4},end:{line:4413,column:7}},"877":{start:{line:4383,column:12},end:{line:4383,column:35}},"878":{start:{line:4384,column:12},end:{line:4384,column:39}},"879":{start:{line:4385,column:12},end:{line:4385,column:58}},"880":{start:{line:4386,column:12},end:{line:4386,column:72}},"881":{start:{line:4387,column:12},end:{line:4387,column:50}},"882":{start:{line:4388,column:12},end:{line:4388,column:60}},"883":{start:{line:4390,column:12},end:{line:4390,column:50}},"884":{start:{line:4402,column:12},end:{line:4405,column:13}},"885":{start:{line:4403,column:16},end:{line:4403,column:32}},"886":{start:{line:4404,column:16},end:{line:4404,column:26}},"887":{start:{line:4406,column:12},end:{line:4408,column:13}},"888":{start:{line:4407,column:16},end:{line:4407,column:26}},"889":{start:{line:4411,column:12},end:{line:4411,column:87}},"890":{start:{line:4524,column:4},end:{line:5169,column:7}},"891":{start:{line:4544,column:12},end:{line:4544,column:51}},"892":{start:{line:4545,column:12},end:{line:4545,column:30}},"893":{start:{line:4546,column:12},end:{line:4546,column:27}},"894":{start:{line:4547,column:12},end:{line:4547,column:30}},"895":{start:{line:4548,column:12},end:{line:4548,column:28}},"896":{start:{line:4550,column:12},end:{line:4551,column:54}},"897":{start:{line:4553,column:12},end:{line:4553,column:52}},"898":{start:{line:4554,column:12},end:{line:4554,column:54}},"899":{start:{line:4570,column:12},end:{line:4572,column:13}},"900":{start:{line:4571,column:16},end:{line:4571,column:30}},"901":{start:{line:4574,column:12},end:{line:4576,column:13}},"902":{start:{line:4575,column:16},end:{line:4575,column:81}},"903":{start:{line:4578,column:12},end:{line:4578,column:54}},"904":{start:{line:4579,column:12},end:{line:4579,column:24}},"905":{start:{line:4595,column:12},end:{line:4597,column:13}},"906":{start:{line:4596,column:16},end:{line:4596,column:77}},"907":{start:{line:4598,column:12},end:{line:4604,column:13}},"908":{start:{line:4599,column:16},end:{line:4603,column:70}},"909":{start:{line:4605,column:12},end:{line:4610,column:13}},"910":{start:{line:4606,column:16},end:{line:4609,column:59}},"911":{start:{line:4612,column:22},end:{line:4616,column:13}},"912":{start:{line:4618,column:12},end:{line:4623,column:13}},"913":{start:{line:4619,column:16},end:{line:4622,column:18}},"914":{start:{line:4624,column:12},end:{line:4624,column:35}},"915":{start:{line:4626,column:12},end:{line:4626,column:24}},"916":{start:{line:4643,column:12},end:{line:4645,column:13}},"917":{start:{line:4644,column:16},end:{line:4644,column:83}},"918":{start:{line:4647,column:20},end:{line:4647,column:63}},"919":{start:{line:4649,column:12},end:{line:4651,column:13}},"920":{start:{line:4650,column:16},end:{line:4650,column:112}},"921":{start:{line:4653,column:12},end:{line:4656,column:13}},"922":{start:{line:4654,column:16},end:{line:4655,column:35}},"923":{start:{line:4658,column:12},end:{line:4661,column:13}},"924":{start:{line:4659,column:16},end:{line:4660,column:35}},"925":{start:{line:4663,column:12},end:{line:4665,column:13}},"926":{start:{line:4664,column:16},end:{line:4664,column:120}},"927":{start:{line:4667,column:25},end:{line:4676,column:13}},"928":{start:{line:4678,column:12},end:{line:4678,column:84}},"929":{start:{line:4679,column:12},end:{line:4679,column:38}},"930":{start:{line:4681,column:12},end:{line:4681,column:24}},"931":{start:{line:4694,column:12},end:{line:4696,column:13}},"932":{start:{line:4695,column:16},end:{line:4695,column:67}},"933":{start:{line:4697,column:20},end:{line:4697,column:63}},"934":{start:{line:4698,column:12},end:{line:4700,column:13}},"935":{start:{line:4699,column:16},end:{line:4699,column:96}},"936":{start:{line:4702,column:22},end:{line:4707,column:13}},"937":{start:{line:4709,column:12},end:{line:4711,column:13}},"938":{start:{line:4710,column:16},end:{line:4710,column:36}},"939":{start:{line:4713,column:12},end:{line:4713,column:32}},"940":{start:{line:4715,column:12},end:{line:4715,column:24}},"941":{start:{line:4738,column:12},end:{line:4740,column:13}},"942":{start:{line:4739,column:16},end:{line:4739,column:63}},"943":{start:{line:4741,column:20},end:{line:4741,column:59}},"944":{start:{line:4742,column:12},end:{line:4744,column:13}},"945":{start:{line:4743,column:16},end:{line:4743,column:86}},"946":{start:{line:4745,column:31},end:{line:4745,column:33}},"947":{start:{line:4746,column:12},end:{line:4748,column:13}},"948":{start:{line:4747,column:16},end:{line:4747,column:50}},"949":{start:{line:4749,column:12},end:{line:4751,column:13}},"950":{start:{line:4750,column:16},end:{line:4750,column:46}},"951":{start:{line:4752,column:12},end:{line:4754,column:13}},"952":{start:{line:4753,column:16},end:{line:4753,column:48}},"953":{start:{line:4755,column:12},end:{line:4757,column:13}},"954":{start:{line:4756,column:16},end:{line:4756,column:56}},"955":{start:{line:4759,column:12},end:{line:4766,column:15}},"956":{start:{line:4768,column:12},end:{line:4768,column:24}},"957":{start:{line:4783,column:12},end:{line:4785,column:13}},"958":{start:{line:4784,column:16},end:{line:4784,column:63}},"959":{start:{line:4786,column:20},end:{line:4786,column:59}},"960":{start:{line:4787,column:12},end:{line:4789,column:13}},"961":{start:{line:4788,column:16},end:{line:4788,column:87}},"962":{start:{line:4791,column:12},end:{line:4798,column:15}},"963":{start:{line:4800,column:12},end:{line:4800,column:24}},"964":{start:{line:4814,column:12},end:{line:4816,column:13}},"965":{start:{line:4815,column:16},end:{line:4815,column:63}},"966":{start:{line:4817,column:20},end:{line:4817,column:59}},"967":{start:{line:4818,column:12},end:{line:4820,column:13}},"968":{start:{line:4819,column:16},end:{line:4819,column:89}},"969":{start:{line:4821,column:12},end:{line:4823,column:13}},"970":{start:{line:4822,column:16},end:{line:4822,column:120}},"971":{start:{line:4825,column:12},end:{line:4831,column:15}},"972":{start:{line:4833,column:12},end:{line:4833,column:24}},"973":{start:{line:4846,column:12},end:{line:4848,column:13}},"974":{start:{line:4847,column:16},end:{line:4847,column:67}},"975":{start:{line:4849,column:20},end:{line:4849,column:63}},"976":{start:{line:4850,column:12},end:{line:4852,column:13}},"977":{start:{line:4851,column:16},end:{line:4851,column:96}},"978":{start:{line:4854,column:22},end:{line:4858,column:13}},"979":{start:{line:4860,column:12},end:{line:4862,column:13}},"980":{start:{line:4861,column:16},end:{line:4861,column:36}},"981":{start:{line:4864,column:12},end:{line:4864,column:35}},"982":{start:{line:4866,column:12},end:{line:4866,column:24}},"983":{start:{line:4883,column:12},end:{line:4885,column:13}},"984":{start:{line:4884,column:16},end:{line:4884,column:67}},"985":{start:{line:4886,column:20},end:{line:4886,column:63}},"986":{start:{line:4887,column:12},end:{line:4889,column:13}},"987":{start:{line:4888,column:16},end:{line:4888,column:86}},"988":{start:{line:4893,column:32},end:{line:4893,column:34}},"989":{start:{line:4894,column:12},end:{line:4896,column:13}},"990":{start:{line:4895,column:16},end:{line:4895,column:51}},"991":{start:{line:4897,column:12},end:{line:4899,column:13}},"992":{start:{line:4898,column:16},end:{line:4898,column:47}},"993":{start:{line:4900,column:12},end:{line:4902,column:13}},"994":{start:{line:4901,column:16},end:{line:4901,column:49}},"995":{start:{line:4903,column:12},end:{line:4905,column:13}},"996":{start:{line:4904,column:16},end:{line:4904,column:57}},"997":{start:{line:4907,column:12},end:{line:4913,column:15}},"998":{start:{line:4915,column:12},end:{line:4915,column:24}},"999":{start:{line:4929,column:12},end:{line:4931,column:13}},"1000":{start:{line:4930,column:16},end:{line:4930,column:67}},"1001":{start:{line:4932,column:20},end:{line:4932,column:63}},"1002":{start:{line:4933,column:12},end:{line:4935,column:13}},"1003":{start:{line:4934,column:16},end:{line:4934,column:87}},"1004":{start:{line:4937,column:12},end:{line:4943,column:15}},"1005":{start:{line:4945,column:12},end:{line:4945,column:24}},"1006":{start:{line:4958,column:12},end:{line:4960,column:13}},"1007":{start:{line:4959,column:16},end:{line:4959,column:63}},"1008":{start:{line:4961,column:20},end:{line:4961,column:59}},"1009":{start:{line:4962,column:12},end:{line:4964,column:13}},"1010":{start:{line:4963,column:16},end:{line:4963,column:89}},"1011":{start:{line:4965,column:12},end:{line:4967,column:13}},"1012":{start:{line:4966,column:16},end:{line:4966,column:120}},"1013":{start:{line:4969,column:12},end:{line:4974,column:15}},"1014":{start:{line:4976,column:12},end:{line:4976,column:24}},"1015":{start:{line:4990,column:12},end:{line:4992,column:13}},"1016":{start:{line:4991,column:16},end:{line:4991,column:67}},"1017":{start:{line:4994,column:20},end:{line:4994,column:63}},"1018":{start:{line:4995,column:12},end:{line:5047,column:13}},"1019":{start:{line:5004,column:16},end:{line:5006,column:35}},"1020":{start:{line:5008,column:17},end:{line:5047,column:13}},"1021":{start:{line:5020,column:16},end:{line:5023,column:22}},"1022":{start:{line:5025,column:17},end:{line:5047,column:13}},"1023":{start:{line:5034,column:16},end:{line:5037,column:22}},"1024":{start:{line:5039,column:17},end:{line:5047,column:13}},"1025":{start:{line:5042,column:16},end:{line:5043,column:46}},"1026":{start:{line:5045,column:17},end:{line:5047,column:13}},"1027":{start:{line:5046,column:16},end:{line:5046,column:84}},"1028":{start:{line:5049,column:12},end:{line:5056,column:15}},"1029":{start:{line:5058,column:12},end:{line:5058,column:24}},"1030":{start:{line:5069,column:12},end:{line:5076,column:14}},"1031":{start:{line:5102,column:22},end:{line:5102,column:60}},"1032":{start:{line:5104,column:23},end:{line:5106,column:13}},"1033":{start:{line:5108,column:12},end:{line:5110,column:13}},"1034":{start:{line:5109,column:16},end:{line:5109,column:60}},"1035":{start:{line:5112,column:12},end:{line:5124,column:15}},"1036":{start:{line:5113,column:16},end:{line:5116,column:17}},"1037":{start:{line:5114,column:20},end:{line:5114,column:77}},"1038":{start:{line:5115,column:20},end:{line:5115,column:27}},"1039":{start:{line:5118,column:16},end:{line:5123,column:17}},"1040":{start:{line:5119,column:20},end:{line:5119,column:88}},"1041":{start:{line:5122,column:20},end:{line:5122,column:96}},"1042":{start:{line:5154,column:12},end:{line:5157,column:13}},"1043":{start:{line:5155,column:16},end:{line:5155,column:32}},"1044":{start:{line:5156,column:16},end:{line:5156,column:26}},"1045":{start:{line:5158,column:12},end:{line:5158,column:30}},"1046":{start:{line:5160,column:12},end:{line:5167,column:15}},"1047":{start:{line:5161,column:16},end:{line:5166,column:17}},"1048":{start:{line:5162,column:20},end:{line:5162,column:46}},"1049":{start:{line:5165,column:20},end:{line:5165,column:68}},"1050":{start:{line:5197,column:4},end:{line:5515,column:7}},"1051":{start:{line:5225,column:12},end:{line:5225,column:32}},"1052":{start:{line:5226,column:12},end:{line:5226,column:44}},"1053":{start:{line:5228,column:12},end:{line:5228,column:58}},"1054":{start:{line:5229,column:12},end:{line:5229,column:59}},"1055":{start:{line:5230,column:12},end:{line:5230,column:60}},"1056":{start:{line:5231,column:12},end:{line:5231,column:59}},"1057":{start:{line:5232,column:12},end:{line:5232,column:67}},"1058":{start:{line:5235,column:12},end:{line:5237,column:13}},"1059":{start:{line:5236,column:16},end:{line:5236,column:57}},"1060":{start:{line:5238,column:12},end:{line:5240,column:13}},"1061":{start:{line:5239,column:16},end:{line:5239,column:59}},"1062":{start:{line:5241,column:12},end:{line:5243,column:13}},"1063":{start:{line:5242,column:16},end:{line:5242,column:60}},"1064":{start:{line:5244,column:12},end:{line:5246,column:13}},"1065":{start:{line:5245,column:16},end:{line:5245,column:58}},"1066":{start:{line:5249,column:12},end:{line:5251,column:13}},"1067":{start:{line:5250,column:16},end:{line:5250,column:51}},"1068":{start:{line:5254,column:12},end:{line:5254,column:29}},"1069":{start:{line:5255,column:12},end:{line:5257,column:13}},"1070":{start:{line:5255,column:25},end:{line:5255,column:26}},"1071":{start:{line:5256,column:16},end:{line:5256,column:98}},"1072":{start:{line:5260,column:12},end:{line:5260,column:34}},"1073":{start:{line:5261,column:12},end:{line:5263,column:13}},"1074":{start:{line:5261,column:25},end:{line:5261,column:26}},"1075":{start:{line:5262,column:16},end:{line:5262,column:90}},"1076":{start:{line:5266,column:12},end:{line:5266,column:35}},"1077":{start:{line:5267,column:12},end:{line:5269,column:13}},"1078":{start:{line:5267,column:25},end:{line:5267,column:26}},"1079":{start:{line:5268,column:16},end:{line:5268,column:126}},"1080":{start:{line:5280,column:12},end:{line:5280,column:55}},"1081":{start:{line:5291,column:12},end:{line:5291,column:52}},"1082":{start:{line:5303,column:12},end:{line:5303,column:44}},"1083":{start:{line:5317,column:12},end:{line:5317,column:78}},"1084":{start:{line:5332,column:33},end:{line:5332,column:35}},"1085":{start:{line:5334,column:12},end:{line:5338,column:13}},"1086":{start:{line:5335,column:16},end:{line:5337,column:17}},"1087":{start:{line:5336,column:20},end:{line:5336,column:55}},"1088":{start:{line:5340,column:35},end:{line:5340,column:58}},"1089":{start:{line:5341,column:12},end:{line:5345,column:13}},"1090":{start:{line:5342,column:16},end:{line:5344,column:17}},"1091":{start:{line:5343,column:20},end:{line:5343,column:62}},"1092":{start:{line:5347,column:12},end:{line:5347,column:34}},"1093":{start:{line:5361,column:12},end:{line:5361,column:49}},"1094":{start:{line:5374,column:25},end:{line:5374,column:27}},"1095":{start:{line:5376,column:23},end:{line:5376,column:44}},"1096":{start:{line:5377,column:31},end:{line:5377,column:48}},"1097":{start:{line:5378,column:12},end:{line:5383,column:13}},"1098":{start:{line:5378,column:25},end:{line:5378,column:26}},"1099":{start:{line:5379,column:34},end:{line:5379,column:55}},"1100":{start:{line:5380,column:16},end:{line:5382,column:17}},"1101":{start:{line:5380,column:29},end:{line:5380,column:30}},"1102":{start:{line:5381,column:20},end:{line:5381,column:124}},"1103":{start:{line:5384,column:12},end:{line:5384,column:26}},"1104":{start:{line:5397,column:12},end:{line:5397,column:56}},"1105":{start:{line:5410,column:12},end:{line:5410,column:67}},"1106":{start:{line:5423,column:12},end:{line:5423,column:50}},"1107":{start:{line:5454,column:12},end:{line:5457,column:13}},"1108":{start:{line:5455,column:16},end:{line:5455,column:40}},"1109":{start:{line:5456,column:16},end:{line:5456,column:41}},"1110":{start:{line:5459,column:24},end:{line:5459,column:106}},"1111":{start:{line:5460,column:23},end:{line:5460,column:72}},"1112":{start:{line:5462,column:12},end:{line:5462,column:65}},"1113":{start:{line:5485,column:24},end:{line:5485,column:90}},"1114":{start:{line:5487,column:12},end:{line:5487,column:69}},"1115":{start:{line:5488,column:12},end:{line:5488,column:81}},"1116":{start:{line:5501,column:12},end:{line:5501,column:64}},"1117":{start:{line:5513,column:12},end:{line:5513,column:53}},"1118":{start:{line:5526,column:4},end:{line:5679,column:7}},"1119":{start:{line:5533,column:12},end:{line:5533,column:74}},"1120":{start:{line:5556,column:12},end:{line:5559,column:13}},"1121":{start:{line:5557,column:16},end:{line:5557,column:34}},"1122":{start:{line:5558,column:16},end:{line:5558,column:31}},"1123":{start:{line:5561,column:12},end:{line:5561,column:29}},"1124":{start:{line:5562,column:12},end:{line:5562,column:57}},"1125":{start:{line:5564,column:12},end:{line:5564,column:77}},"1126":{start:{line:5565,column:12},end:{line:5568,column:13}},"1127":{start:{line:5567,column:16},end:{line:5567,column:72}},"1128":{start:{line:5572,column:12},end:{line:5574,column:13}},"1129":{start:{line:5573,column:16},end:{line:5573,column:35}},"1130":{start:{line:5576,column:38},end:{line:5576,column:75}},"1131":{start:{line:5578,column:12},end:{line:5578,column:66}},"1132":{start:{line:5579,column:12},end:{line:5579,column:63}},"1133":{start:{line:5580,column:12},end:{line:5580,column:63}},"1134":{start:{line:5583,column:23},end:{line:5583,column:50}},"1135":{start:{line:5584,column:12},end:{line:5584,column:30}},"1136":{start:{line:5585,column:12},end:{line:5587,column:13}},"1137":{start:{line:5585,column:25},end:{line:5585,column:26}},"1138":{start:{line:5586,column:16},end:{line:5586,column:75}},"1139":{start:{line:5589,column:12},end:{line:5589,column:56}},"1140":{start:{line:5590,column:12},end:{line:5590,column:56}},"1141":{start:{line:5601,column:12},end:{line:5601,column:47}},"1142":{start:{line:5613,column:12},end:{line:5617,column:13}},"1143":{start:{line:5613,column:25},end:{line:5613,column:26}},"1144":{start:{line:5614,column:16},end:{line:5616,column:17}},"1145":{start:{line:5615,column:20},end:{line:5615,column:43}},"1146":{start:{line:5618,column:12},end:{line:5618,column:24}},"1147":{start:{line:5629,column:12},end:{line:5629,column:58}},"1148":{start:{line:5645,column:12},end:{line:5648,column:13}},"1149":{start:{line:5646,column:16},end:{line:5646,column:33}},"1150":{start:{line:5647,column:16},end:{line:5647,column:27}},"1151":{start:{line:5649,column:12},end:{line:5649,column:49}},"1152":{start:{line:5651,column:12},end:{line:5654,column:13}},"1153":{start:{line:5652,column:16},end:{line:5652,column:93}},"1154":{start:{line:5653,column:16},end:{line:5653,column:23}},"1155":{start:{line:5655,column:12},end:{line:5658,column:13}},"1156":{start:{line:5656,column:16},end:{line:5656,column:81}},"1157":{start:{line:5657,column:16},end:{line:5657,column:23}},"1158":{start:{line:5660,column:31},end:{line:5666,column:13}},"1159":{start:{line:5668,column:23},end:{line:5668,column:27}},"1160":{start:{line:5669,column:12},end:{line:5677,column:15}},"1161":{start:{line:5670,column:16},end:{line:5676,column:17}},"1162":{start:{line:5671,column:20},end:{line:5671,column:40}},"1163":{start:{line:5674,column:45},end:{line:5674,column:98}},"1164":{start:{line:5675,column:20},end:{line:5675,column:142}},"1165":{start:{line:5690,column:4},end:{line:5768,column:7}},"1166":{start:{line:5697,column:12},end:{line:5697,column:36}},"1167":{start:{line:5713,column:12},end:{line:5713,column:40}},"1168":{start:{line:5714,column:12},end:{line:5714,column:57}},"1169":{start:{line:5715,column:12},end:{line:5715,column:56}},"1170":{start:{line:5733,column:12},end:{line:5736,column:13}},"1171":{start:{line:5734,column:16},end:{line:5734,column:34}},"1172":{start:{line:5735,column:16},end:{line:5735,column:28}},"1173":{start:{line:5738,column:12},end:{line:5738,column:34}},"1174":{start:{line:5739,column:12},end:{line:5739,column:48}},"1175":{start:{line:5740,column:12},end:{line:5740,column:43}},"1176":{start:{line:5742,column:23},end:{line:5742,column:27}},"1177":{start:{line:5743,column:12},end:{line:5751,column:15}},"1178":{start:{line:5744,column:16},end:{line:5750,column:17}},"1179":{start:{line:5745,column:20},end:{line:5745,column:34}},"1180":{start:{line:5748,column:36},end:{line:5748,column:137}},"1181":{start:{line:5749,column:20},end:{line:5749,column:46}},"1182":{start:{line:5765,column:34},end:{line:5765,column:70}},"1183":{start:{line:5766,column:12},end:{line:5766,column:88}},"1184":{start:{line:5772,column:4},end:{line:5802,column:7}},"1185":{start:{line:5774,column:12},end:{line:5774,column:34}},"1186":{start:{line:5776,column:12},end:{line:5776,column:38}},"1187":{start:{line:5777,column:12},end:{line:5777,column:50}},"1188":{start:{line:5778,column:12},end:{line:5778,column:29}},"1189":{start:{line:5783,column:12},end:{line:5783,column:49}},"1190":{start:{line:5785,column:23},end:{line:5785,column:27}},"1191":{start:{line:5786,column:25},end:{line:5789,column:13}},"1192":{start:{line:5790,column:12},end:{line:5800,column:15}},"1193":{start:{line:5791,column:16},end:{line:5799,column:17}},"1194":{start:{line:5792,column:20},end:{line:5792,column:34}},"1195":{start:{line:5795,column:38},end:{line:5795,column:76}},"1196":{start:{line:5796,column:20},end:{line:5796,column:47}},"1197":{start:{line:5798,column:20},end:{line:5798,column:60}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:16,column:1},end:{line:16,column:2}},loc:{start:{line:16,column:12},end:{line:5803,column:1}},line:16},"1":{name:"(anonymous_1)",decl:{start:{line:38,column:14},end:{line:38,column:15}},loc:{start:{line:38,column:25},end:{line:40,column:9}},line:38},"2":{name:"(anonymous_2)",decl:{start:{line:72,column:14},end:{line:72,column:15}},loc:{start:{line:72,column:25},end:{line:88,column:9}},line:72},"3":{name:"(anonymous_3)",decl:{start:{line:105,column:20},end:{line:105,column:21}},loc:{start:{line:105,column:41},end:{line:117,column:9}},line:105},"4":{name:"(anonymous_4)",decl:{start:{line:135,column:14},end:{line:135,column:15}},loc:{start:{line:135,column:25},end:{line:137,column:9}},line:135},"5":{name:"(anonymous_5)",decl:{start:{line:163,column:24},end:{line:163,column:25}},loc:{start:{line:163,column:44},end:{line:165,column:9}},line:163},"6":{name:"(anonymous_6)",decl:{start:{line:191,column:17},end:{line:191,column:18}},loc:{start:{line:191,column:37},end:{line:193,column:9}},line:191},"7":{name:"(anonymous_7)",decl:{start:{line:217,column:23},end:{line:217,column:24}},loc:{start:{line:217,column:43},end:{line:219,column:9}},line:217},"8":{name:"(anonymous_8)",decl:{start:{line:243,column:26},end:{line:243,column:27}},loc:{start:{line:243,column:46},end:{line:245,column:9}},line:243},"9":{name:"(anonymous_9)",decl:{start:{line:270,column:26},end:{line:270,column:27}},loc:{start:{line:270,column:46},end:{line:272,column:9}},line:270},"10":{name:"(anonymous_10)",decl:{start:{line:299,column:14},end:{line:299,column:15}},loc:{start:{line:299,column:34},end:{line:301,column:9}},line:299},"11":{name:"(anonymous_11)",decl:{start:{line:311,column:20},end:{line:311,column:21}},loc:{start:{line:311,column:40},end:{line:313,column:9}},line:311},"12":{name:"(anonymous_12)",decl:{start:{line:336,column:15},end:{line:336,column:16}},loc:{start:{line:336,column:26},end:{line:338,column:9}},line:336},"13":{name:"(anonymous_13)",decl:{start:{line:365,column:15},end:{line:365,column:16}},loc:{start:{line:365,column:35},end:{line:367,column:9}},line:365},"14":{name:"(anonymous_14)",decl:{start:{line:396,column:16},end:{line:396,column:17}},loc:{start:{line:396,column:61},end:{line:404,column:9}},line:396},"15":{name:"(anonymous_15)",decl:{start:{line:419,column:16},end:{line:419,column:17}},loc:{start:{line:419,column:51},end:{line:426,column:9}},line:419},"16":{name:"(anonymous_16)",decl:{start:{line:452,column:23},end:{line:452,column:24}},loc:{start:{line:452,column:68},end:{line:460,column:9}},line:452},"17":{name:"(anonymous_17)",decl:{start:{line:477,column:21},end:{line:477,column:22}},loc:{start:{line:477,column:40},end:{line:500,column:9}},line:477},"18":{name:"(anonymous_18)",decl:{start:{line:478,column:35},end:{line:478,column:36}},loc:{start:{line:478,column:46},end:{line:478,column:48}},line:478},"19":{name:"(anonymous_19)",decl:{start:{line:481,column:54},end:{line:481,column:55}},loc:{start:{line:481,column:78},end:{line:497,column:13}},line:481},"20":{name:"(anonymous_20)",decl:{start:{line:488,column:31},end:{line:488,column:32}},loc:{start:{line:488,column:42},end:{line:495,column:21}},line:488},"21":{name:"(anonymous_21)",decl:{start:{line:516,column:20},end:{line:516,column:21}},loc:{start:{line:516,column:39},end:{line:521,column:9}},line:516},"22":{name:"(anonymous_22)",decl:{start:{line:517,column:35},end:{line:517,column:36}},loc:{start:{line:517,column:46},end:{line:517,column:48}},line:517},"23":{name:"(anonymous_23)",decl:{start:{line:543,column:15},end:{line:543,column:16}},loc:{start:{line:543,column:49},end:{line:562,column:9}},line:543},"24":{name:"(anonymous_24)",decl:{start:{line:549,column:35},end:{line:549,column:36}},loc:{start:{line:549,column:46},end:{line:549,column:48}},line:549},"25":{name:"(anonymous_25)",decl:{start:{line:554,column:50},end:{line:554,column:51}},loc:{start:{line:554,column:74},end:{line:561,column:13}},line:554},"26":{name:"(anonymous_26)",decl:{start:{line:580,column:19},end:{line:580,column:20}},loc:{start:{line:580,column:53},end:{line:601,column:9}},line:580},"27":{name:"(anonymous_27)",decl:{start:{line:586,column:35},end:{line:586,column:36}},loc:{start:{line:586,column:46},end:{line:586,column:48}},line:586},"28":{name:"(anonymous_28)",decl:{start:{line:592,column:53},end:{line:592,column:54}},loc:{start:{line:592,column:77},end:{line:600,column:13}},line:592},"29":{name:"(anonymous_29)",decl:{start:{line:624,column:13},end:{line:624,column:14}},loc:{start:{line:624,column:47},end:{line:663,column:9}},line:624},"30":{name:"(anonymous_30)",decl:{start:{line:630,column:35},end:{line:630,column:36}},loc:{start:{line:630,column:46},end:{line:630,column:48}},line:630},"31":{name:"(anonymous_31)",decl:{start:{line:652,column:16},end:{line:652,column:17}},loc:{start:{line:652,column:40},end:{line:659,column:17}},line:652},"32":{name:"(anonymous_32)",decl:{start:{line:685,column:14},end:{line:685,column:15}},loc:{start:{line:685,column:47},end:{line:703,column:9}},line:685},"33":{name:"(anonymous_33)",decl:{start:{line:721,column:13},end:{line:721,column:14}},loc:{start:{line:721,column:49},end:{line:735,column:9}},line:721},"34":{name:"(anonymous_34)",decl:{start:{line:737,column:16},end:{line:737,column:17}},loc:{start:{line:737,column:42},end:{line:750,column:9}},line:737},"35":{name:"(anonymous_35)",decl:{start:{line:768,column:14},end:{line:768,column:15}},loc:{start:{line:768,column:50},end:{line:782,column:9}},line:768},"36":{name:"(anonymous_36)",decl:{start:{line:800,column:13},end:{line:800,column:14}},loc:{start:{line:800,column:49},end:{line:814,column:9}},line:800},"37":{name:"(anonymous_37)",decl:{start:{line:843,column:14},end:{line:843,column:15}},loc:{start:{line:843,column:49},end:{line:858,column:9}},line:843},"38":{name:"(anonymous_38)",decl:{start:{line:865,column:14},end:{line:865,column:15}},loc:{start:{line:865,column:25},end:{line:867,column:9}},line:865},"39":{name:"(anonymous_39)",decl:{start:{line:877,column:15},end:{line:877,column:16}},loc:{start:{line:877,column:36},end:{line:880,column:9}},line:877},"40":{name:"(anonymous_40)",decl:{start:{line:891,column:15},end:{line:891,column:16}},loc:{start:{line:891,column:34},end:{line:893,column:9}},line:891},"41":{name:"(anonymous_41)",decl:{start:{line:902,column:20},end:{line:902,column:21}},loc:{start:{line:902,column:31},end:{line:904,column:9}},line:902},"42":{name:"(anonymous_42)",decl:{start:{line:913,column:15},end:{line:913,column:16}},loc:{start:{line:913,column:26},end:{line:915,column:9}},line:913},"43":{name:"(anonymous_43)",decl:{start:{line:953,column:14},end:{line:953,column:15}},loc:{start:{line:953,column:49},end:{line:977,column:9}},line:953},"44":{name:"(anonymous_44)",decl:{start:{line:987,column:15},end:{line:987,column:16}},loc:{start:{line:987,column:36},end:{line:1009,column:9}},line:987},"45":{name:"(anonymous_45)",decl:{start:{line:1019,column:16},end:{line:1019,column:17}},loc:{start:{line:1019,column:27},end:{line:1021,column:9}},line:1019},"46":{name:"(anonymous_46)",decl:{start:{line:1031,column:13},end:{line:1031,column:14}},loc:{start:{line:1031,column:24},end:{line:1033,column:9}},line:1031},"47":{name:"(anonymous_47)",decl:{start:{line:1043,column:15},end:{line:1043,column:16}},loc:{start:{line:1043,column:26},end:{line:1045,column:9}},line:1043},"48":{name:"(anonymous_48)",decl:{start:{line:1054,column:16},end:{line:1054,column:17}},loc:{start:{line:1054,column:27},end:{line:1056,column:9}},line:1054},"49":{name:"(anonymous_49)",decl:{start:{line:1065,column:17},end:{line:1065,column:18}},loc:{start:{line:1065,column:28},end:{line:1067,column:9}},line:1065},"50":{name:"(anonymous_50)",decl:{start:{line:1076,column:19},end:{line:1076,column:20}},loc:{start:{line:1076,column:30},end:{line:1078,column:9}},line:1076},"51":{name:"(anonymous_51)",decl:{start:{line:1095,column:15},end:{line:1095,column:16}},loc:{start:{line:1095,column:43},end:{line:1114,column:9}},line:1095},"52":{name:"(anonymous_52)",decl:{start:{line:1100,column:35},end:{line:1100,column:36}},loc:{start:{line:1100,column:46},end:{line:1100,column:48}},line:1100},"53":{name:"(anonymous_53)",decl:{start:{line:1105,column:41},end:{line:1105,column:42}},loc:{start:{line:1105,column:65},end:{line:1113,column:13}},line:1105},"54":{name:"(anonymous_54)",decl:{start:{line:1124,column:16},end:{line:1124,column:17}},loc:{start:{line:1124,column:35},end:{line:1131,column:9}},line:1124},"55":{name:"(anonymous_55)",decl:{start:{line:1125,column:35},end:{line:1125,column:36}},loc:{start:{line:1125,column:46},end:{line:1125,column:48}},line:1125},"56":{name:"(anonymous_56)",decl:{start:{line:1128,column:36},end:{line:1128,column:37}},loc:{start:{line:1128,column:50},end:{line:1130,column:13}},line:1128},"57":{name:"(anonymous_57)",decl:{start:{line:1142,column:16},end:{line:1142,column:17}},loc:{start:{line:1142,column:42},end:{line:1171,column:9}},line:1142},"58":{name:"(anonymous_58)",decl:{start:{line:1143,column:35},end:{line:1143,column:36}},loc:{start:{line:1143,column:46},end:{line:1143,column:48}},line:1143},"59":{name:"(anonymous_59)",decl:{start:{line:1150,column:43},end:{line:1150,column:44}},loc:{start:{line:1150,column:67},end:{line:1168,column:13}},line:1150},"60":{name:"(anonymous_60)",decl:{start:{line:1156,column:31},end:{line:1156,column:32}},loc:{start:{line:1156,column:42},end:{line:1163,column:21}},line:1156},"61":{name:"(anonymous_61)",decl:{start:{line:1181,column:17},end:{line:1181,column:18}},loc:{start:{line:1181,column:36},end:{line:1193,column:9}},line:1181},"62":{name:"(anonymous_62)",decl:{start:{line:1182,column:35},end:{line:1182,column:36}},loc:{start:{line:1182,column:46},end:{line:1182,column:48}},line:1182},"63":{name:"(anonymous_63)",decl:{start:{line:1185,column:37},end:{line:1185,column:38}},loc:{start:{line:1185,column:61},end:{line:1192,column:13}},line:1185},"64":{name:"(anonymous_64)",decl:{start:{line:1203,column:16},end:{line:1203,column:17}},loc:{start:{line:1203,column:35},end:{line:1215,column:9}},line:1203},"65":{name:"(anonymous_65)",decl:{start:{line:1204,column:35},end:{line:1204,column:36}},loc:{start:{line:1204,column:46},end:{line:1204,column:48}},line:1204},"66":{name:"(anonymous_66)",decl:{start:{line:1207,column:36},end:{line:1207,column:37}},loc:{start:{line:1207,column:60},end:{line:1214,column:13}},line:1207},"67":{name:"(anonymous_67)",decl:{start:{line:1225,column:16},end:{line:1225,column:17}},loc:{start:{line:1225,column:35},end:{line:1237,column:9}},line:1225},"68":{name:"(anonymous_68)",decl:{start:{line:1226,column:35},end:{line:1226,column:36}},loc:{start:{line:1226,column:46},end:{line:1226,column:48}},line:1226},"69":{name:"(anonymous_69)",decl:{start:{line:1229,column:37},end:{line:1229,column:38}},loc:{start:{line:1229,column:61},end:{line:1236,column:13}},line:1229},"70":{name:"(anonymous_70)",decl:{start:{line:1272,column:14},end:{line:1272,column:15}},loc:{start:{line:1272,column:49},end:{line:1290,column:9}},line:1272},"71":{name:"(anonymous_71)",decl:{start:{line:1300,column:27},end:{line:1300,column:28}},loc:{start:{line:1300,column:43},end:{line:1302,column:9}},line:1300},"72":{name:"(anonymous_72)",decl:{start:{line:1313,column:15},end:{line:1313,column:16}},loc:{start:{line:1313,column:36},end:{line:1337,column:9}},line:1313},"73":{name:"(anonymous_73)",decl:{start:{line:1347,column:15},end:{line:1347,column:16}},loc:{start:{line:1347,column:26},end:{line:1349,column:9}},line:1347},"74":{name:"(anonymous_74)",decl:{start:{line:1358,column:16},end:{line:1358,column:17}},loc:{start:{line:1358,column:27},end:{line:1360,column:9}},line:1358},"75":{name:"(anonymous_75)",decl:{start:{line:1369,column:17},end:{line:1369,column:18}},loc:{start:{line:1369,column:28},end:{line:1371,column:9}},line:1369},"76":{name:"(anonymous_76)",decl:{start:{line:1388,column:15},end:{line:1388,column:16}},loc:{start:{line:1388,column:43},end:{line:1412,column:9}},line:1388},"77":{name:"(anonymous_77)",decl:{start:{line:1393,column:35},end:{line:1393,column:36}},loc:{start:{line:1393,column:46},end:{line:1393,column:48}},line:1393},"78":{name:"(anonymous_78)",decl:{start:{line:1401,column:44},end:{line:1401,column:45}},loc:{start:{line:1401,column:68},end:{line:1409,column:13}},line:1401},"79":{name:"(anonymous_79)",decl:{start:{line:1414,column:18},end:{line:1414,column:19}},loc:{start:{line:1414,column:42},end:{line:1425,column:9}},line:1414},"80":{name:"(anonymous_80)",decl:{start:{line:1448,column:14},end:{line:1448,column:15}},loc:{start:{line:1448,column:38},end:{line:1505,column:9}},line:1448},"81":{name:"(anonymous_81)",decl:{start:{line:1524,column:16},end:{line:1524,column:17}},loc:{start:{line:1524,column:43},end:{line:1557,column:9}},line:1524},"82":{name:"(anonymous_82)",decl:{start:{line:1525,column:35},end:{line:1525,column:36}},loc:{start:{line:1525,column:46},end:{line:1525,column:48}},line:1525},"83":{name:"(anonymous_83)",decl:{start:{line:1527,column:44},end:{line:1527,column:45}},loc:{start:{line:1527,column:68},end:{line:1554,column:13}},line:1527},"84":{name:"(anonymous_84)",decl:{start:{line:1541,column:37},end:{line:1541,column:38}},loc:{start:{line:1541,column:48},end:{line:1548,column:25}},line:1541},"85":{name:"(anonymous_85)",decl:{start:{line:1574,column:14},end:{line:1574,column:15}},loc:{start:{line:1574,column:33},end:{line:1578,column:9}},line:1574},"86":{name:"(anonymous_86)",decl:{start:{line:1575,column:35},end:{line:1575,column:36}},loc:{start:{line:1575,column:46},end:{line:1575,column:48}},line:1575},"87":{name:"(anonymous_87)",decl:{start:{line:1595,column:14},end:{line:1595,column:15}},loc:{start:{line:1595,column:25},end:{line:1597,column:9}},line:1595},"88":{name:"(anonymous_88)",decl:{start:{line:1613,column:14},end:{line:1613,column:15}},loc:{start:{line:1613,column:49},end:{line:1621,column:9}},line:1613},"89":{name:"(anonymous_89)",decl:{start:{line:1636,column:20},end:{line:1636,column:21}},loc:{start:{line:1636,column:31},end:{line:1638,column:9}},line:1636},"90":{name:"(anonymous_90)",decl:{start:{line:1656,column:21},end:{line:1656,column:22}},loc:{start:{line:1656,column:40},end:{line:1665,column:9}},line:1656},"91":{name:"(anonymous_91)",decl:{start:{line:1657,column:35},end:{line:1657,column:36}},loc:{start:{line:1657,column:46},end:{line:1657,column:48}},line:1657},"92":{name:"(anonymous_92)",decl:{start:{line:1660,column:51},end:{line:1660,column:52}},loc:{start:{line:1660,column:65},end:{line:1662,column:13}},line:1660},"93":{name:"(anonymous_93)",decl:{start:{line:1688,column:18},end:{line:1688,column:19}},loc:{start:{line:1688,column:46},end:{line:1711,column:9}},line:1688},"94":{name:"(anonymous_94)",decl:{start:{line:1694,column:35},end:{line:1694,column:36}},loc:{start:{line:1694,column:46},end:{line:1694,column:48}},line:1694},"95":{name:"(anonymous_95)",decl:{start:{line:1698,column:53},end:{line:1698,column:54}},loc:{start:{line:1698,column:77},end:{line:1708,column:13}},line:1698},"96":{name:"(anonymous_96)",decl:{start:{line:1725,column:25},end:{line:1725,column:26}},loc:{start:{line:1725,column:36},end:{line:1727,column:9}},line:1725},"97":{name:"(anonymous_97)",decl:{start:{line:1748,column:17},end:{line:1748,column:18}},loc:{start:{line:1748,column:45},end:{line:1777,column:9}},line:1748},"98":{name:"(anonymous_98)",decl:{start:{line:1754,column:35},end:{line:1754,column:36}},loc:{start:{line:1754,column:46},end:{line:1754,column:48}},line:1754},"99":{name:"(anonymous_99)",decl:{start:{line:1758,column:48},end:{line:1758,column:49}},loc:{start:{line:1758,column:72},end:{line:1776,column:13}},line:1758},"100":{name:"(anonymous_100)",decl:{start:{line:1794,column:22},end:{line:1794,column:23}},loc:{start:{line:1794,column:41},end:{line:1801,column:9}},line:1794},"101":{name:"(anonymous_101)",decl:{start:{line:1795,column:35},end:{line:1795,column:36}},loc:{start:{line:1795,column:46},end:{line:1795,column:48}},line:1795},"102":{name:"(anonymous_102)",decl:{start:{line:1798,column:44},end:{line:1798,column:45}},loc:{start:{line:1798,column:68},end:{line:1800,column:13}},line:1798},"103":{name:"(anonymous_103)",decl:{start:{line:1815,column:16},end:{line:1815,column:17}},loc:{start:{line:1815,column:43},end:{line:1842,column:9}},line:1815},"104":{name:"(anonymous_104)",decl:{start:{line:1820,column:37},end:{line:1820,column:38}},loc:{start:{line:1820,column:59},end:{line:1835,column:17}},line:1820},"105":{name:"(anonymous_105)",decl:{start:{line:1826,column:52},end:{line:1826,column:53}},loc:{start:{line:1826,column:63},end:{line:1833,column:25}},line:1826},"106":{name:"(anonymous_106)",decl:{start:{line:1860,column:14},end:{line:1860,column:15}},loc:{start:{line:1860,column:25},end:{line:1862,column:9}},line:1860},"107":{name:"(anonymous_107)",decl:{start:{line:1872,column:27},end:{line:1872,column:28}},loc:{start:{line:1872,column:43},end:{line:1875,column:9}},line:1872},"108":{name:"(anonymous_108)",decl:{start:{line:1890,column:14},end:{line:1890,column:15}},loc:{start:{line:1890,column:43},end:{line:1892,column:9}},line:1890},"109":{name:"(anonymous_109)",decl:{start:{line:1909,column:14},end:{line:1909,column:15}},loc:{start:{line:1909,column:26},end:{line:1911,column:9}},line:1909},"110":{name:"(anonymous_110)",decl:{start:{line:1927,column:14},end:{line:1927,column:15}},loc:{start:{line:1927,column:50},end:{line:1930,column:9}},line:1927},"111":{name:"(anonymous_111)",decl:{start:{line:1956,column:14},end:{line:1956,column:15}},loc:{start:{line:1956,column:25},end:{line:1958,column:9}},line:1956},"112":{name:"(anonymous_112)",decl:{start:{line:1970,column:27},end:{line:1970,column:28}},loc:{start:{line:1970,column:43},end:{line:1973,column:9}},line:1970},"113":{name:"(anonymous_113)",decl:{start:{line:1988,column:14},end:{line:1988,column:15}},loc:{start:{line:1988,column:43},end:{line:1990,column:9}},line:1988},"114":{name:"(anonymous_114)",decl:{start:{line:2008,column:14},end:{line:2008,column:15}},loc:{start:{line:2008,column:25},end:{line:2010,column:9}},line:2008},"115":{name:"(anonymous_115)",decl:{start:{line:2020,column:17},end:{line:2020,column:18}},loc:{start:{line:2020,column:28},end:{line:2022,column:9}},line:2020},"116":{name:"(anonymous_116)",decl:{start:{line:2030,column:19},end:{line:2030,column:20}},loc:{start:{line:2030,column:30},end:{line:2032,column:9}},line:2030},"117":{name:"(anonymous_117)",decl:{start:{line:2043,column:22},end:{line:2043,column:23}},loc:{start:{line:2043,column:33},end:{line:2046,column:9}},line:2043},"118":{name:"(anonymous_118)",decl:{start:{line:2056,column:24},end:{line:2056,column:25}},loc:{start:{line:2056,column:35},end:{line:2058,column:9}},line:2056},"119":{name:"(anonymous_119)",decl:{start:{line:2066,column:25},end:{line:2066,column:26}},loc:{start:{line:2066,column:36},end:{line:2068,column:9}},line:2066},"120":{name:"(anonymous_120)",decl:{start:{line:2077,column:18},end:{line:2077,column:19}},loc:{start:{line:2077,column:29},end:{line:2079,column:9}},line:2077},"121":{name:"(anonymous_121)",decl:{start:{line:2087,column:13},end:{line:2087,column:14}},loc:{start:{line:2087,column:24},end:{line:2089,column:9}},line:2087},"122":{name:"(anonymous_122)",decl:{start:{line:2097,column:21},end:{line:2097,column:22}},loc:{start:{line:2097,column:32},end:{line:2099,column:9}},line:2097},"123":{name:"(anonymous_123)",decl:{start:{line:2109,column:29},end:{line:2109,column:30}},loc:{start:{line:2109,column:40},end:{line:2111,column:9}},line:2109},"124":{name:"(anonymous_124)",decl:{start:{line:2121,column:29},end:{line:2121,column:30}},loc:{start:{line:2121,column:40},end:{line:2123,column:9}},line:2121},"125":{name:"(anonymous_125)",decl:{start:{line:2139,column:14},end:{line:2139,column:15}},loc:{start:{line:2139,column:49},end:{line:2142,column:9}},line:2139},"126":{name:"(anonymous_126)",decl:{start:{line:2160,column:14},end:{line:2160,column:15}},loc:{start:{line:2160,column:25},end:{line:2162,column:9}},line:2160},"127":{name:"(anonymous_127)",decl:{start:{line:2172,column:15},end:{line:2172,column:16}},loc:{start:{line:2172,column:26},end:{line:2174,column:9}},line:2172},"128":{name:"(anonymous_128)",decl:{start:{line:2193,column:14},end:{line:2193,column:15}},loc:{start:{line:2193,column:42},end:{line:2221,column:9}},line:2193},"129":{name:"(anonymous_129)",decl:{start:{line:2199,column:35},end:{line:2199,column:36}},loc:{start:{line:2199,column:46},end:{line:2199,column:48}},line:2199},"130":{name:"(anonymous_130)",decl:{start:{line:2203,column:41},end:{line:2203,column:42}},loc:{start:{line:2203,column:65},end:{line:2220,column:13}},line:2203},"131":{name:"(anonymous_131)",decl:{start:{line:2237,column:14},end:{line:2237,column:15}},loc:{start:{line:2237,column:49},end:{line:2242,column:9}},line:2237},"132":{name:"(anonymous_132)",decl:{start:{line:2261,column:14},end:{line:2261,column:15}},loc:{start:{line:2261,column:25},end:{line:2263,column:9}},line:2261},"133":{name:"(anonymous_133)",decl:{start:{line:2273,column:27},end:{line:2273,column:28}},loc:{start:{line:2273,column:43},end:{line:2276,column:9}},line:2273},"134":{name:"(anonymous_134)",decl:{start:{line:2283,column:16},end:{line:2283,column:17}},loc:{start:{line:2283,column:27},end:{line:2285,column:9}},line:2283},"135":{name:"(anonymous_135)",decl:{start:{line:2300,column:14},end:{line:2300,column:15}},loc:{start:{line:2300,column:43},end:{line:2305,column:9}},line:2300},"136":{name:"(anonymous_136)",decl:{start:{line:2330,column:14},end:{line:2330,column:15}},loc:{start:{line:2330,column:25},end:{line:2332,column:9}},line:2330},"137":{name:"(anonymous_137)",decl:{start:{line:2344,column:14},end:{line:2344,column:15}},loc:{start:{line:2344,column:38},end:{line:2350,column:9}},line:2344},"138":{name:"(anonymous_138)",decl:{start:{line:2367,column:19},end:{line:2367,column:20}},loc:{start:{line:2367,column:38},end:{line:2379,column:9}},line:2367},"139":{name:"(anonymous_139)",decl:{start:{line:2368,column:35},end:{line:2368,column:36}},loc:{start:{line:2368,column:46},end:{line:2368,column:48}},line:2368},"140":{name:"(anonymous_140)",decl:{start:{line:2371,column:41},end:{line:2371,column:42}},loc:{start:{line:2371,column:65},end:{line:2378,column:13}},line:2371},"141":{name:"(anonymous_141)",decl:{start:{line:2396,column:20},end:{line:2396,column:21}},loc:{start:{line:2396,column:39},end:{line:2408,column:9}},line:2396},"142":{name:"(anonymous_142)",decl:{start:{line:2397,column:35},end:{line:2397,column:36}},loc:{start:{line:2397,column:46},end:{line:2397,column:48}},line:2397},"143":{name:"(anonymous_143)",decl:{start:{line:2400,column:42},end:{line:2400,column:43}},loc:{start:{line:2400,column:66},end:{line:2407,column:13}},line:2400},"144":{name:"(anonymous_144)",decl:{start:{line:2434,column:14},end:{line:2434,column:15}},loc:{start:{line:2434,column:25},end:{line:2436,column:9}},line:2434},"145":{name:"(anonymous_145)",decl:{start:{line:2446,column:27},end:{line:2446,column:28}},loc:{start:{line:2446,column:43},end:{line:2448,column:9}},line:2446},"146":{name:"(anonymous_146)",decl:{start:{line:2459,column:14},end:{line:2459,column:15}},loc:{start:{line:2459,column:32},end:{line:2461,column:9}},line:2459},"147":{name:"(anonymous_147)",decl:{start:{line:2477,column:14},end:{line:2477,column:15}},loc:{start:{line:2477,column:25},end:{line:2479,column:9}},line:2477},"148":{name:"(anonymous_148)",decl:{start:{line:2490,column:14},end:{line:2490,column:15}},loc:{start:{line:2490,column:32},end:{line:2493,column:9}},line:2490},"149":{name:"(anonymous_149)",decl:{start:{line:2510,column:14},end:{line:2510,column:15}},loc:{start:{line:2510,column:25},end:{line:2512,column:9}},line:2510},"150":{name:"(anonymous_150)",decl:{start:{line:2524,column:14},end:{line:2524,column:15}},loc:{start:{line:2524,column:38},end:{line:2527,column:9}},line:2524},"151":{name:"(anonymous_151)",decl:{start:{line:2553,column:14},end:{line:2553,column:15}},loc:{start:{line:2553,column:25},end:{line:2555,column:9}},line:2553},"152":{name:"(anonymous_152)",decl:{start:{line:2565,column:27},end:{line:2565,column:28}},loc:{start:{line:2565,column:43},end:{line:2567,column:9}},line:2565},"153":{name:"(anonymous_153)",decl:{start:{line:2578,column:14},end:{line:2578,column:15}},loc:{start:{line:2578,column:32},end:{line:2580,column:9}},line:2578},"154":{name:"(anonymous_154)",decl:{start:{line:2592,column:16},end:{line:2592,column:17}},loc:{start:{line:2592,column:43},end:{line:2617,column:9}},line:2592},"155":{name:"(anonymous_155)",decl:{start:{line:2593,column:35},end:{line:2593,column:36}},loc:{start:{line:2593,column:46},end:{line:2593,column:48}},line:2593},"156":{name:"(anonymous_156)",decl:{start:{line:2596,column:44},end:{line:2596,column:45}},loc:{start:{line:2596,column:68},end:{line:2614,column:13}},line:2596},"157":{name:"(anonymous_157)",decl:{start:{line:2605,column:33},end:{line:2605,column:34}},loc:{start:{line:2605,column:44},end:{line:2612,column:21}},line:2605},"158":{name:"(anonymous_158)",decl:{start:{line:2634,column:14},end:{line:2634,column:15}},loc:{start:{line:2634,column:25},end:{line:2636,column:9}},line:2634},"159":{name:"(anonymous_159)",decl:{start:{line:2652,column:14},end:{line:2652,column:15}},loc:{start:{line:2652,column:49},end:{line:2655,column:9}},line:2652},"160":{name:"(anonymous_160)",decl:{start:{line:2672,column:14},end:{line:2672,column:15}},loc:{start:{line:2672,column:25},end:{line:2674,column:9}},line:2672},"161":{name:"(anonymous_161)",decl:{start:{line:2684,column:27},end:{line:2684,column:28}},loc:{start:{line:2684,column:43},end:{line:2687,column:9}},line:2684},"162":{name:"(anonymous_162)",decl:{start:{line:2702,column:14},end:{line:2702,column:15}},loc:{start:{line:2702,column:43},end:{line:2704,column:9}},line:2702},"163":{name:"(anonymous_163)",decl:{start:{line:2720,column:14},end:{line:2720,column:15}},loc:{start:{line:2720,column:25},end:{line:2722,column:9}},line:2720},"164":{name:"(anonymous_164)",decl:{start:{line:2738,column:14},end:{line:2738,column:15}},loc:{start:{line:2738,column:49},end:{line:2743,column:9}},line:2738},"165":{name:"(anonymous_165)",decl:{start:{line:2766,column:21},end:{line:2766,column:22}},loc:{start:{line:2766,column:55},end:{line:2782,column:9}},line:2766},"166":{name:"(anonymous_166)",decl:{start:{line:2772,column:35},end:{line:2772,column:36}},loc:{start:{line:2772,column:46},end:{line:2772,column:48}},line:2772},"167":{name:"(anonymous_167)",decl:{start:{line:2779,column:51},end:{line:2779,column:52}},loc:{start:{line:2779,column:73},end:{line:2781,column:13}},line:2779},"168":{name:"(anonymous_168)",decl:{start:{line:2784,column:16},end:{line:2784,column:17}},loc:{start:{line:2784,column:35},end:{line:2791,column:9}},line:2784},"169":{name:"(anonymous_169)",decl:{start:{line:2808,column:14},end:{line:2808,column:15}},loc:{start:{line:2808,column:25},end:{line:2810,column:9}},line:2808},"170":{name:"(anonymous_170)",decl:{start:{line:2820,column:27},end:{line:2820,column:28}},loc:{start:{line:2820,column:43},end:{line:2823,column:9}},line:2820},"171":{name:"(anonymous_171)",decl:{start:{line:2838,column:14},end:{line:2838,column:15}},loc:{start:{line:2838,column:43},end:{line:2840,column:9}},line:2838},"172":{name:"(anonymous_172)",decl:{start:{line:2859,column:16},end:{line:2859,column:17}},loc:{start:{line:2859,column:49},end:{line:2872,column:9}},line:2859},"173":{name:"(anonymous_173)",decl:{start:{line:2889,column:14},end:{line:2889,column:15}},loc:{start:{line:2889,column:25},end:{line:2892,column:9}},line:2889},"174":{name:"(anonymous_174)",decl:{start:{line:2909,column:14},end:{line:2909,column:15}},loc:{start:{line:2909,column:55},end:{line:2913,column:9}},line:2909},"175":{name:"(anonymous_175)",decl:{start:{line:2931,column:14},end:{line:2931,column:15}},loc:{start:{line:2931,column:25},end:{line:2933,column:9}},line:2931},"176":{name:"(anonymous_176)",decl:{start:{line:2945,column:26},end:{line:2945,column:27}},loc:{start:{line:2945,column:37},end:{line:2947,column:9}},line:2945},"177":{name:"(anonymous_177)",decl:{start:{line:2957,column:27},end:{line:2957,column:28}},loc:{start:{line:2957,column:43},end:{line:2960,column:9}},line:2957},"178":{name:"(anonymous_178)",decl:{start:{line:2976,column:14},end:{line:2976,column:15}},loc:{start:{line:2976,column:49},end:{line:2979,column:9}},line:2976},"179":{name:"(anonymous_179)",decl:{start:{line:2998,column:16},end:{line:2998,column:17}},loc:{start:{line:2998,column:55},end:{line:3016,column:9}},line:2998},"180":{name:"(anonymous_180)",decl:{start:{line:3042,column:14},end:{line:3042,column:15}},loc:{start:{line:3042,column:25},end:{line:3044,column:9}},line:3042},"181":{name:"(anonymous_181)",decl:{start:{line:3054,column:27},end:{line:3054,column:28}},loc:{start:{line:3054,column:43},end:{line:3056,column:9}},line:3054},"182":{name:"(anonymous_182)",decl:{start:{line:3071,column:14},end:{line:3071,column:15}},loc:{start:{line:3071,column:43},end:{line:3077,column:9}},line:3071},"183":{name:"(anonymous_183)",decl:{start:{line:3095,column:16},end:{line:3095,column:17}},loc:{start:{line:3095,column:45},end:{line:3123,column:9}},line:3095},"184":{name:"(anonymous_184)",decl:{start:{line:3102,column:35},end:{line:3102,column:36}},loc:{start:{line:3102,column:46},end:{line:3102,column:48}},line:3102},"185":{name:"(anonymous_185)",decl:{start:{line:3105,column:56},end:{line:3105,column:57}},loc:{start:{line:3105,column:80},end:{line:3120,column:13}},line:3105},"186":{name:"(anonymous_186)",decl:{start:{line:3111,column:33},end:{line:3111,column:34}},loc:{start:{line:3111,column:44},end:{line:3118,column:21}},line:3111},"187":{name:"(anonymous_187)",decl:{start:{line:3125,column:23},end:{line:3125,column:24}},loc:{start:{line:3125,column:48},end:{line:3151,column:9}},line:3125},"188":{name:"(anonymous_188)",decl:{start:{line:3133,column:58},end:{line:3133,column:59}},loc:{start:{line:3133,column:63},end:{line:3133,column:82}},line:3133},"189":{name:"(anonymous_189)",decl:{start:{line:3153,column:25},end:{line:3153,column:26}},loc:{start:{line:3153,column:54},end:{line:3169,column:9}},line:3153},"190":{name:"(anonymous_190)",decl:{start:{line:3171,column:19},end:{line:3171,column:20}},loc:{start:{line:3171,column:90},end:{line:3212,column:9}},line:3171},"191":{name:"(anonymous_191)",decl:{start:{line:3172,column:35},end:{line:3172,column:36}},loc:{start:{line:3172,column:46},end:{line:3172,column:48}},line:3172},"192":{name:"(anonymous_192)",decl:{start:{line:3185,column:20},end:{line:3185,column:21}},loc:{start:{line:3185,column:38},end:{line:3185,column:92}},line:3185},"193":{name:"(anonymous_193)",decl:{start:{line:3200,column:55},end:{line:3200,column:56}},loc:{start:{line:3200,column:81},end:{line:3203,column:17}},line:3200},"194":{name:"(anonymous_194)",decl:{start:{line:3207,column:49},end:{line:3207,column:50}},loc:{start:{line:3207,column:73},end:{line:3210,column:17}},line:3207},"195":{name:"(anonymous_195)",decl:{start:{line:3229,column:14},end:{line:3229,column:15}},loc:{start:{line:3229,column:25},end:{line:3231,column:9}},line:3229},"196":{name:"(anonymous_196)",decl:{start:{line:3247,column:14},end:{line:3247,column:15}},loc:{start:{line:3247,column:48},end:{line:3269,column:9}},line:3247},"197":{name:"(anonymous_197)",decl:{start:{line:3286,column:16},end:{line:3286,column:17}},loc:{start:{line:3286,column:35},end:{line:3290,column:9}},line:3286},"198":{name:"(anonymous_198)",decl:{start:{line:3307,column:24},end:{line:3307,column:25}},loc:{start:{line:3307,column:43},end:{line:3316,column:9}},line:3307},"199":{name:"(anonymous_199)",decl:{start:{line:3308,column:35},end:{line:3308,column:36}},loc:{start:{line:3308,column:46},end:{line:3308,column:48}},line:3308},"200":{name:"(anonymous_200)",decl:{start:{line:3311,column:71},end:{line:3311,column:72}},loc:{start:{line:3311,column:85},end:{line:3313,column:13}},line:3311},"201":{name:"(anonymous_201)",decl:{start:{line:3333,column:23},end:{line:3333,column:24}},loc:{start:{line:3333,column:42},end:{line:3342,column:9}},line:3333},"202":{name:"(anonymous_202)",decl:{start:{line:3334,column:35},end:{line:3334,column:36}},loc:{start:{line:3334,column:46},end:{line:3334,column:48}},line:3334},"203":{name:"(anonymous_203)",decl:{start:{line:3337,column:70},end:{line:3337,column:71}},loc:{start:{line:3337,column:84},end:{line:3339,column:13}},line:3337},"204":{name:"(anonymous_204)",decl:{start:{line:3360,column:16},end:{line:3360,column:17}},loc:{start:{line:3360,column:43},end:{line:3374,column:9}},line:3360},"205":{name:"(anonymous_205)",decl:{start:{line:3361,column:35},end:{line:3361,column:36}},loc:{start:{line:3361,column:46},end:{line:3361,column:48}},line:3361},"206":{name:"(anonymous_206)",decl:{start:{line:3366,column:46},end:{line:3366,column:47}},loc:{start:{line:3366,column:70},end:{line:3373,column:13}},line:3366},"207":{name:"(anonymous_207)",decl:{start:{line:3391,column:18},end:{line:3391,column:19}},loc:{start:{line:3391,column:37},end:{line:3400,column:9}},line:3391},"208":{name:"(anonymous_208)",decl:{start:{line:3392,column:35},end:{line:3392,column:36}},loc:{start:{line:3392,column:46},end:{line:3392,column:48}},line:3392},"209":{name:"(anonymous_209)",decl:{start:{line:3395,column:65},end:{line:3395,column:66}},loc:{start:{line:3395,column:79},end:{line:3397,column:13}},line:3395},"210":{name:"(anonymous_210)",decl:{start:{line:3413,column:18},end:{line:3413,column:19}},loc:{start:{line:3413,column:41},end:{line:3415,column:9}},line:3413},"211":{name:"(anonymous_211)",decl:{start:{line:3432,column:15},end:{line:3432,column:16}},loc:{start:{line:3432,column:34},end:{line:3441,column:9}},line:3432},"212":{name:"(anonymous_212)",decl:{start:{line:3433,column:35},end:{line:3433,column:36}},loc:{start:{line:3433,column:46},end:{line:3433,column:48}},line:3433},"213":{name:"(anonymous_213)",decl:{start:{line:3436,column:62},end:{line:3436,column:63}},loc:{start:{line:3436,column:76},end:{line:3438,column:13}},line:3436},"214":{name:"(anonymous_214)",decl:{start:{line:3459,column:17},end:{line:3459,column:18}},loc:{start:{line:3459,column:44},end:{line:3473,column:9}},line:3459},"215":{name:"(anonymous_215)",decl:{start:{line:3460,column:35},end:{line:3460,column:36}},loc:{start:{line:3460,column:46},end:{line:3460,column:48}},line:3460},"216":{name:"(anonymous_216)",decl:{start:{line:3465,column:55},end:{line:3465,column:56}},loc:{start:{line:3465,column:79},end:{line:3472,column:13}},line:3465},"217":{name:"(anonymous_217)",decl:{start:{line:3496,column:17},end:{line:3496,column:18}},loc:{start:{line:3496,column:44},end:{line:3510,column:9}},line:3496},"218":{name:"(anonymous_218)",decl:{start:{line:3497,column:35},end:{line:3497,column:36}},loc:{start:{line:3497,column:46},end:{line:3497,column:48}},line:3497},"219":{name:"(anonymous_219)",decl:{start:{line:3502,column:47},end:{line:3502,column:48}},loc:{start:{line:3502,column:71},end:{line:3509,column:13}},line:3502},"220":{name:"(anonymous_220)",decl:{start:{line:3527,column:19},end:{line:3527,column:20}},loc:{start:{line:3527,column:38},end:{line:3539,column:9}},line:3527},"221":{name:"(anonymous_221)",decl:{start:{line:3528,column:35},end:{line:3528,column:36}},loc:{start:{line:3528,column:46},end:{line:3528,column:48}},line:3528},"222":{name:"(anonymous_222)",decl:{start:{line:3531,column:46},end:{line:3531,column:47}},loc:{start:{line:3531,column:70},end:{line:3538,column:13}},line:3531},"223":{name:"(anonymous_223)",decl:{start:{line:3557,column:21},end:{line:3557,column:22}},loc:{start:{line:3557,column:47},end:{line:3566,column:9}},line:3557},"224":{name:"(anonymous_224)",decl:{start:{line:3558,column:35},end:{line:3558,column:36}},loc:{start:{line:3558,column:46},end:{line:3558,column:48}},line:3558},"225":{name:"(anonymous_225)",decl:{start:{line:3561,column:85},end:{line:3561,column:86}},loc:{start:{line:3561,column:99},end:{line:3563,column:13}},line:3561},"226":{name:"(anonymous_226)",decl:{start:{line:3585,column:16},end:{line:3585,column:17}},loc:{start:{line:3585,column:42},end:{line:3594,column:9}},line:3585},"227":{name:"(anonymous_227)",decl:{start:{line:3586,column:35},end:{line:3586,column:36}},loc:{start:{line:3586,column:46},end:{line:3586,column:48}},line:3586},"228":{name:"(anonymous_228)",decl:{start:{line:3589,column:75},end:{line:3589,column:76}},loc:{start:{line:3589,column:89},end:{line:3591,column:13}},line:3589},"229":{name:"(anonymous_229)",decl:{start:{line:3612,column:17},end:{line:3612,column:18}},loc:{start:{line:3612,column:44},end:{line:3624,column:9}},line:3612},"230":{name:"(anonymous_230)",decl:{start:{line:3613,column:35},end:{line:3613,column:36}},loc:{start:{line:3613,column:46},end:{line:3613,column:48}},line:3613},"231":{name:"(anonymous_231)",decl:{start:{line:3616,column:47},end:{line:3616,column:48}},loc:{start:{line:3616,column:71},end:{line:3623,column:13}},line:3616},"232":{name:"(anonymous_232)",decl:{start:{line:3642,column:18},end:{line:3642,column:19}},loc:{start:{line:3642,column:45},end:{line:3654,column:9}},line:3642},"233":{name:"(anonymous_233)",decl:{start:{line:3643,column:35},end:{line:3643,column:36}},loc:{start:{line:3643,column:46},end:{line:3643,column:48}},line:3643},"234":{name:"(anonymous_234)",decl:{start:{line:3646,column:48},end:{line:3646,column:49}},loc:{start:{line:3646,column:72},end:{line:3653,column:13}},line:3646},"235":{name:"(anonymous_235)",decl:{start:{line:3672,column:15},end:{line:3672,column:16}},loc:{start:{line:3672,column:34},end:{line:3681,column:9}},line:3672},"236":{name:"(anonymous_236)",decl:{start:{line:3673,column:35},end:{line:3673,column:36}},loc:{start:{line:3673,column:46},end:{line:3673,column:48}},line:3673},"237":{name:"(anonymous_237)",decl:{start:{line:3676,column:62},end:{line:3676,column:63}},loc:{start:{line:3676,column:76},end:{line:3678,column:13}},line:3676},"238":{name:"(anonymous_238)",decl:{start:{line:3699,column:15},end:{line:3699,column:16}},loc:{start:{line:3699,column:44},end:{line:3787,column:9}},line:3699},"239":{name:"(anonymous_239)",decl:{start:{line:3715,column:49},end:{line:3715,column:50}},loc:{start:{line:3715,column:60},end:{line:3715,column:62}},line:3715},"240":{name:"(anonymous_240)",decl:{start:{line:3716,column:55},end:{line:3716,column:56}},loc:{start:{line:3716,column:66},end:{line:3716,column:68}},line:3716},"241":{name:"(anonymous_241)",decl:{start:{line:3717,column:47},end:{line:3717,column:48}},loc:{start:{line:3717,column:58},end:{line:3717,column:60}},line:3717},"242":{name:"(anonymous_242)",decl:{start:{line:3718,column:51},end:{line:3718,column:52}},loc:{start:{line:3718,column:62},end:{line:3718,column:64}},line:3718},"243":{name:"(anonymous_243)",decl:{start:{line:3719,column:49},end:{line:3719,column:50}},loc:{start:{line:3719,column:60},end:{line:3719,column:62}},line:3719},"244":{name:"(anonymous_244)",decl:{start:{line:3722,column:57},end:{line:3722,column:58}},loc:{start:{line:3722,column:68},end:{line:3722,column:70}},line:3722},"245":{name:"(anonymous_245)",decl:{start:{line:3723,column:75},end:{line:3723,column:76}},loc:{start:{line:3723,column:86},end:{line:3723,column:88}},line:3723},"246":{name:"(anonymous_246)",decl:{start:{line:3729,column:16},end:{line:3729,column:17}},loc:{start:{line:3729,column:27},end:{line:3729,column:51}},line:3729},"247":{name:"(anonymous_247)",decl:{start:{line:3730,column:16},end:{line:3730,column:17}},loc:{start:{line:3730,column:40},end:{line:3780,column:17}},line:3730},"248":{name:"(anonymous_248)",decl:{start:{line:3731,column:31},end:{line:3731,column:32}},loc:{start:{line:3731,column:50},end:{line:3779,column:21}},line:3731},"249":{name:"(anonymous_249)",decl:{start:{line:3781,column:16},end:{line:3781,column:17}},loc:{start:{line:3781,column:30},end:{line:3785,column:17}},line:3781},"250":{name:"(anonymous_250)",decl:{start:{line:3804,column:17},end:{line:3804,column:18}},loc:{start:{line:3804,column:36},end:{line:3813,column:9}},line:3804},"251":{name:"(anonymous_251)",decl:{start:{line:3805,column:35},end:{line:3805,column:36}},loc:{start:{line:3805,column:46},end:{line:3805,column:48}},line:3805},"252":{name:"(anonymous_252)",decl:{start:{line:3808,column:64},end:{line:3808,column:65}},loc:{start:{line:3808,column:78},end:{line:3810,column:13}},line:3808},"253":{name:"(anonymous_253)",decl:{start:{line:3830,column:14},end:{line:3830,column:15}},loc:{start:{line:3830,column:25},end:{line:3832,column:9}},line:3830},"254":{name:"(anonymous_254)",decl:{start:{line:3842,column:27},end:{line:3842,column:28}},loc:{start:{line:3842,column:43},end:{line:3846,column:9}},line:3842},"255":{name:"(anonymous_255)",decl:{start:{line:3861,column:14},end:{line:3861,column:15}},loc:{start:{line:3861,column:43},end:{line:3867,column:9}},line:3861},"256":{name:"(anonymous_256)",decl:{start:{line:3886,column:16},end:{line:3886,column:17}},loc:{start:{line:3886,column:50},end:{line:3917,column:9}},line:3886},"257":{name:"(anonymous_257)",decl:{start:{line:3895,column:35},end:{line:3895,column:36}},loc:{start:{line:3895,column:46},end:{line:3895,column:48}},line:3895},"258":{name:"(anonymous_258)",decl:{start:{line:3908,column:41},end:{line:3908,column:42}},loc:{start:{line:3908,column:65},end:{line:3916,column:13}},line:3908},"259":{name:"(anonymous_259)",decl:{start:{line:3944,column:16},end:{line:3944,column:17}},loc:{start:{line:3944,column:50},end:{line:3946,column:9}},line:3944},"260":{name:"(anonymous_260)",decl:{start:{line:3969,column:23},end:{line:3969,column:24}},loc:{start:{line:3969,column:57},end:{line:4014,column:9}},line:3969},"261":{name:"(anonymous_261)",decl:{start:{line:3978,column:35},end:{line:3978,column:36}},loc:{start:{line:3978,column:46},end:{line:3978,column:48}},line:3978},"262":{name:"(anonymous_262)",decl:{start:{line:4003,column:16},end:{line:4003,column:17}},loc:{start:{line:4003,column:40},end:{line:4010,column:17}},line:4003},"263":{name:"(anonymous_263)",decl:{start:{line:4071,column:14},end:{line:4071,column:15}},loc:{start:{line:4071,column:30},end:{line:4086,column:9}},line:4071},"264":{name:"(anonymous_264)",decl:{start:{line:4095,column:18},end:{line:4095,column:19}},loc:{start:{line:4095,column:29},end:{line:4097,column:9}},line:4095},"265":{name:"(anonymous_265)",decl:{start:{line:4106,column:18},end:{line:4106,column:19}},loc:{start:{line:4106,column:29},end:{line:4108,column:9}},line:4106},"266":{name:"(anonymous_266)",decl:{start:{line:4117,column:21},end:{line:4117,column:22}},loc:{start:{line:4117,column:32},end:{line:4119,column:9}},line:4117},"267":{name:"(anonymous_267)",decl:{start:{line:4128,column:23},end:{line:4128,column:24}},loc:{start:{line:4128,column:34},end:{line:4130,column:9}},line:4128},"268":{name:"(anonymous_268)",decl:{start:{line:4139,column:22},end:{line:4139,column:23}},loc:{start:{line:4139,column:33},end:{line:4141,column:9}},line:4139},"269":{name:"(anonymous_269)",decl:{start:{line:4150,column:16},end:{line:4150,column:17}},loc:{start:{line:4150,column:27},end:{line:4152,column:9}},line:4150},"270":{name:"(anonymous_270)",decl:{start:{line:4161,column:19},end:{line:4161,column:20}},loc:{start:{line:4161,column:30},end:{line:4163,column:9}},line:4161},"271":{name:"(anonymous_271)",decl:{start:{line:4191,column:14},end:{line:4191,column:15}},loc:{start:{line:4191,column:30},end:{line:4198,column:9}},line:4191},"272":{name:"(anonymous_272)",decl:{start:{line:4257,column:14},end:{line:4257,column:15}},loc:{start:{line:4257,column:30},end:{line:4283,column:9}},line:4257},"273":{name:"(anonymous_273)",decl:{start:{line:4292,column:26},end:{line:4292,column:27}},loc:{start:{line:4292,column:37},end:{line:4294,column:9}},line:4292},"274":{name:"(anonymous_274)",decl:{start:{line:4303,column:20},end:{line:4303,column:21}},loc:{start:{line:4303,column:31},end:{line:4305,column:9}},line:4303},"275":{name:"(anonymous_275)",decl:{start:{line:4314,column:18},end:{line:4314,column:19}},loc:{start:{line:4314,column:29},end:{line:4316,column:9}},line:4314},"276":{name:"(anonymous_276)",decl:{start:{line:4325,column:16},end:{line:4325,column:17}},loc:{start:{line:4325,column:27},end:{line:4327,column:9}},line:4325},"277":{name:"(anonymous_277)",decl:{start:{line:4336,column:15},end:{line:4336,column:16}},loc:{start:{line:4336,column:26},end:{line:4338,column:9}},line:4336},"278":{name:"(anonymous_278)",decl:{start:{line:4347,column:17},end:{line:4347,column:18}},loc:{start:{line:4347,column:28},end:{line:4349,column:9}},line:4347},"279":{name:"(anonymous_279)",decl:{start:{line:4382,column:14},end:{line:4382,column:15}},loc:{start:{line:4382,column:39},end:{line:4391,column:9}},line:4382},"280":{name:"(anonymous_280)",decl:{start:{line:4401,column:13},end:{line:4401,column:14}},loc:{start:{line:4401,column:38},end:{line:4412,column:9}},line:4401},"281":{name:"(anonymous_281)",decl:{start:{line:4543,column:14},end:{line:4543,column:15}},loc:{start:{line:4543,column:40},end:{line:4555,column:9}},line:4543},"282":{name:"(anonymous_282)",decl:{start:{line:4568,column:28},end:{line:4568,column:29}},loc:{start:{line:4568,column:42},end:{line:4580,column:9}},line:4568},"283":{name:"(anonymous_283)",decl:{start:{line:4594,column:19},end:{line:4594,column:20}},loc:{start:{line:4594,column:80},end:{line:4627,column:9}},line:4594},"284":{name:"(anonymous_284)",decl:{start:{line:4642,column:24},end:{line:4642,column:25}},loc:{start:{line:4642,column:96},end:{line:4682,column:9}},line:4642},"285":{name:"(anonymous_285)",decl:{start:{line:4693,column:21},end:{line:4693,column:22}},loc:{start:{line:4693,column:48},end:{line:4716,column:9}},line:4693},"286":{name:"(anonymous_286)",decl:{start:{line:4737,column:26},end:{line:4737,column:27}},loc:{start:{line:4737,column:57},end:{line:4769,column:9}},line:4737},"287":{name:"(anonymous_287)",decl:{start:{line:4782,column:28},end:{line:4782,column:29}},loc:{start:{line:4782,column:88},end:{line:4801,column:9}},line:4782},"288":{name:"(anonymous_288)",decl:{start:{line:4813,column:30},end:{line:4813,column:31}},loc:{start:{line:4813,column:62},end:{line:4834,column:9}},line:4813},"289":{name:"(anonymous_289)",decl:{start:{line:4845,column:24},end:{line:4845,column:25}},loc:{start:{line:4845,column:44},end:{line:4867,column:9}},line:4845},"290":{name:"(anonymous_290)",decl:{start:{line:4882,column:29},end:{line:4882,column:30}},loc:{start:{line:4882,column:57},end:{line:4916,column:9}},line:4882},"291":{name:"(anonymous_291)",decl:{start:{line:4928,column:31},end:{line:4928,column:32}},loc:{start:{line:4928,column:88},end:{line:4946,column:9}},line:4928},"292":{name:"(anonymous_292)",decl:{start:{line:4957,column:33},end:{line:4957,column:34}},loc:{start:{line:4957,column:58},end:{line:4977,column:9}},line:4957},"293":{name:"(anonymous_293)",decl:{start:{line:4989,column:22},end:{line:4989,column:23}},loc:{start:{line:4989,column:64},end:{line:5059,column:9}},line:4989},"294":{name:"(anonymous_294)",decl:{start:{line:5068,column:22},end:{line:5068,column:23}},loc:{start:{line:5068,column:33},end:{line:5077,column:9}},line:5068},"295":{name:"(anonymous_295)",decl:{start:{line:5101,column:15},end:{line:5101,column:16}},loc:{start:{line:5101,column:34},end:{line:5125,column:9}},line:5101},"296":{name:"(anonymous_296)",decl:{start:{line:5112,column:110},end:{line:5112,column:111}},loc:{start:{line:5112,column:134},end:{line:5124,column:13}},line:5112},"297":{name:"(anonymous_297)",decl:{start:{line:5153,column:13},end:{line:5153,column:14}},loc:{start:{line:5153,column:38},end:{line:5168,column:9}},line:5153},"298":{name:"(anonymous_298)",decl:{start:{line:5160,column:23},end:{line:5160,column:24}},loc:{start:{line:5160,column:44},end:{line:5167,column:13}},line:5160},"299":{name:"(anonymous_299)",decl:{start:{line:5224,column:14},end:{line:5224,column:15}},loc:{start:{line:5224,column:47},end:{line:5270,column:9}},line:5224},"300":{name:"(anonymous_300)",decl:{start:{line:5279,column:22},end:{line:5279,column:23}},loc:{start:{line:5279,column:33},end:{line:5281,column:9}},line:5279},"301":{name:"(anonymous_301)",decl:{start:{line:5290,column:27},end:{line:5290,column:28}},loc:{start:{line:5290,column:38},end:{line:5292,column:9}},line:5290},"302":{name:"(anonymous_302)",decl:{start:{line:5302,column:20},end:{line:5302,column:21}},loc:{start:{line:5302,column:31},end:{line:5304,column:9}},line:5302},"303":{name:"(anonymous_303)",decl:{start:{line:5316,column:21},end:{line:5316,column:22}},loc:{start:{line:5316,column:36},end:{line:5318,column:9}},line:5316},"304":{name:"(anonymous_304)",decl:{start:{line:5330,column:19},end:{line:5330,column:20}},loc:{start:{line:5330,column:30},end:{line:5348,column:9}},line:5330},"305":{name:"(anonymous_305)",decl:{start:{line:5360,column:23},end:{line:5360,column:24}},loc:{start:{line:5360,column:34},end:{line:5362,column:9}},line:5360},"306":{name:"(anonymous_306)",decl:{start:{line:5373,column:26},end:{line:5373,column:27}},loc:{start:{line:5373,column:36},end:{line:5385,column:9}},line:5373},"307":{name:"(anonymous_307)",decl:{start:{line:5396,column:30},end:{line:5396,column:31}},loc:{start:{line:5396,column:41},end:{line:5398,column:9}},line:5396},"308":{name:"(anonymous_308)",decl:{start:{line:5409,column:18},end:{line:5409,column:19}},loc:{start:{line:5409,column:38},end:{line:5411,column:9}},line:5409},"309":{name:"(anonymous_309)",decl:{start:{line:5422,column:24},end:{line:5422,column:25}},loc:{start:{line:5422,column:35},end:{line:5424,column:9}},line:5422},"310":{name:"(anonymous_310)",decl:{start:{line:5452,column:36},end:{line:5452,column:37}},loc:{start:{line:5452,column:69},end:{line:5463,column:9}},line:5452},"311":{name:"(anonymous_311)",decl:{start:{line:5484,column:21},end:{line:5484,column:22}},loc:{start:{line:5484,column:61},end:{line:5489,column:9}},line:5484},"312":{name:"(anonymous_312)",decl:{start:{line:5500,column:16},end:{line:5500,column:17}},loc:{start:{line:5500,column:27},end:{line:5502,column:9}},line:5500},"313":{name:"(anonymous_313)",decl:{start:{line:5511,column:34},end:{line:5511,column:35}},loc:{start:{line:5511,column:45},end:{line:5514,column:9}},line:5511},"314":{name:"(anonymous_314)",decl:{start:{line:5532,column:14},end:{line:5532,column:15}},loc:{start:{line:5532,column:25},end:{line:5534,column:9}},line:5532},"315":{name:"(anonymous_315)",decl:{start:{line:5554,column:14},end:{line:5554,column:15}},loc:{start:{line:5554,column:56},end:{line:5591,column:9}},line:5554},"316":{name:"(anonymous_316)",decl:{start:{line:5600,column:23},end:{line:5600,column:24}},loc:{start:{line:5600,column:34},end:{line:5602,column:9}},line:5600},"317":{name:"(anonymous_317)",decl:{start:{line:5612,column:22},end:{line:5612,column:23}},loc:{start:{line:5612,column:37},end:{line:5619,column:9}},line:5612},"318":{name:"(anonymous_318)",decl:{start:{line:5628,column:19},end:{line:5628,column:20}},loc:{start:{line:5628,column:34},end:{line:5630,column:9}},line:5628},"319":{name:"(anonymous_319)",decl:{start:{line:5644,column:16},end:{line:5644,column:17}},loc:{start:{line:5644,column:42},end:{line:5678,column:9}},line:5644},"320":{name:"(anonymous_320)",decl:{start:{line:5649,column:35},end:{line:5649,column:36}},loc:{start:{line:5649,column:46},end:{line:5649,column:48}},line:5649},"321":{name:"(anonymous_321)",decl:{start:{line:5669,column:47},end:{line:5669,column:48}},loc:{start:{line:5669,column:71},end:{line:5677,column:13}},line:5669},"322":{name:"(anonymous_322)",decl:{start:{line:5696,column:14},end:{line:5696,column:15}},loc:{start:{line:5696,column:25},end:{line:5698,column:9}},line:5696},"323":{name:"(anonymous_323)",decl:{start:{line:5712,column:14},end:{line:5712,column:15}},loc:{start:{line:5712,column:43},end:{line:5716,column:9}},line:5712},"324":{name:"(anonymous_324)",decl:{start:{line:5730,column:16},end:{line:5730,column:17}},loc:{start:{line:5730,column:49},end:{line:5752,column:9}},line:5730},"325":{name:"(anonymous_325)",decl:{start:{line:5739,column:35},end:{line:5739,column:36}},loc:{start:{line:5739,column:45},end:{line:5739,column:47}},line:5739},"326":{name:"(anonymous_326)",decl:{start:{line:5743,column:84},end:{line:5743,column:85}},loc:{start:{line:5743,column:108},end:{line:5751,column:13}},line:5743},"327":{name:"(anonymous_327)",decl:{start:{line:5764,column:27},end:{line:5764,column:28}},loc:{start:{line:5764,column:43},end:{line:5767,column:9}},line:5764},"328":{name:"(anonymous_328)",decl:{start:{line:5773,column:14},end:{line:5773,column:15}},loc:{start:{line:5773,column:41},end:{line:5779,column:9}},line:5773},"329":{name:"(anonymous_329)",decl:{start:{line:5782,column:14},end:{line:5782,column:15}},loc:{start:{line:5782,column:33},end:{line:5801,column:9}},line:5782},"330":{name:"(anonymous_330)",decl:{start:{line:5783,column:35},end:{line:5783,column:36}},loc:{start:{line:5783,column:46},end:{line:5783,column:48}},line:5783},"331":{name:"(anonymous_331)",decl:{start:{line:5790,column:42},end:{line:5790,column:43}},loc:{start:{line:5790,column:65},end:{line:5800,column:13}},line:5790}},branchMap:{"0":{loc:{start:{line:26,column:15},end:{line:26,column:30}},type:"binary-expr",locations:[{start:{line:26,column:15},end:{line:26,column:22}},{start:{line:26,column:26},end:{line:26,column:30}}],line:26},"1":{loc:{start:{line:397,column:12},end:{line:400,column:13}},type:"if",locations:[{start:{line:397,column:12},end:{line:400,column:13}},{start:{line:397,column:12},end:{line:400,column:13}}],line:397},"2":{loc:{start:{line:397,column:16},end:{line:397,column:56}},type:"binary-expr",locations:[{start:{line:397,column:16},end:{line:397,column:25}},{start:{line:397,column:29},end:{line:397,column:56}}],line:397},"3":{loc:{start:{line:420,column:12},end:{line:423,column:13}},type:"if",locations:[{start:{line:420,column:12},end:{line:423,column:13}},{start:{line:420,column:12},end:{line:423,column:13}}],line:420},"4":{loc:{start:{line:420,column:16},end:{line:420,column:56}},type:"binary-expr",locations:[{start:{line:420,column:16},end:{line:420,column:25}},{start:{line:420,column:29},end:{line:420,column:56}}],line:420},"5":{loc:{start:{line:453,column:12},end:{line:456,column:13}},type:"if",locations:[{start:{line:453,column:12},end:{line:456,column:13}},{start:{line:453,column:12},end:{line:456,column:13}}],line:453},"6":{loc:{start:{line:453,column:16},end:{line:453,column:56}},type:"binary-expr",locations:[{start:{line:453,column:16},end:{line:453,column:25}},{start:{line:453,column:29},end:{line:453,column:56}}],line:453},"7":{loc:{start:{line:478,column:23},end:{line:478,column:48}},type:"binary-expr",locations:[{start:{line:478,column:23},end:{line:478,column:31}},{start:{line:478,column:35},end:{line:478,column:48}}],line:478},"8":{loc:{start:{line:482,column:16},end:{line:496,column:17}},type:"if",locations:[{start:{line:482,column:16},end:{line:496,column:17}},{start:{line:482,column:16},end:{line:496,column:17}}],line:482},"9":{loc:{start:{line:489,column:24},end:{line:494,column:25}},type:"if",locations:[{start:{line:489,column:24},end:{line:494,column:25}},{start:{line:489,column:24},end:{line:494,column:25}}],line:489},"10":{loc:{start:{line:517,column:23},end:{line:517,column:48}},type:"binary-expr",locations:[{start:{line:517,column:23},end:{line:517,column:31}},{start:{line:517,column:35},end:{line:517,column:48}}],line:517},"11":{loc:{start:{line:544,column:12},end:{line:547,column:13}},type:"if",locations:[{start:{line:544,column:12},end:{line:547,column:13}},{start:{line:544,column:12},end:{line:547,column:13}}],line:544},"12":{loc:{start:{line:544,column:16},end:{line:544,column:53}},type:"binary-expr",locations:[{start:{line:544,column:16},end:{line:544,column:25}},{start:{line:544,column:29},end:{line:544,column:53}}],line:544},"13":{loc:{start:{line:549,column:23},end:{line:549,column:48}},type:"binary-expr",locations:[{start:{line:549,column:23},end:{line:549,column:31}},{start:{line:549,column:35},end:{line:549,column:48}}],line:549},"14":{loc:{start:{line:550,column:21},end:{line:550,column:33}},type:"binary-expr",locations:[{start:{line:550,column:21},end:{line:550,column:27}},{start:{line:550,column:31},end:{line:550,column:33}}],line:550},"15":{loc:{start:{line:555,column:16},end:{line:560,column:17}},type:"if",locations:[{start:{line:555,column:16},end:{line:560,column:17}},{start:{line:555,column:16},end:{line:560,column:17}}],line:555},"16":{loc:{start:{line:581,column:12},end:{line:584,column:13}},type:"if",locations:[{start:{line:581,column:12},end:{line:584,column:13}},{start:{line:581,column:12},end:{line:584,column:13}}],line:581},"17":{loc:{start:{line:581,column:16},end:{line:581,column:52}},type:"binary-expr",locations:[{start:{line:581,column:16},end:{line:581,column:25}},{start:{line:581,column:29},end:{line:581,column:52}}],line:581},"18":{loc:{start:{line:586,column:23},end:{line:586,column:48}},type:"binary-expr",locations:[{start:{line:586,column:23},end:{line:586,column:31}},{start:{line:586,column:35},end:{line:586,column:48}}],line:586},"19":{loc:{start:{line:588,column:23},end:{line:588,column:34}},type:"binary-expr",locations:[{start:{line:588,column:23},end:{line:588,column:28}},{start:{line:588,column:32},end:{line:588,column:34}}],line:588},"20":{loc:{start:{line:593,column:16},end:{line:599,column:17}},type:"if",locations:[{start:{line:593,column:16},end:{line:599,column:17}},{start:{line:593,column:16},end:{line:599,column:17}}],line:593},"21":{loc:{start:{line:597,column:35},end:{line:597,column:54}},type:"binary-expr",locations:[{start:{line:597,column:35},end:{line:597,column:48}},{start:{line:597,column:52},end:{line:597,column:54}}],line:597},"22":{loc:{start:{line:598,column:35},end:{line:598,column:48}},type:"binary-expr",locations:[{start:{line:598,column:35},end:{line:598,column:42}},{start:{line:598,column:46},end:{line:598,column:48}}],line:598},"23":{loc:{start:{line:625,column:12},end:{line:628,column:13}},type:"if",locations:[{start:{line:625,column:12},end:{line:628,column:13}},{start:{line:625,column:12},end:{line:628,column:13}}],line:625},"24":{loc:{start:{line:625,column:16},end:{line:625,column:53}},type:"binary-expr",locations:[{start:{line:625,column:16},end:{line:625,column:25}},{start:{line:625,column:29},end:{line:625,column:53}}],line:625},"25":{loc:{start:{line:630,column:23},end:{line:630,column:48}},type:"binary-expr",locations:[{start:{line:630,column:23},end:{line:630,column:31}},{start:{line:630,column:35},end:{line:630,column:48}}],line:630},"26":{loc:{start:{line:631,column:21},end:{line:631,column:33}},type:"binary-expr",locations:[{start:{line:631,column:21},end:{line:631,column:27}},{start:{line:631,column:31},end:{line:631,column:33}}],line:631},"27":{loc:{start:{line:634,column:12},end:{line:636,column:13}},type:"if",locations:[{start:{line:634,column:12},end:{line:636,column:13}},{start:{line:634,column:12},end:{line:636,column:13}}],line:634},"28":{loc:{start:{line:653,column:20},end:{line:658,column:21}},type:"if",locations:[{start:{line:653,column:20},end:{line:658,column:21}},{start:{line:653,column:20},end:{line:658,column:21}}],line:653},"29":{loc:{start:{line:686,column:12},end:{line:688,column:13}},type:"if",locations:[{start:{line:686,column:12},end:{line:688,column:13}},{start:{line:686,column:12},end:{line:688,column:13}}],line:686},"30":{loc:{start:{line:690,column:12},end:{line:692,column:13}},type:"if",locations:[{start:{line:690,column:12},end:{line:692,column:13}},{start:{line:690,column:12},end:{line:692,column:13}}],line:690},"31":{loc:{start:{line:726,column:12},end:{line:728,column:13}},type:"if",locations:[{start:{line:726,column:12},end:{line:728,column:13}},{start:{line:726,column:12},end:{line:728,column:13}}],line:726},"32":{loc:{start:{line:742,column:12},end:{line:744,column:13}},type:"if",locations:[{start:{line:742,column:12},end:{line:744,column:13}},{start:{line:742,column:12},end:{line:744,column:13}}],line:742},"33":{loc:{start:{line:773,column:12},end:{line:775,column:13}},type:"if",locations:[{start:{line:773,column:12},end:{line:775,column:13}},{start:{line:773,column:12},end:{line:775,column:13}}],line:773},"34":{loc:{start:{line:805,column:12},end:{line:807,column:13}},type:"if",locations:[{start:{line:805,column:12},end:{line:807,column:13}},{start:{line:805,column:12},end:{line:807,column:13}}],line:805},"35":{loc:{start:{line:878,column:31},end:{line:878,column:47}},type:"binary-expr",locations:[{start:{line:878,column:31},end:{line:878,column:41}},{start:{line:878,column:45},end:{line:878,column:47}}],line:878},"36":{loc:{start:{line:879,column:26},end:{line:879,column:42}},type:"binary-expr",locations:[{start:{line:879,column:26},end:{line:879,column:36}},{start:{line:879,column:40},end:{line:879,column:42}}],line:879},"37":{loc:{start:{line:988,column:25},end:{line:988,column:79}},type:"cond-expr",locations:[{start:{line:988,column:53},end:{line:988,column:66}},{start:{line:988,column:69},end:{line:988,column:79}}],line:988},"38":{loc:{start:{line:992,column:25},end:{line:997,column:13}},type:"binary-expr",locations:[{start:{line:992,column:25},end:{line:992,column:35}},{start:{line:992,column:39},end:{line:997,column:13}}],line:992},"39":{loc:{start:{line:1002,column:31},end:{line:1002,column:57}},type:"binary-expr",locations:[{start:{line:1002,column:31},end:{line:1002,column:49}},{start:{line:1002,column:55},end:{line:1002,column:57}}],line:1002},"40":{loc:{start:{line:1003,column:31},end:{line:1003,column:73}},type:"binary-expr",locations:[{start:{line:1003,column:31},end:{line:1003,column:48}},{start:{line:1003,column:55},end:{line:1003,column:67}},{start:{line:1003,column:71},end:{line:1003,column:73}}],line:1003},"41":{loc:{start:{line:1004,column:31},end:{line:1004,column:57}},type:"binary-expr",locations:[{start:{line:1004,column:31},end:{line:1004,column:45}},{start:{line:1004,column:55},end:{line:1004,column:57}}],line:1004},"42":{loc:{start:{line:1005,column:31},end:{line:1005,column:57}},type:"binary-expr",locations:[{start:{line:1005,column:31},end:{line:1005,column:47}},{start:{line:1005,column:55},end:{line:1005,column:57}}],line:1005},"43":{loc:{start:{line:1006,column:31},end:{line:1006,column:59}},type:"binary-expr",locations:[{start:{line:1006,column:31},end:{line:1006,column:48}},{start:{line:1006,column:55},end:{line:1006,column:59}}],line:1006},"44":{loc:{start:{line:1007,column:31},end:{line:1007,column:59}},type:"binary-expr",locations:[{start:{line:1007,column:31},end:{line:1007,column:49}},{start:{line:1007,column:55},end:{line:1007,column:59}}],line:1007},"45":{loc:{start:{line:1008,column:31},end:{line:1008,column:59}},type:"binary-expr",locations:[{start:{line:1008,column:31},end:{line:1008,column:51}},{start:{line:1008,column:55},end:{line:1008,column:59}}],line:1008},"46":{loc:{start:{line:1096,column:12},end:{line:1099,column:13}},type:"if",locations:[{start:{line:1096,column:12},end:{line:1099,column:13}},{start:{line:1096,column:12},end:{line:1099,column:13}}],line:1096},"47":{loc:{start:{line:1096,column:16},end:{line:1096,column:54}},type:"binary-expr",locations:[{start:{line:1096,column:16},end:{line:1096,column:25}},{start:{line:1096,column:29},end:{line:1096,column:54}}],line:1096},"48":{loc:{start:{line:1100,column:23},end:{line:1100,column:48}},type:"binary-expr",locations:[{start:{line:1100,column:23},end:{line:1100,column:31}},{start:{line:1100,column:35},end:{line:1100,column:48}}],line:1100},"49":{loc:{start:{line:1102,column:22},end:{line:1102,column:35}},type:"binary-expr",locations:[{start:{line:1102,column:22},end:{line:1102,column:29}},{start:{line:1102,column:33},end:{line:1102,column:35}}],line:1102},"50":{loc:{start:{line:1106,column:16},end:{line:1112,column:17}},type:"if",locations:[{start:{line:1106,column:16},end:{line:1112,column:17}},{start:{line:1106,column:16},end:{line:1112,column:17}}],line:1106},"51":{loc:{start:{line:1110,column:31},end:{line:1110,column:73}},type:"cond-expr",locations:[{start:{line:1110,column:47},end:{line:1110,column:66}},{start:{line:1110,column:69},end:{line:1110,column:73}}],line:1110},"52":{loc:{start:{line:1125,column:23},end:{line:1125,column:48}},type:"binary-expr",locations:[{start:{line:1125,column:23},end:{line:1125,column:31}},{start:{line:1125,column:35},end:{line:1125,column:48}}],line:1125},"53":{loc:{start:{line:1143,column:23},end:{line:1143,column:48}},type:"binary-expr",locations:[{start:{line:1143,column:23},end:{line:1143,column:31}},{start:{line:1143,column:35},end:{line:1143,column:48}}],line:1143},"54":{loc:{start:{line:1145,column:12},end:{line:1147,column:13}},type:"if",locations:[{start:{line:1145,column:12},end:{line:1147,column:13}},{start:{line:1145,column:12},end:{line:1147,column:13}}],line:1145},"55":{loc:{start:{line:1151,column:16},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1151,column:16},end:{line:1167,column:17}},{start:{line:1151,column:16},end:{line:1167,column:17}}],line:1151},"56":{loc:{start:{line:1151,column:20},end:{line:1151,column:47}},type:"binary-expr",locations:[{start:{line:1151,column:20},end:{line:1151,column:24}},{start:{line:1151,column:28},end:{line:1151,column:47}}],line:1151},"57":{loc:{start:{line:1155,column:21},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1155,column:21},end:{line:1167,column:17}},{start:{line:1155,column:21},end:{line:1167,column:17}}],line:1155},"58":{loc:{start:{line:1155,column:25},end:{line:1155,column:51}},type:"binary-expr",locations:[{start:{line:1155,column:25},end:{line:1155,column:29}},{start:{line:1155,column:33},end:{line:1155,column:51}}],line:1155},"59":{loc:{start:{line:1157,column:24},end:{line:1162,column:25}},type:"if",locations:[{start:{line:1157,column:24},end:{line:1162,column:25}},{start:{line:1157,column:24},end:{line:1162,column:25}}],line:1157},"60":{loc:{start:{line:1182,column:23},end:{line:1182,column:48}},type:"binary-expr",locations:[{start:{line:1182,column:23},end:{line:1182,column:31}},{start:{line:1182,column:35},end:{line:1182,column:48}}],line:1182},"61":{loc:{start:{line:1186,column:16},end:{line:1191,column:17}},type:"if",locations:[{start:{line:1186,column:16},end:{line:1191,column:17}},{start:{line:1186,column:16},end:{line:1191,column:17}}],line:1186},"62":{loc:{start:{line:1204,column:23},end:{line:1204,column:48}},type:"binary-expr",locations:[{start:{line:1204,column:23},end:{line:1204,column:31}},{start:{line:1204,column:35},end:{line:1204,column:48}}],line:1204},"63":{loc:{start:{line:1208,column:16},end:{line:1213,column:17}},type:"if",locations:[{start:{line:1208,column:16},end:{line:1213,column:17}},{start:{line:1208,column:16},end:{line:1213,column:17}}],line:1208},"64":{loc:{start:{line:1226,column:23},end:{line:1226,column:48}},type:"binary-expr",locations:[{start:{line:1226,column:23},end:{line:1226,column:31}},{start:{line:1226,column:35},end:{line:1226,column:48}}],line:1226},"65":{loc:{start:{line:1230,column:16},end:{line:1235,column:17}},type:"if",locations:[{start:{line:1230,column:16},end:{line:1235,column:17}},{start:{line:1230,column:16},end:{line:1235,column:17}}],line:1230},"66":{loc:{start:{line:1318,column:37},end:{line:1318,column:59}},type:"binary-expr",locations:[{start:{line:1318,column:37},end:{line:1318,column:53}},{start:{line:1318,column:57},end:{line:1318,column:59}}],line:1318},"67":{loc:{start:{line:1325,column:16},end:{line:1330,column:17}},type:"if",locations:[{start:{line:1325,column:16},end:{line:1330,column:17}},{start:{line:1325,column:16},end:{line:1330,column:17}}],line:1325},"68":{loc:{start:{line:1334,column:35},end:{line:1334,column:61}},type:"binary-expr",locations:[{start:{line:1334,column:35},end:{line:1334,column:52}},{start:{line:1334,column:59},end:{line:1334,column:61}}],line:1334},"69":{loc:{start:{line:1335,column:35},end:{line:1335,column:61}},type:"binary-expr",locations:[{start:{line:1335,column:35},end:{line:1335,column:51}},{start:{line:1335,column:59},end:{line:1335,column:61}}],line:1335},"70":{loc:{start:{line:1336,column:35},end:{line:1336,column:63}},type:"binary-expr",locations:[{start:{line:1336,column:35},end:{line:1336,column:53}},{start:{line:1336,column:59},end:{line:1336,column:63}}],line:1336},"71":{loc:{start:{line:1389,column:12},end:{line:1392,column:13}},type:"if",locations:[{start:{line:1389,column:12},end:{line:1392,column:13}},{start:{line:1389,column:12},end:{line:1392,column:13}}],line:1389},"72":{loc:{start:{line:1389,column:16},end:{line:1389,column:54}},type:"binary-expr",locations:[{start:{line:1389,column:16},end:{line:1389,column:25}},{start:{line:1389,column:29},end:{line:1389,column:54}}],line:1389},"73":{loc:{start:{line:1393,column:23},end:{line:1393,column:48}},type:"binary-expr",locations:[{start:{line:1393,column:23},end:{line:1393,column:31}},{start:{line:1393,column:35},end:{line:1393,column:48}}],line:1393},"74":{loc:{start:{line:1395,column:22},end:{line:1395,column:35}},type:"binary-expr",locations:[{start:{line:1395,column:22},end:{line:1395,column:29}},{start:{line:1395,column:33},end:{line:1395,column:35}}],line:1395},"75":{loc:{start:{line:1396,column:12},end:{line:1398,column:13}},type:"if",locations:[{start:{line:1396,column:12},end:{line:1398,column:13}},{start:{line:1396,column:12},end:{line:1398,column:13}}],line:1396},"76":{loc:{start:{line:1402,column:16},end:{line:1408,column:17}},type:"if",locations:[{start:{line:1402,column:16},end:{line:1408,column:17}},{start:{line:1402,column:16},end:{line:1408,column:17}}],line:1402},"77":{loc:{start:{line:1415,column:22},end:{line:1415,column:35}},type:"binary-expr",locations:[{start:{line:1415,column:22},end:{line:1415,column:29}},{start:{line:1415,column:33},end:{line:1415,column:35}}],line:1415},"78":{loc:{start:{line:1416,column:12},end:{line:1418,column:13}},type:"if",locations:[{start:{line:1416,column:12},end:{line:1418,column:13}},{start:{line:1416,column:12},end:{line:1418,column:13}}],line:1416},"79":{loc:{start:{line:1449,column:12},end:{line:1451,column:13}},type:"if",locations:[{start:{line:1449,column:12},end:{line:1451,column:13}},{start:{line:1449,column:12},end:{line:1451,column:13}}],line:1449},"80":{loc:{start:{line:1453,column:12},end:{line:1455,column:13}},type:"if",locations:[{start:{line:1453,column:12},end:{line:1455,column:13}},{start:{line:1453,column:12},end:{line:1455,column:13}}],line:1453},"81":{loc:{start:{line:1457,column:12},end:{line:1459,column:13}},type:"if",locations:[{start:{line:1457,column:12},end:{line:1459,column:13}},{start:{line:1457,column:12},end:{line:1459,column:13}}],line:1457},"82":{loc:{start:{line:1457,column:16},end:{line:1457,column:79}},type:"binary-expr",locations:[{start:{line:1457,column:16},end:{line:1457,column:25}},{start:{line:1457,column:30},end:{line:1457,column:51}},{start:{line:1457,column:55},end:{line:1457,column:78}}],line:1457},"83":{loc:{start:{line:1462,column:12},end:{line:1504,column:13}},type:"if",locations:[{start:{line:1462,column:12},end:{line:1504,column:13}},{start:{line:1462,column:12},end:{line:1504,column:13}}],line:1462},"84":{loc:{start:{line:1465,column:16},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1465,column:16},end:{line:1500,column:17}},{start:{line:1465,column:16},end:{line:1500,column:17}}],line:1465},"85":{loc:{start:{line:1465,column:20},end:{line:1465,column:55}},type:"binary-expr",locations:[{start:{line:1465,column:20},end:{line:1465,column:41}},{start:{line:1465,column:45},end:{line:1465,column:55}}],line:1465},"86":{loc:{start:{line:1472,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1472,column:21},end:{line:1500,column:17}},{start:{line:1472,column:21},end:{line:1500,column:17}}],line:1472},"87":{loc:{start:{line:1472,column:25},end:{line:1472,column:59}},type:"binary-expr",locations:[{start:{line:1472,column:25},end:{line:1472,column:46}},{start:{line:1472,column:50},end:{line:1472,column:59}}],line:1472},"88":{loc:{start:{line:1477,column:20},end:{line:1482,column:21}},type:"if",locations:[{start:{line:1477,column:20},end:{line:1482,column:21}},{start:{line:1477,column:20},end:{line:1482,column:21}}],line:1477},"89":{loc:{start:{line:1484,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1484,column:21},end:{line:1500,column:17}},{start:{line:1484,column:21},end:{line:1500,column:17}}],line:1484},"90":{loc:{start:{line:1484,column:25},end:{line:1484,column:58}},type:"binary-expr",locations:[{start:{line:1484,column:25},end:{line:1484,column:44}},{start:{line:1484,column:48},end:{line:1484,column:58}}],line:1484},"91":{loc:{start:{line:1496,column:24},end:{line:1498,column:25}},type:"if",locations:[{start:{line:1496,column:24},end:{line:1498,column:25}},{start:{line:1496,column:24},end:{line:1498,column:25}}],line:1496},"92":{loc:{start:{line:1525,column:23},end:{line:1525,column:48}},type:"binary-expr",locations:[{start:{line:1525,column:23},end:{line:1525,column:31}},{start:{line:1525,column:35},end:{line:1525,column:48}}],line:1525},"93":{loc:{start:{line:1528,column:16},end:{line:1553,column:17}},type:"if",locations:[{start:{line:1528,column:16},end:{line:1553,column:17}},{start:{line:1528,column:16},end:{line:1553,column:17}}],line:1528},"94":{loc:{start:{line:1533,column:20},end:{line:1535,column:21}},type:"if",locations:[{start:{line:1533,column:20},end:{line:1535,column:21}},{start:{line:1533,column:20},end:{line:1535,column:21}}],line:1533},"95":{loc:{start:{line:1540,column:20},end:{line:1552,column:21}},type:"if",locations:[{start:{line:1540,column:20},end:{line:1552,column:21}},{start:{line:1540,column:20},end:{line:1552,column:21}}],line:1540},"96":{loc:{start:{line:1542,column:28},end:{line:1547,column:29}},type:"if",locations:[{start:{line:1542,column:28},end:{line:1547,column:29}},{start:{line:1542,column:28},end:{line:1547,column:29}}],line:1542},"97":{loc:{start:{line:1575,column:23},end:{line:1575,column:48}},type:"binary-expr",locations:[{start:{line:1575,column:23},end:{line:1575,column:31}},{start:{line:1575,column:35},end:{line:1575,column:48}}],line:1575},"98":{loc:{start:{line:1637,column:19},end:{line:1637,column:77}},type:"binary-expr",locations:[{start:{line:1637,column:19},end:{line:1637,column:72}},{start:{line:1637,column:76},end:{line:1637,column:77}}],line:1637},"99":{loc:{start:{line:1657,column:23},end:{line:1657,column:48}},type:"binary-expr",locations:[{start:{line:1657,column:23},end:{line:1657,column:31}},{start:{line:1657,column:35},end:{line:1657,column:48}}],line:1657},"100":{loc:{start:{line:1689,column:12},end:{line:1692,column:13}},type:"if",locations:[{start:{line:1689,column:12},end:{line:1692,column:13}},{start:{line:1689,column:12},end:{line:1692,column:13}}],line:1689},"101":{loc:{start:{line:1689,column:16},end:{line:1689,column:54}},type:"binary-expr",locations:[{start:{line:1689,column:16},end:{line:1689,column:25}},{start:{line:1689,column:29},end:{line:1689,column:54}}],line:1689},"102":{loc:{start:{line:1694,column:23},end:{line:1694,column:48}},type:"binary-expr",locations:[{start:{line:1694,column:23},end:{line:1694,column:31}},{start:{line:1694,column:35},end:{line:1694,column:48}}],line:1694},"103":{loc:{start:{line:1695,column:22},end:{line:1695,column:35}},type:"binary-expr",locations:[{start:{line:1695,column:22},end:{line:1695,column:29}},{start:{line:1695,column:33},end:{line:1695,column:35}}],line:1695},"104":{loc:{start:{line:1699,column:16},end:{line:1702,column:17}},type:"if",locations:[{start:{line:1699,column:16},end:{line:1702,column:17}},{start:{line:1699,column:16},end:{line:1702,column:17}}],line:1699},"105":{loc:{start:{line:1749,column:12},end:{line:1752,column:13}},type:"if",locations:[{start:{line:1749,column:12},end:{line:1752,column:13}},{start:{line:1749,column:12},end:{line:1752,column:13}}],line:1749},"106":{loc:{start:{line:1749,column:16},end:{line:1749,column:54}},type:"binary-expr",locations:[{start:{line:1749,column:16},end:{line:1749,column:25}},{start:{line:1749,column:29},end:{line:1749,column:54}}],line:1749},"107":{loc:{start:{line:1754,column:23},end:{line:1754,column:48}},type:"binary-expr",locations:[{start:{line:1754,column:23},end:{line:1754,column:31}},{start:{line:1754,column:35},end:{line:1754,column:48}}],line:1754},"108":{loc:{start:{line:1755,column:22},end:{line:1755,column:35}},type:"binary-expr",locations:[{start:{line:1755,column:22},end:{line:1755,column:29}},{start:{line:1755,column:33},end:{line:1755,column:35}}],line:1755},"109":{loc:{start:{line:1759,column:16},end:{line:1762,column:17}},type:"if",locations:[{start:{line:1759,column:16},end:{line:1762,column:17}},{start:{line:1759,column:16},end:{line:1762,column:17}}],line:1759},"110":{loc:{start:{line:1765,column:27},end:{line:1765,column:52}},type:"binary-expr",locations:[{start:{line:1765,column:27},end:{line:1765,column:46}},{start:{line:1765,column:50},end:{line:1765,column:52}}],line:1765},"111":{loc:{start:{line:1795,column:23},end:{line:1795,column:48}},type:"binary-expr",locations:[{start:{line:1795,column:23},end:{line:1795,column:31}},{start:{line:1795,column:35},end:{line:1795,column:48}}],line:1795},"112":{loc:{start:{line:1816,column:21},end:{line:1816,column:33}},type:"binary-expr",locations:[{start:{line:1816,column:21},end:{line:1816,column:27}},{start:{line:1816,column:31},end:{line:1816,column:33}}],line:1816},"113":{loc:{start:{line:1818,column:12},end:{line:1841,column:13}},type:"if",locations:[{start:{line:1818,column:12},end:{line:1841,column:13}},{start:{line:1818,column:12},end:{line:1841,column:13}}],line:1818},"114":{loc:{start:{line:1821,column:20},end:{line:1834,column:21}},type:"if",locations:[{start:{line:1821,column:20},end:{line:1834,column:21}},{start:{line:1821,column:20},end:{line:1834,column:21}}],line:1821},"115":{loc:{start:{line:1827,column:28},end:{line:1832,column:29}},type:"if",locations:[{start:{line:1827,column:28},end:{line:1832,column:29}},{start:{line:1827,column:28},end:{line:1832,column:29}}],line:1827},"116":{loc:{start:{line:2021,column:19},end:{line:2021,column:50}},type:"binary-expr",locations:[{start:{line:2021,column:19},end:{line:2021,column:44}},{start:{line:2021,column:48},end:{line:2021,column:50}}],line:2021},"117":{loc:{start:{line:2031,column:19},end:{line:2031,column:55}},type:"binary-expr",locations:[{start:{line:2031,column:19},end:{line:2031,column:47}},{start:{line:2031,column:51},end:{line:2031,column:55}}],line:2031},"118":{loc:{start:{line:2057,column:19},end:{line:2057,column:69}},type:"binary-expr",locations:[{start:{line:2057,column:19},end:{line:2057,column:61}},{start:{line:2057,column:65},end:{line:2057,column:69}}],line:2057},"119":{loc:{start:{line:2067,column:19},end:{line:2067,column:61}},type:"binary-expr",locations:[{start:{line:2067,column:19},end:{line:2067,column:53}},{start:{line:2067,column:57},end:{line:2067,column:61}}],line:2067},"120":{loc:{start:{line:2078,column:19},end:{line:2078,column:65}},type:"binary-expr",locations:[{start:{line:2078,column:19},end:{line:2078,column:59}},{start:{line:2078,column:63},end:{line:2078,column:65}}],line:2078},"121":{loc:{start:{line:2088,column:19},end:{line:2088,column:48}},type:"binary-expr",locations:[{start:{line:2088,column:19},end:{line:2088,column:40}},{start:{line:2088,column:44},end:{line:2088,column:48}}],line:2088},"122":{loc:{start:{line:2098,column:19},end:{line:2098,column:57}},type:"binary-expr",locations:[{start:{line:2098,column:19},end:{line:2098,column:49}},{start:{line:2098,column:53},end:{line:2098,column:57}}],line:2098},"123":{loc:{start:{line:2110,column:19},end:{line:2110,column:66}},type:"binary-expr",locations:[{start:{line:2110,column:19},end:{line:2110,column:58}},{start:{line:2110,column:62},end:{line:2110,column:66}}],line:2110},"124":{loc:{start:{line:2122,column:19},end:{line:2122,column:73}},type:"binary-expr",locations:[{start:{line:2122,column:19},end:{line:2122,column:67}},{start:{line:2122,column:71},end:{line:2122,column:73}}],line:2122},"125":{loc:{start:{line:2173,column:19},end:{line:2173,column:77}},type:"binary-expr",locations:[{start:{line:2173,column:19},end:{line:2173,column:72}},{start:{line:2173,column:76},end:{line:2173,column:77}}],line:2173},"126":{loc:{start:{line:2194,column:12},end:{line:2197,column:13}},type:"if",locations:[{start:{line:2194,column:12},end:{line:2197,column:13}},{start:{line:2194,column:12},end:{line:2197,column:13}}],line:2194},"127":{loc:{start:{line:2194,column:16},end:{line:2194,column:54}},type:"binary-expr",locations:[{start:{line:2194,column:16},end:{line:2194,column:25}},{start:{line:2194,column:29},end:{line:2194,column:54}}],line:2194},"128":{loc:{start:{line:2199,column:23},end:{line:2199,column:48}},type:"binary-expr",locations:[{start:{line:2199,column:23},end:{line:2199,column:31}},{start:{line:2199,column:35},end:{line:2199,column:48}}],line:2199},"129":{loc:{start:{line:2200,column:22},end:{line:2200,column:35}},type:"binary-expr",locations:[{start:{line:2200,column:22},end:{line:2200,column:29}},{start:{line:2200,column:33},end:{line:2200,column:35}}],line:2200},"130":{loc:{start:{line:2204,column:16},end:{line:2207,column:17}},type:"if",locations:[{start:{line:2204,column:16},end:{line:2207,column:17}},{start:{line:2204,column:16},end:{line:2207,column:17}}],line:2204},"131":{loc:{start:{line:2210,column:27},end:{line:2210,column:52}},type:"binary-expr",locations:[{start:{line:2210,column:27},end:{line:2210,column:46}},{start:{line:2210,column:50},end:{line:2210,column:52}}],line:2210},"132":{loc:{start:{line:2368,column:23},end:{line:2368,column:48}},type:"binary-expr",locations:[{start:{line:2368,column:23},end:{line:2368,column:31}},{start:{line:2368,column:35},end:{line:2368,column:48}}],line:2368},"133":{loc:{start:{line:2372,column:16},end:{line:2377,column:17}},type:"if",locations:[{start:{line:2372,column:16},end:{line:2377,column:17}},{start:{line:2372,column:16},end:{line:2377,column:17}}],line:2372},"134":{loc:{start:{line:2397,column:23},end:{line:2397,column:48}},type:"binary-expr",locations:[{start:{line:2397,column:23},end:{line:2397,column:31}},{start:{line:2397,column:35},end:{line:2397,column:48}}],line:2397},"135":{loc:{start:{line:2401,column:16},end:{line:2406,column:17}},type:"if",locations:[{start:{line:2401,column:16},end:{line:2406,column:17}},{start:{line:2401,column:16},end:{line:2406,column:17}}],line:2401},"136":{loc:{start:{line:2593,column:23},end:{line:2593,column:48}},type:"binary-expr",locations:[{start:{line:2593,column:23},end:{line:2593,column:31}},{start:{line:2593,column:35},end:{line:2593,column:48}}],line:2593},"137":{loc:{start:{line:2597,column:16},end:{line:2613,column:17}},type:"if",locations:[{start:{line:2597,column:16},end:{line:2613,column:17}},{start:{line:2597,column:16},end:{line:2613,column:17}}],line:2597},"138":{loc:{start:{line:2606,column:24},end:{line:2611,column:25}},type:"if",locations:[{start:{line:2606,column:24},end:{line:2611,column:25}},{start:{line:2606,column:24},end:{line:2611,column:25}}],line:2606},"139":{loc:{start:{line:2767,column:12},end:{line:2770,column:13}},type:"if",locations:[{start:{line:2767,column:12},end:{line:2770,column:13}},{start:{line:2767,column:12},end:{line:2770,column:13}}],line:2767},"140":{loc:{start:{line:2767,column:16},end:{line:2767,column:53}},type:"binary-expr",locations:[{start:{line:2767,column:16},end:{line:2767,column:25}},{start:{line:2767,column:29},end:{line:2767,column:53}}],line:2767},"141":{loc:{start:{line:2772,column:23},end:{line:2772,column:48}},type:"binary-expr",locations:[{start:{line:2772,column:23},end:{line:2772,column:31}},{start:{line:2772,column:35},end:{line:2772,column:48}}],line:2772},"142":{loc:{start:{line:2773,column:21},end:{line:2773,column:33}},type:"binary-expr",locations:[{start:{line:2773,column:21},end:{line:2773,column:27}},{start:{line:2773,column:31},end:{line:2773,column:33}}],line:2773},"143":{loc:{start:{line:2785,column:12},end:{line:2790,column:13}},type:"if",locations:[{start:{line:2785,column:12},end:{line:2790,column:13}},{start:{line:2785,column:12},end:{line:2790,column:13}}],line:2785},"144":{loc:{start:{line:2862,column:12},end:{line:2866,column:13}},type:"if",locations:[{start:{line:2862,column:12},end:{line:2866,column:13}},{start:{line:2862,column:12},end:{line:2866,column:13}}],line:2862},"145":{loc:{start:{line:2862,column:16},end:{line:2862,column:77}},type:"binary-expr",locations:[{start:{line:2862,column:16},end:{line:2862,column:36}},{start:{line:2862,column:40},end:{line:2862,column:64}},{start:{line:2862,column:68},end:{line:2862,column:77}}],line:2862},"146":{loc:{start:{line:2868,column:21},end:{line:2868,column:33}},type:"binary-expr",locations:[{start:{line:2868,column:21},end:{line:2868,column:27}},{start:{line:2868,column:31},end:{line:2868,column:33}}],line:2868},"147":{loc:{start:{line:2890,column:23},end:{line:2890,column:67}},type:"cond-expr",locations:[{start:{line:2890,column:49},end:{line:2890,column:55}},{start:{line:2890,column:58},end:{line:2890,column:67}}],line:2890},"148":{loc:{start:{line:3001,column:12},end:{line:3005,column:13}},type:"if",locations:[{start:{line:3001,column:12},end:{line:3005,column:13}},{start:{line:3001,column:12},end:{line:3005,column:13}}],line:3001},"149":{loc:{start:{line:3001,column:16},end:{line:3001,column:83}},type:"binary-expr",locations:[{start:{line:3001,column:16},end:{line:3001,column:42}},{start:{line:3001,column:46},end:{line:3001,column:70}},{start:{line:3001,column:74},end:{line:3001,column:83}}],line:3001},"150":{loc:{start:{line:3007,column:12},end:{line:3010,column:13}},type:"if",locations:[{start:{line:3007,column:12},end:{line:3010,column:13}},{start:{line:3007,column:12},end:{line:3010,column:13}}],line:3007},"151":{loc:{start:{line:3007,column:16},end:{line:3007,column:53}},type:"binary-expr",locations:[{start:{line:3007,column:16},end:{line:3007,column:40}},{start:{line:3007,column:44},end:{line:3007,column:53}}],line:3007},"152":{loc:{start:{line:3012,column:21},end:{line:3012,column:33}},type:"binary-expr",locations:[{start:{line:3012,column:21},end:{line:3012,column:27}},{start:{line:3012,column:31},end:{line:3012,column:33}}],line:3012},"153":{loc:{start:{line:3072,column:12},end:{line:3074,column:13}},type:"if",locations:[{start:{line:3072,column:12},end:{line:3074,column:13}},{start:{line:3072,column:12},end:{line:3074,column:13}}],line:3072},"154":{loc:{start:{line:3072,column:16},end:{line:3072,column:78}},type:"binary-expr",locations:[{start:{line:3072,column:16},end:{line:3072,column:26}},{start:{line:3072,column:30},end:{line:3072,column:53}},{start:{line:3072,column:57},end:{line:3072,column:78}}],line:3072},"155":{loc:{start:{line:3098,column:12},end:{line:3100,column:13}},type:"if",locations:[{start:{line:3098,column:12},end:{line:3100,column:13}},{start:{line:3098,column:12},end:{line:3100,column:13}}],line:3098},"156":{loc:{start:{line:3102,column:23},end:{line:3102,column:48}},type:"binary-expr",locations:[{start:{line:3102,column:23},end:{line:3102,column:31}},{start:{line:3102,column:35},end:{line:3102,column:48}}],line:3102},"157":{loc:{start:{line:3106,column:16},end:{line:3119,column:17}},type:"if",locations:[{start:{line:3106,column:16},end:{line:3119,column:17}},{start:{line:3106,column:16},end:{line:3119,column:17}}],line:3106},"158":{loc:{start:{line:3112,column:24},end:{line:3117,column:25}},type:"if",locations:[{start:{line:3112,column:24},end:{line:3117,column:25}},{start:{line:3112,column:24},end:{line:3117,column:25}}],line:3112},"159":{loc:{start:{line:3136,column:16},end:{line:3138,column:17}},type:"if",locations:[{start:{line:3136,column:16},end:{line:3138,column:17}},{start:{line:3136,column:16},end:{line:3138,column:17}}],line:3136},"160":{loc:{start:{line:3136,column:19},end:{line:3136,column:45}},type:"binary-expr",locations:[{start:{line:3136,column:19},end:{line:3136,column:24}},{start:{line:3136,column:28},end:{line:3136,column:45}}],line:3136},"161":{loc:{start:{line:3159,column:16},end:{line:3164,column:17}},type:"if",locations:[{start:{line:3159,column:16},end:{line:3164,column:17}},{start:{line:3159,column:16},end:{line:3164,column:17}}],line:3159},"162":{loc:{start:{line:3172,column:23},end:{line:3172,column:48}},type:"binary-expr",locations:[{start:{line:3172,column:23},end:{line:3172,column:31}},{start:{line:3172,column:35},end:{line:3172,column:48}}],line:3172},"163":{loc:{start:{line:3180,column:12},end:{line:3189,column:13}},type:"if",locations:[{start:{line:3180,column:12},end:{line:3189,column:13}},{start:{line:3180,column:12},end:{line:3189,column:13}}],line:3180},"164":{loc:{start:{line:3196,column:12},end:{line:3211,column:13}},type:"if",locations:[{start:{line:3196,column:12},end:{line:3211,column:13}},{start:{line:3196,column:12},end:{line:3211,column:13}}],line:3196},"165":{loc:{start:{line:3308,column:23},end:{line:3308,column:48}},type:"binary-expr",locations:[{start:{line:3308,column:23},end:{line:3308,column:31}},{start:{line:3308,column:35},end:{line:3308,column:48}}],line:3308},"166":{loc:{start:{line:3334,column:23},end:{line:3334,column:48}},type:"binary-expr",locations:[{start:{line:3334,column:23},end:{line:3334,column:31}},{start:{line:3334,column:35},end:{line:3334,column:48}}],line:3334},"167":{loc:{start:{line:3361,column:23},end:{line:3361,column:48}},type:"binary-expr",locations:[{start:{line:3361,column:23},end:{line:3361,column:31}},{start:{line:3361,column:35},end:{line:3361,column:48}}],line:3361},"168":{loc:{start:{line:3362,column:21},end:{line:3362,column:33}},type:"binary-expr",locations:[{start:{line:3362,column:21},end:{line:3362,column:27}},{start:{line:3362,column:31},end:{line:3362,column:33}}],line:3362},"169":{loc:{start:{line:3363,column:33},end:{line:3363,column:66}},type:"binary-expr",locations:[{start:{line:3363,column:33},end:{line:3363,column:51}},{start:{line:3363,column:55},end:{line:3363,column:66}}],line:3363},"170":{loc:{start:{line:3367,column:16},end:{line:3372,column:17}},type:"if",locations:[{start:{line:3367,column:16},end:{line:3372,column:17}},{start:{line:3367,column:16},end:{line:3372,column:17}}],line:3367},"171":{loc:{start:{line:3392,column:23},end:{line:3392,column:48}},type:"binary-expr",locations:[{start:{line:3392,column:23},end:{line:3392,column:31}},{start:{line:3392,column:35},end:{line:3392,column:48}}],line:3392},"172":{loc:{start:{line:3433,column:23},end:{line:3433,column:48}},type:"binary-expr",locations:[{start:{line:3433,column:23},end:{line:3433,column:31}},{start:{line:3433,column:35},end:{line:3433,column:48}}],line:3433},"173":{loc:{start:{line:3460,column:23},end:{line:3460,column:48}},type:"binary-expr",locations:[{start:{line:3460,column:23},end:{line:3460,column:31}},{start:{line:3460,column:35},end:{line:3460,column:48}}],line:3460},"174":{loc:{start:{line:3461,column:21},end:{line:3461,column:33}},type:"binary-expr",locations:[{start:{line:3461,column:21},end:{line:3461,column:27}},{start:{line:3461,column:31},end:{line:3461,column:33}}],line:3461},"175":{loc:{start:{line:3462,column:33},end:{line:3462,column:66}},type:"binary-expr",locations:[{start:{line:3462,column:33},end:{line:3462,column:51}},{start:{line:3462,column:55},end:{line:3462,column:66}}],line:3462},"176":{loc:{start:{line:3466,column:16},end:{line:3471,column:17}},type:"if",locations:[{start:{line:3466,column:16},end:{line:3471,column:17}},{start:{line:3466,column:16},end:{line:3471,column:17}}],line:3466},"177":{loc:{start:{line:3497,column:23},end:{line:3497,column:48}},type:"binary-expr",locations:[{start:{line:3497,column:23},end:{line:3497,column:31}},{start:{line:3497,column:35},end:{line:3497,column:48}}],line:3497},"178":{loc:{start:{line:3498,column:21},end:{line:3498,column:33}},type:"binary-expr",locations:[{start:{line:3498,column:21},end:{line:3498,column:27}},{start:{line:3498,column:31},end:{line:3498,column:33}}],line:3498},"179":{loc:{start:{line:3499,column:33},end:{line:3499,column:66}},type:"binary-expr",locations:[{start:{line:3499,column:33},end:{line:3499,column:51}},{start:{line:3499,column:55},end:{line:3499,column:66}}],line:3499},"180":{loc:{start:{line:3503,column:16},end:{line:3508,column:17}},type:"if",locations:[{start:{line:3503,column:16},end:{line:3508,column:17}},{start:{line:3503,column:16},end:{line:3508,column:17}}],line:3503},"181":{loc:{start:{line:3528,column:23},end:{line:3528,column:48}},type:"binary-expr",locations:[{start:{line:3528,column:23},end:{line:3528,column:31}},{start:{line:3528,column:35},end:{line:3528,column:48}}],line:3528},"182":{loc:{start:{line:3532,column:16},end:{line:3537,column:17}},type:"if",locations:[{start:{line:3532,column:16},end:{line:3537,column:17}},{start:{line:3532,column:16},end:{line:3537,column:17}}],line:3532},"183":{loc:{start:{line:3558,column:23},end:{line:3558,column:48}},type:"binary-expr",locations:[{start:{line:3558,column:23},end:{line:3558,column:31}},{start:{line:3558,column:35},end:{line:3558,column:48}}],line:3558},"184":{loc:{start:{line:3586,column:23},end:{line:3586,column:48}},type:"binary-expr",locations:[{start:{line:3586,column:23},end:{line:3586,column:31}},{start:{line:3586,column:35},end:{line:3586,column:48}}],line:3586},"185":{loc:{start:{line:3613,column:23},end:{line:3613,column:48}},type:"binary-expr",locations:[{start:{line:3613,column:23},end:{line:3613,column:31}},{start:{line:3613,column:35},end:{line:3613,column:48}}],line:3613},"186":{loc:{start:{line:3617,column:16},end:{line:3622,column:17}},type:"if",locations:[{start:{line:3617,column:16},end:{line:3622,column:17}},{start:{line:3617,column:16},end:{line:3622,column:17}}],line:3617},"187":{loc:{start:{line:3643,column:23},end:{line:3643,column:48}},type:"binary-expr",locations:[{start:{line:3643,column:23},end:{line:3643,column:31}},{start:{line:3643,column:35},end:{line:3643,column:48}}],line:3643},"188":{loc:{start:{line:3647,column:16},end:{line:3652,column:17}},type:"if",locations:[{start:{line:3647,column:16},end:{line:3652,column:17}},{start:{line:3647,column:16},end:{line:3652,column:17}}],line:3647},"189":{loc:{start:{line:3673,column:23},end:{line:3673,column:48}},type:"binary-expr",locations:[{start:{line:3673,column:23},end:{line:3673,column:31}},{start:{line:3673,column:35},end:{line:3673,column:48}}],line:3673},"190":{loc:{start:{line:3700,column:25},end:{line:3700,column:46}},type:"binary-expr",locations:[{start:{line:3700,column:25},end:{line:3700,column:39}},{start:{line:3700,column:43},end:{line:3700,column:46}}],line:3700},"191":{loc:{start:{line:3702,column:12},end:{line:3706,column:13}},type:"if",locations:[{start:{line:3702,column:12},end:{line:3706,column:13}},{start:{line:3702,column:12},end:{line:3706,column:13}}],line:3702},"192":{loc:{start:{line:3709,column:16},end:{line:3712,column:32}},type:"binary-expr",locations:[{start:{line:3709,column:16},end:{line:3709,column:35}},{start:{line:3710,column:16},end:{line:3710,column:31}},{start:{line:3711,column:16},end:{line:3711,column:33}},{start:{line:3712,column:16},end:{line:3712,column:32}}],line:3709},"193":{loc:{start:{line:3715,column:30},end:{line:3715,column:62}},type:"binary-expr",locations:[{start:{line:3715,column:30},end:{line:3715,column:45}},{start:{line:3715,column:49},end:{line:3715,column:62}}],line:3715},"194":{loc:{start:{line:3716,column:33},end:{line:3716,column:68}},type:"binary-expr",locations:[{start:{line:3716,column:33},end:{line:3716,column:51}},{start:{line:3716,column:55},end:{line:3716,column:68}}],line:3716},"195":{loc:{start:{line:3717,column:29},end:{line:3717,column:60}},type:"binary-expr",locations:[{start:{line:3717,column:29},end:{line:3717,column:43}},{start:{line:3717,column:47},end:{line:3717,column:60}}],line:3717},"196":{loc:{start:{line:3718,column:31},end:{line:3718,column:64}},type:"binary-expr",locations:[{start:{line:3718,column:31},end:{line:3718,column:47}},{start:{line:3718,column:51},end:{line:3718,column:64}}],line:3718},"197":{loc:{start:{line:3719,column:30},end:{line:3719,column:62}},type:"binary-expr",locations:[{start:{line:3719,column:30},end:{line:3719,column:45}},{start:{line:3719,column:49},end:{line:3719,column:62}}],line:3719},"198":{loc:{start:{line:3722,column:34},end:{line:3722,column:70}},type:"binary-expr",locations:[{start:{line:3722,column:34},end:{line:3722,column:53}},{start:{line:3722,column:57},end:{line:3722,column:70}}],line:3722},"199":{loc:{start:{line:3723,column:43},end:{line:3723,column:88}},type:"binary-expr",locations:[{start:{line:3723,column:43},end:{line:3723,column:71}},{start:{line:3723,column:75},end:{line:3723,column:88}}],line:3723},"200":{loc:{start:{line:3732,column:24},end:{line:3735,column:25}},type:"if",locations:[{start:{line:3732,column:24},end:{line:3735,column:25}},{start:{line:3732,column:24},end:{line:3735,column:25}}],line:3732},"201":{loc:{start:{line:3738,column:39},end:{line:3738,column:96}},type:"binary-expr",locations:[{start:{line:3738,column:39},end:{line:3738,column:65}},{start:{line:3738,column:69},end:{line:3738,column:96}}],line:3738},"202":{loc:{start:{line:3739,column:24},end:{line:3776,column:25}},type:"if",locations:[{start:{line:3739,column:24},end:{line:3776,column:25}},{start:{line:3739,column:24},end:{line:3776,column:25}}],line:3739},"203":{loc:{start:{line:3743,column:28},end:{line:3756,column:29}},type:"if",locations:[{start:{line:3743,column:28},end:{line:3756,column:29}},{start:{line:3743,column:28},end:{line:3756,column:29}}],line:3743},"204":{loc:{start:{line:3749,column:32},end:{line:3755,column:33}},type:"if",locations:[{start:{line:3749,column:32},end:{line:3755,column:33}},{start:{line:3749,column:32},end:{line:3755,column:33}}],line:3749},"205":{loc:{start:{line:3762,column:28},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3762,column:28},end:{line:3775,column:29}},{start:{line:3762,column:28},end:{line:3775,column:29}}],line:3762},"206":{loc:{start:{line:3762,column:32},end:{line:3762,column:72}},type:"binary-expr",locations:[{start:{line:3762,column:32},end:{line:3762,column:56}},{start:{line:3762,column:60},end:{line:3762,column:72}}],line:3762},"207":{loc:{start:{line:3769,column:33},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3769,column:33},end:{line:3775,column:29}},{start:{line:3769,column:33},end:{line:3775,column:29}}],line:3769},"208":{loc:{start:{line:3769,column:37},end:{line:3769,column:81}},type:"binary-expr",locations:[{start:{line:3769,column:37},end:{line:3769,column:63}},{start:{line:3769,column:67},end:{line:3769,column:81}}],line:3769},"209":{loc:{start:{line:3782,column:20},end:{line:3784,column:21}},type:"if",locations:[{start:{line:3782,column:20},end:{line:3784,column:21}},{start:{line:3782,column:20},end:{line:3784,column:21}}],line:3782},"210":{loc:{start:{line:3805,column:23},end:{line:3805,column:48}},type:"binary-expr",locations:[{start:{line:3805,column:23},end:{line:3805,column:31}},{start:{line:3805,column:35},end:{line:3805,column:48}}],line:3805},"211":{loc:{start:{line:3889,column:12},end:{line:3893,column:13}},type:"if",locations:[{start:{line:3889,column:12},end:{line:3893,column:13}},{start:{line:3889,column:12},end:{line:3893,column:13}}],line:3889},"212":{loc:{start:{line:3889,column:16},end:{line:3889,column:78}},type:"binary-expr",locations:[{start:{line:3889,column:16},end:{line:3889,column:37}},{start:{line:3889,column:41},end:{line:3889,column:65}},{start:{line:3889,column:69},end:{line:3889,column:78}}],line:3889},"213":{loc:{start:{line:3895,column:23},end:{line:3895,column:48}},type:"binary-expr",locations:[{start:{line:3895,column:23},end:{line:3895,column:31}},{start:{line:3895,column:35},end:{line:3895,column:48}}],line:3895},"214":{loc:{start:{line:3896,column:21},end:{line:3896,column:33}},type:"binary-expr",locations:[{start:{line:3896,column:21},end:{line:3896,column:27}},{start:{line:3896,column:31},end:{line:3896,column:33}}],line:3896},"215":{loc:{start:{line:3899,column:12},end:{line:3901,column:13}},type:"if",locations:[{start:{line:3899,column:12},end:{line:3901,column:13}},{start:{line:3899,column:12},end:{line:3901,column:13}}],line:3899},"216":{loc:{start:{line:3899,column:17},end:{line:3899,column:39}},type:"binary-expr",locations:[{start:{line:3899,column:17},end:{line:3899,column:33}},{start:{line:3899,column:37},end:{line:3899,column:39}}],line:3899},"217":{loc:{start:{line:3903,column:12},end:{line:3906,column:13}},type:"if",locations:[{start:{line:3903,column:12},end:{line:3906,column:13}},{start:{line:3903,column:12},end:{line:3906,column:13}}],line:3903},"218":{loc:{start:{line:3909,column:16},end:{line:3915,column:17}},type:"if",locations:[{start:{line:3909,column:16},end:{line:3915,column:17}},{start:{line:3909,column:16},end:{line:3915,column:17}}],line:3909},"219":{loc:{start:{line:3972,column:12},end:{line:3976,column:13}},type:"if",locations:[{start:{line:3972,column:12},end:{line:3976,column:13}},{start:{line:3972,column:12},end:{line:3976,column:13}}],line:3972},"220":{loc:{start:{line:3972,column:16},end:{line:3972,column:78}},type:"binary-expr",locations:[{start:{line:3972,column:16},end:{line:3972,column:37}},{start:{line:3972,column:41},end:{line:3972,column:65}},{start:{line:3972,column:69},end:{line:3972,column:78}}],line:3972},"221":{loc:{start:{line:3978,column:23},end:{line:3978,column:48}},type:"binary-expr",locations:[{start:{line:3978,column:23},end:{line:3978,column:31}},{start:{line:3978,column:35},end:{line:3978,column:48}}],line:3978},"222":{loc:{start:{line:3979,column:21},end:{line:3979,column:33}},type:"binary-expr",locations:[{start:{line:3979,column:21},end:{line:3979,column:27}},{start:{line:3979,column:31},end:{line:3979,column:33}}],line:3979},"223":{loc:{start:{line:3983,column:12},end:{line:3985,column:13}},type:"if",locations:[{start:{line:3983,column:12},end:{line:3985,column:13}},{start:{line:3983,column:12},end:{line:3985,column:13}}],line:3983},"224":{loc:{start:{line:3987,column:29},end:{line:3987,column:62}},type:"binary-expr",locations:[{start:{line:3987,column:29},end:{line:3987,column:47}},{start:{line:3987,column:51},end:{line:3987,column:62}}],line:3987},"225":{loc:{start:{line:4004,column:20},end:{line:4009,column:21}},type:"if",locations:[{start:{line:4004,column:20},end:{line:4009,column:21}},{start:{line:4004,column:20},end:{line:4009,column:21}}],line:4004},"226":{loc:{start:{line:4072,column:20},end:{line:4072,column:31}},type:"binary-expr",locations:[{start:{line:4072,column:20},end:{line:4072,column:25}},{start:{line:4072,column:29},end:{line:4072,column:31}}],line:4072},"227":{loc:{start:{line:4073,column:26},end:{line:4073,column:43}},type:"binary-expr",locations:[{start:{line:4073,column:26},end:{line:4073,column:37}},{start:{line:4073,column:41},end:{line:4073,column:43}}],line:4073},"228":{loc:{start:{line:4082,column:34},end:{line:4082,column:55}},type:"binary-expr",locations:[{start:{line:4082,column:34},end:{line:4082,column:47}},{start:{line:4082,column:51},end:{line:4082,column:55}}],line:4082},"229":{loc:{start:{line:4192,column:20},end:{line:4192,column:31}},type:"binary-expr",locations:[{start:{line:4192,column:20},end:{line:4192,column:25}},{start:{line:4192,column:29},end:{line:4192,column:31}}],line:4192},"230":{loc:{start:{line:4193,column:26},end:{line:4193,column:43}},type:"binary-expr",locations:[{start:{line:4193,column:26},end:{line:4193,column:37}},{start:{line:4193,column:41},end:{line:4193,column:43}}],line:4193},"231":{loc:{start:{line:4258,column:20},end:{line:4258,column:31}},type:"binary-expr",locations:[{start:{line:4258,column:20},end:{line:4258,column:25}},{start:{line:4258,column:29},end:{line:4258,column:31}}],line:4258},"232":{loc:{start:{line:4259,column:26},end:{line:4259,column:43}},type:"binary-expr",locations:[{start:{line:4259,column:26},end:{line:4259,column:37}},{start:{line:4259,column:41},end:{line:4259,column:43}}],line:4259},"233":{loc:{start:{line:4263,column:34},end:{line:4263,column:55}},type:"binary-expr",locations:[{start:{line:4263,column:34},end:{line:4263,column:47}},{start:{line:4263,column:51},end:{line:4263,column:55}}],line:4263},"234":{loc:{start:{line:4273,column:12},end:{line:4275,column:13}},type:"if",locations:[{start:{line:4273,column:12},end:{line:4275,column:13}},{start:{line:4273,column:12},end:{line:4275,column:13}}],line:4273},"235":{loc:{start:{line:4273,column:16},end:{line:4273,column:59}},type:"binary-expr",locations:[{start:{line:4273,column:16},end:{line:4273,column:36}},{start:{line:4273,column:40},end:{line:4273,column:59}}],line:4273},"236":{loc:{start:{line:4276,column:12},end:{line:4278,column:13}},type:"if",locations:[{start:{line:4276,column:12},end:{line:4278,column:13}},{start:{line:4276,column:12},end:{line:4278,column:13}}],line:4276},"237":{loc:{start:{line:4276,column:16},end:{line:4276,column:60}},type:"binary-expr",locations:[{start:{line:4276,column:16},end:{line:4276,column:37}},{start:{line:4276,column:41},end:{line:4276,column:60}}],line:4276},"238":{loc:{start:{line:4279,column:12},end:{line:4282,column:13}},type:"if",locations:[{start:{line:4279,column:12},end:{line:4282,column:13}},{start:{line:4279,column:12},end:{line:4282,column:13}}],line:4279},"239":{loc:{start:{line:4388,column:32},end:{line:4388,column:59}},type:"binary-expr",locations:[{start:{line:4388,column:32},end:{line:4388,column:51}},{start:{line:4388,column:55},end:{line:4388,column:59}}],line:4388},"240":{loc:{start:{line:4402,column:12},end:{line:4405,column:13}},type:"if",locations:[{start:{line:4402,column:12},end:{line:4405,column:13}},{start:{line:4402,column:12},end:{line:4405,column:13}}],line:4402},"241":{loc:{start:{line:4406,column:12},end:{line:4408,column:13}},type:"if",locations:[{start:{line:4406,column:12},end:{line:4408,column:13}},{start:{line:4406,column:12},end:{line:4408,column:13}}],line:4406},"242":{loc:{start:{line:4406,column:16},end:{line:4406,column:55}},type:"binary-expr",locations:[{start:{line:4406,column:16},end:{line:4406,column:21}},{start:{line:4406,column:25},end:{line:4406,column:55}}],line:4406},"243":{loc:{start:{line:4411,column:32},end:{line:4411,column:69}},type:"binary-expr",locations:[{start:{line:4411,column:32},end:{line:4411,column:49}},{start:{line:4411,column:53},end:{line:4411,column:69}}],line:4411},"244":{loc:{start:{line:4550,column:41},end:{line:4551,column:53}},type:"cond-expr",locations:[{start:{line:4551,column:16},end:{line:4551,column:46}},{start:{line:4551,column:49},end:{line:4551,column:53}}],line:4550},"245":{loc:{start:{line:4570,column:12},end:{line:4572,column:13}},type:"if",locations:[{start:{line:4570,column:12},end:{line:4572,column:13}},{start:{line:4570,column:12},end:{line:4572,column:13}}],line:4570},"246":{loc:{start:{line:4570,column:16},end:{line:4570,column:49}},type:"binary-expr",locations:[{start:{line:4570,column:16},end:{line:4570,column:19}},{start:{line:4570,column:23},end:{line:4570,column:49}}],line:4570},"247":{loc:{start:{line:4574,column:12},end:{line:4576,column:13}},type:"if",locations:[{start:{line:4574,column:12},end:{line:4576,column:13}},{start:{line:4574,column:12},end:{line:4576,column:13}}],line:4574},"248":{loc:{start:{line:4595,column:12},end:{line:4597,column:13}},type:"if",locations:[{start:{line:4595,column:12},end:{line:4597,column:13}},{start:{line:4595,column:12},end:{line:4597,column:13}}],line:4595},"249":{loc:{start:{line:4598,column:12},end:{line:4604,column:13}},type:"if",locations:[{start:{line:4598,column:12},end:{line:4604,column:13}},{start:{line:4598,column:12},end:{line:4604,column:13}}],line:4598},"250":{loc:{start:{line:4605,column:12},end:{line:4610,column:13}},type:"if",locations:[{start:{line:4605,column:12},end:{line:4610,column:13}},{start:{line:4605,column:12},end:{line:4610,column:13}}],line:4605},"251":{loc:{start:{line:4618,column:12},end:{line:4623,column:13}},type:"if",locations:[{start:{line:4618,column:12},end:{line:4623,column:13}},{start:{line:4618,column:12},end:{line:4623,column:13}}],line:4618},"252":{loc:{start:{line:4643,column:12},end:{line:4645,column:13}},type:"if",locations:[{start:{line:4643,column:12},end:{line:4645,column:13}},{start:{line:4643,column:12},end:{line:4645,column:13}}],line:4643},"253":{loc:{start:{line:4649,column:12},end:{line:4651,column:13}},type:"if",locations:[{start:{line:4649,column:12},end:{line:4651,column:13}},{start:{line:4649,column:12},end:{line:4651,column:13}}],line:4649},"254":{loc:{start:{line:4653,column:12},end:{line:4656,column:13}},type:"if",locations:[{start:{line:4653,column:12},end:{line:4656,column:13}},{start:{line:4653,column:12},end:{line:4656,column:13}}],line:4653},"255":{loc:{start:{line:4653,column:16},end:{line:4653,column:86}},type:"binary-expr",locations:[{start:{line:4653,column:16},end:{line:4653,column:35}},{start:{line:4653,column:39},end:{line:4653,column:86}}],line:4653},"256":{loc:{start:{line:4658,column:12},end:{line:4661,column:13}},type:"if",locations:[{start:{line:4658,column:12},end:{line:4661,column:13}},{start:{line:4658,column:12},end:{line:4661,column:13}}],line:4658},"257":{loc:{start:{line:4658,column:16},end:{line:4658,column:104}},type:"binary-expr",locations:[{start:{line:4658,column:16},end:{line:4658,column:35}},{start:{line:4658,column:39},end:{line:4658,column:104}}],line:4658},"258":{loc:{start:{line:4663,column:12},end:{line:4665,column:13}},type:"if",locations:[{start:{line:4663,column:12},end:{line:4665,column:13}},{start:{line:4663,column:12},end:{line:4665,column:13}}],line:4663},"259":{loc:{start:{line:4663,column:16},end:{line:4663,column:85}},type:"binary-expr",locations:[{start:{line:4663,column:16},end:{line:4663,column:40}},{start:{line:4663,column:44},end:{line:4663,column:85}}],line:4663},"260":{loc:{start:{line:4678,column:31},end:{line:4678,column:83}},type:"cond-expr",locations:[{start:{line:4678,column:63},end:{line:4678,column:71}},{start:{line:4678,column:74},end:{line:4678,column:83}}],line:4678},"261":{loc:{start:{line:4694,column:12},end:{line:4696,column:13}},type:"if",locations:[{start:{line:4694,column:12},end:{line:4696,column:13}},{start:{line:4694,column:12},end:{line:4696,column:13}}],line:4694},"262":{loc:{start:{line:4698,column:12},end:{line:4700,column:13}},type:"if",locations:[{start:{line:4698,column:12},end:{line:4700,column:13}},{start:{line:4698,column:12},end:{line:4700,column:13}}],line:4698},"263":{loc:{start:{line:4709,column:12},end:{line:4711,column:13}},type:"if",locations:[{start:{line:4709,column:12},end:{line:4711,column:13}},{start:{line:4709,column:12},end:{line:4711,column:13}}],line:4709},"264":{loc:{start:{line:4738,column:12},end:{line:4740,column:13}},type:"if",locations:[{start:{line:4738,column:12},end:{line:4740,column:13}},{start:{line:4738,column:12},end:{line:4740,column:13}}],line:4738},"265":{loc:{start:{line:4742,column:12},end:{line:4744,column:13}},type:"if",locations:[{start:{line:4742,column:12},end:{line:4744,column:13}},{start:{line:4742,column:12},end:{line:4744,column:13}}],line:4742},"266":{loc:{start:{line:4746,column:12},end:{line:4748,column:13}},type:"if",locations:[{start:{line:4746,column:12},end:{line:4748,column:13}},{start:{line:4746,column:12},end:{line:4748,column:13}}],line:4746},"267":{loc:{start:{line:4746,column:16},end:{line:4746,column:73}},type:"binary-expr",locations:[{start:{line:4746,column:16},end:{line:4746,column:48}},{start:{line:4746,column:52},end:{line:4746,column:73}}],line:4746},"268":{loc:{start:{line:4749,column:12},end:{line:4751,column:13}},type:"if",locations:[{start:{line:4749,column:12},end:{line:4751,column:13}},{start:{line:4749,column:12},end:{line:4751,column:13}}],line:4749},"269":{loc:{start:{line:4749,column:16},end:{line:4749,column:69}},type:"binary-expr",locations:[{start:{line:4749,column:16},end:{line:4749,column:46}},{start:{line:4749,column:50},end:{line:4749,column:69}}],line:4749},"270":{loc:{start:{line:4752,column:12},end:{line:4754,column:13}},type:"if",locations:[{start:{line:4752,column:12},end:{line:4754,column:13}},{start:{line:4752,column:12},end:{line:4754,column:13}}],line:4752},"271":{loc:{start:{line:4752,column:16},end:{line:4752,column:71}},type:"binary-expr",locations:[{start:{line:4752,column:16},end:{line:4752,column:47}},{start:{line:4752,column:51},end:{line:4752,column:71}}],line:4752},"272":{loc:{start:{line:4755,column:12},end:{line:4757,column:13}},type:"if",locations:[{start:{line:4755,column:12},end:{line:4757,column:13}},{start:{line:4755,column:12},end:{line:4757,column:13}}],line:4755},"273":{loc:{start:{line:4755,column:16},end:{line:4755,column:73}},type:"binary-expr",locations:[{start:{line:4755,column:16},end:{line:4755,column:48}},{start:{line:4755,column:52},end:{line:4755,column:73}}],line:4755},"274":{loc:{start:{line:4783,column:12},end:{line:4785,column:13}},type:"if",locations:[{start:{line:4783,column:12},end:{line:4785,column:13}},{start:{line:4783,column:12},end:{line:4785,column:13}}],line:4783},"275":{loc:{start:{line:4787,column:12},end:{line:4789,column:13}},type:"if",locations:[{start:{line:4787,column:12},end:{line:4789,column:13}},{start:{line:4787,column:12},end:{line:4789,column:13}}],line:4787},"276":{loc:{start:{line:4814,column:12},end:{line:4816,column:13}},type:"if",locations:[{start:{line:4814,column:12},end:{line:4816,column:13}},{start:{line:4814,column:12},end:{line:4816,column:13}}],line:4814},"277":{loc:{start:{line:4818,column:12},end:{line:4820,column:13}},type:"if",locations:[{start:{line:4818,column:12},end:{line:4820,column:13}},{start:{line:4818,column:12},end:{line:4820,column:13}}],line:4818},"278":{loc:{start:{line:4821,column:12},end:{line:4823,column:13}},type:"if",locations:[{start:{line:4821,column:12},end:{line:4823,column:13}},{start:{line:4821,column:12},end:{line:4823,column:13}}],line:4821},"279":{loc:{start:{line:4846,column:12},end:{line:4848,column:13}},type:"if",locations:[{start:{line:4846,column:12},end:{line:4848,column:13}},{start:{line:4846,column:12},end:{line:4848,column:13}}],line:4846},"280":{loc:{start:{line:4850,column:12},end:{line:4852,column:13}},type:"if",locations:[{start:{line:4850,column:12},end:{line:4852,column:13}},{start:{line:4850,column:12},end:{line:4852,column:13}}],line:4850},"281":{loc:{start:{line:4860,column:12},end:{line:4862,column:13}},type:"if",locations:[{start:{line:4860,column:12},end:{line:4862,column:13}},{start:{line:4860,column:12},end:{line:4862,column:13}}],line:4860},"282":{loc:{start:{line:4883,column:12},end:{line:4885,column:13}},type:"if",locations:[{start:{line:4883,column:12},end:{line:4885,column:13}},{start:{line:4883,column:12},end:{line:4885,column:13}}],line:4883},"283":{loc:{start:{line:4887,column:12},end:{line:4889,column:13}},type:"if",locations:[{start:{line:4887,column:12},end:{line:4889,column:13}},{start:{line:4887,column:12},end:{line:4889,column:13}}],line:4887},"284":{loc:{start:{line:4894,column:12},end:{line:4896,column:13}},type:"if",locations:[{start:{line:4894,column:12},end:{line:4896,column:13}},{start:{line:4894,column:12},end:{line:4896,column:13}}],line:4894},"285":{loc:{start:{line:4894,column:16},end:{line:4894,column:73}},type:"binary-expr",locations:[{start:{line:4894,column:16},end:{line:4894,column:48}},{start:{line:4894,column:52},end:{line:4894,column:73}}],line:4894},"286":{loc:{start:{line:4897,column:12},end:{line:4899,column:13}},type:"if",locations:[{start:{line:4897,column:12},end:{line:4899,column:13}},{start:{line:4897,column:12},end:{line:4899,column:13}}],line:4897},"287":{loc:{start:{line:4897,column:16},end:{line:4897,column:69}},type:"binary-expr",locations:[{start:{line:4897,column:16},end:{line:4897,column:46}},{start:{line:4897,column:50},end:{line:4897,column:69}}],line:4897},"288":{loc:{start:{line:4900,column:12},end:{line:4902,column:13}},type:"if",locations:[{start:{line:4900,column:12},end:{line:4902,column:13}},{start:{line:4900,column:12},end:{line:4902,column:13}}],line:4900},"289":{loc:{start:{line:4900,column:16},end:{line:4900,column:71}},type:"binary-expr",locations:[{start:{line:4900,column:16},end:{line:4900,column:47}},{start:{line:4900,column:51},end:{line:4900,column:71}}],line:4900},"290":{loc:{start:{line:4903,column:12},end:{line:4905,column:13}},type:"if",locations:[{start:{line:4903,column:12},end:{line:4905,column:13}},{start:{line:4903,column:12},end:{line:4905,column:13}}],line:4903},"291":{loc:{start:{line:4903,column:16},end:{line:4903,column:73}},type:"binary-expr",locations:[{start:{line:4903,column:16},end:{line:4903,column:48}},{start:{line:4903,column:52},end:{line:4903,column:73}}],line:4903},"292":{loc:{start:{line:4929,column:12},end:{line:4931,column:13}},type:"if",locations:[{start:{line:4929,column:12},end:{line:4931,column:13}},{start:{line:4929,column:12},end:{line:4931,column:13}}],line:4929},"293":{loc:{start:{line:4933,column:12},end:{line:4935,column:13}},type:"if",locations:[{start:{line:4933,column:12},end:{line:4935,column:13}},{start:{line:4933,column:12},end:{line:4935,column:13}}],line:4933},"294":{loc:{start:{line:4958,column:12},end:{line:4960,column:13}},type:"if",locations:[{start:{line:4958,column:12},end:{line:4960,column:13}},{start:{line:4958,column:12},end:{line:4960,column:13}}],line:4958},"295":{loc:{start:{line:4962,column:12},end:{line:4964,column:13}},type:"if",locations:[{start:{line:4962,column:12},end:{line:4964,column:13}},{start:{line:4962,column:12},end:{line:4964,column:13}}],line:4962},"296":{loc:{start:{line:4965,column:12},end:{line:4967,column:13}},type:"if",locations:[{start:{line:4965,column:12},end:{line:4967,column:13}},{start:{line:4965,column:12},end:{line:4967,column:13}}],line:4965},"297":{loc:{start:{line:4990,column:12},end:{line:4992,column:13}},type:"if",locations:[{start:{line:4990,column:12},end:{line:4992,column:13}},{start:{line:4990,column:12},end:{line:4992,column:13}}],line:4990},"298":{loc:{start:{line:4995,column:12},end:{line:5047,column:13}},type:"if",locations:[{start:{line:4995,column:12},end:{line:5047,column:13}},{start:{line:4995,column:12},end:{line:5047,column:13}}],line:4995},"299":{loc:{start:{line:4995,column:16},end:{line:5002,column:41}},type:"binary-expr",locations:[{start:{line:4995,column:16},end:{line:4995,column:58}},{start:{line:4996,column:16},end:{line:5002,column:41}}],line:4995},"300":{loc:{start:{line:5008,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5008,column:17},end:{line:5047,column:13}},{start:{line:5008,column:17},end:{line:5047,column:13}}],line:5008},"301":{loc:{start:{line:5008,column:21},end:{line:5018,column:37}},type:"binary-expr",locations:[{start:{line:5008,column:21},end:{line:5008,column:40}},{start:{line:5009,column:16},end:{line:5018,column:37}}],line:5008},"302":{loc:{start:{line:5025,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5025,column:17},end:{line:5047,column:13}},{start:{line:5025,column:17},end:{line:5047,column:13}}],line:5025},"303":{loc:{start:{line:5025,column:21},end:{line:5032,column:37}},type:"binary-expr",locations:[{start:{line:5025,column:21},end:{line:5025,column:43}},{start:{line:5026,column:16},end:{line:5032,column:37}}],line:5025},"304":{loc:{start:{line:5039,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5039,column:17},end:{line:5047,column:13}},{start:{line:5039,column:17},end:{line:5047,column:13}}],line:5039},"305":{loc:{start:{line:5039,column:21},end:{line:5040,column:41}},type:"binary-expr",locations:[{start:{line:5039,column:21},end:{line:5039,column:74}},{start:{line:5040,column:16},end:{line:5040,column:41}}],line:5039},"306":{loc:{start:{line:5045,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5045,column:17},end:{line:5047,column:13}},{start:{line:5045,column:17},end:{line:5047,column:13}}],line:5045},"307":{loc:{start:{line:5108,column:12},end:{line:5110,column:13}},type:"if",locations:[{start:{line:5108,column:12},end:{line:5110,column:13}},{start:{line:5108,column:12},end:{line:5110,column:13}}],line:5108},"308":{loc:{start:{line:5113,column:16},end:{line:5116,column:17}},type:"if",locations:[{start:{line:5113,column:16},end:{line:5116,column:17}},{start:{line:5113,column:16},end:{line:5116,column:17}}],line:5113},"309":{loc:{start:{line:5118,column:16},end:{line:5123,column:17}},type:"if",locations:[{start:{line:5118,column:16},end:{line:5123,column:17}},{start:{line:5118,column:16},end:{line:5123,column:17}}],line:5118},"310":{loc:{start:{line:5118,column:20},end:{line:5118,column:65}},type:"binary-expr",locations:[{start:{line:5118,column:20},end:{line:5118,column:39}},{start:{line:5118,column:43},end:{line:5118,column:65}}],line:5118},"311":{loc:{start:{line:5154,column:12},end:{line:5157,column:13}},type:"if",locations:[{start:{line:5154,column:12},end:{line:5157,column:13}},{start:{line:5154,column:12},end:{line:5157,column:13}}],line:5154},"312":{loc:{start:{line:5158,column:19},end:{line:5158,column:29}},type:"binary-expr",locations:[{start:{line:5158,column:19},end:{line:5158,column:23}},{start:{line:5158,column:27},end:{line:5158,column:29}}],line:5158},"313":{loc:{start:{line:5161,column:16},end:{line:5166,column:17}},type:"if",locations:[{start:{line:5161,column:16},end:{line:5166,column:17}},{start:{line:5161,column:16},end:{line:5166,column:17}}],line:5161},"314":{loc:{start:{line:5225,column:20},end:{line:5225,column:31}},type:"binary-expr",locations:[{start:{line:5225,column:20},end:{line:5225,column:25}},{start:{line:5225,column:29},end:{line:5225,column:31}}],line:5225},"315":{loc:{start:{line:5226,column:26},end:{line:5226,column:43}},type:"binary-expr",locations:[{start:{line:5226,column:26},end:{line:5226,column:37}},{start:{line:5226,column:41},end:{line:5226,column:43}}],line:5226},"316":{loc:{start:{line:5235,column:12},end:{line:5237,column:13}},type:"if",locations:[{start:{line:5235,column:12},end:{line:5237,column:13}},{start:{line:5235,column:12},end:{line:5237,column:13}}],line:5235},"317":{loc:{start:{line:5238,column:12},end:{line:5240,column:13}},type:"if",locations:[{start:{line:5238,column:12},end:{line:5240,column:13}},{start:{line:5238,column:12},end:{line:5240,column:13}}],line:5238},"318":{loc:{start:{line:5241,column:12},end:{line:5243,column:13}},type:"if",locations:[{start:{line:5241,column:12},end:{line:5243,column:13}},{start:{line:5241,column:12},end:{line:5243,column:13}}],line:5241},"319":{loc:{start:{line:5244,column:12},end:{line:5246,column:13}},type:"if",locations:[{start:{line:5244,column:12},end:{line:5246,column:13}},{start:{line:5244,column:12},end:{line:5246,column:13}}],line:5244},"320":{loc:{start:{line:5249,column:12},end:{line:5251,column:13}},type:"if",locations:[{start:{line:5249,column:12},end:{line:5251,column:13}},{start:{line:5249,column:12},end:{line:5251,column:13}}],line:5249},"321":{loc:{start:{line:5317,column:19},end:{line:5317,column:77}},type:"binary-expr",locations:[{start:{line:5317,column:19},end:{line:5317,column:48}},{start:{line:5317,column:52},end:{line:5317,column:69}},{start:{line:5317,column:73},end:{line:5317,column:77}}],line:5317},"322":{loc:{start:{line:5335,column:16},end:{line:5337,column:17}},type:"if",locations:[{start:{line:5335,column:16},end:{line:5337,column:17}},{start:{line:5335,column:16},end:{line:5337,column:17}}],line:5335},"323":{loc:{start:{line:5342,column:16},end:{line:5344,column:17}},type:"if",locations:[{start:{line:5342,column:16},end:{line:5344,column:17}},{start:{line:5342,column:16},end:{line:5344,column:17}}],line:5342},"324":{loc:{start:{line:5454,column:12},end:{line:5457,column:13}},type:"if",locations:[{start:{line:5454,column:12},end:{line:5457,column:13}},{start:{line:5454,column:12},end:{line:5457,column:13}}],line:5454},"325":{loc:{start:{line:5454,column:16},end:{line:5454,column:59}},type:"binary-expr",locations:[{start:{line:5454,column:16},end:{line:5454,column:25}},{start:{line:5454,column:29},end:{line:5454,column:59}}],line:5454},"326":{loc:{start:{line:5460,column:23},end:{line:5460,column:72}},type:"cond-expr",locations:[{start:{line:5460,column:38},end:{line:5460,column:67}},{start:{line:5460,column:70},end:{line:5460,column:72}}],line:5460},"327":{loc:{start:{line:5487,column:26},end:{line:5487,column:68}},type:"cond-expr",locations:[{start:{line:5487,column:43},end:{line:5487,column:60}},{start:{line:5487,column:65},end:{line:5487,column:67}}],line:5487},"328":{loc:{start:{line:5556,column:12},end:{line:5559,column:13}},type:"if",locations:[{start:{line:5556,column:12},end:{line:5559,column:13}},{start:{line:5556,column:12},end:{line:5559,column:13}}],line:5556},"329":{loc:{start:{line:5564,column:32},end:{line:5564,column:76}},type:"binary-expr",locations:[{start:{line:5564,column:32},end:{line:5564,column:70}},{start:{line:5564,column:74},end:{line:5564,column:76}}],line:5564},"330":{loc:{start:{line:5565,column:12},end:{line:5568,column:13}},type:"if",locations:[{start:{line:5565,column:12},end:{line:5568,column:13}},{start:{line:5565,column:12},end:{line:5568,column:13}}],line:5565},"331":{loc:{start:{line:5572,column:12},end:{line:5574,column:13}},type:"if",locations:[{start:{line:5572,column:12},end:{line:5574,column:13}},{start:{line:5572,column:12},end:{line:5574,column:13}}],line:5572},"332":{loc:{start:{line:5572,column:16},end:{line:5572,column:84}},type:"binary-expr",locations:[{start:{line:5572,column:16},end:{line:5572,column:48}},{start:{line:5572,column:52},end:{line:5572,column:84}}],line:5572},"333":{loc:{start:{line:5614,column:16},end:{line:5616,column:17}},type:"if",locations:[{start:{line:5614,column:16},end:{line:5616,column:17}},{start:{line:5614,column:16},end:{line:5616,column:17}}],line:5614},"334":{loc:{start:{line:5645,column:12},end:{line:5648,column:13}},type:"if",locations:[{start:{line:5645,column:12},end:{line:5648,column:13}},{start:{line:5645,column:12},end:{line:5648,column:13}}],line:5645},"335":{loc:{start:{line:5649,column:23},end:{line:5649,column:48}},type:"binary-expr",locations:[{start:{line:5649,column:23},end:{line:5649,column:31}},{start:{line:5649,column:35},end:{line:5649,column:48}}],line:5649},"336":{loc:{start:{line:5651,column:12},end:{line:5654,column:13}},type:"if",locations:[{start:{line:5651,column:12},end:{line:5654,column:13}},{start:{line:5651,column:12},end:{line:5654,column:13}}],line:5651},"337":{loc:{start:{line:5655,column:12},end:{line:5658,column:13}},type:"if",locations:[{start:{line:5655,column:12},end:{line:5658,column:13}},{start:{line:5655,column:12},end:{line:5658,column:13}}],line:5655},"338":{loc:{start:{line:5662,column:29},end:{line:5662,column:107}},type:"binary-expr",locations:[{start:{line:5662,column:29},end:{line:5662,column:48}},{start:{line:5662,column:52},end:{line:5662,column:78}},{start:{line:5662,column:82},end:{line:5662,column:107}}],line:5662},"339":{loc:{start:{line:5663,column:35},end:{line:5663,column:123}},type:"binary-expr",locations:[{start:{line:5663,column:35},end:{line:5663,column:54}},{start:{line:5663,column:58},end:{line:5663,column:89}},{start:{line:5663,column:93},end:{line:5663,column:123}}],line:5663},"340":{loc:{start:{line:5664,column:35},end:{line:5664,column:123}},type:"binary-expr",locations:[{start:{line:5664,column:35},end:{line:5664,column:54}},{start:{line:5664,column:58},end:{line:5664,column:89}},{start:{line:5664,column:93},end:{line:5664,column:123}}],line:5664},"341":{loc:{start:{line:5670,column:16},end:{line:5676,column:17}},type:"if",locations:[{start:{line:5670,column:16},end:{line:5676,column:17}},{start:{line:5670,column:16},end:{line:5676,column:17}}],line:5670},"342":{loc:{start:{line:5713,column:24},end:{line:5713,column:39}},type:"binary-expr",locations:[{start:{line:5713,column:24},end:{line:5713,column:33}},{start:{line:5713,column:37},end:{line:5713,column:39}}],line:5713},"343":{loc:{start:{line:5733,column:12},end:{line:5736,column:13}},type:"if",locations:[{start:{line:5733,column:12},end:{line:5736,column:13}},{start:{line:5733,column:12},end:{line:5736,column:13}}],line:5733},"344":{loc:{start:{line:5733,column:16},end:{line:5733,column:53}},type:"binary-expr",locations:[{start:{line:5733,column:16},end:{line:5733,column:40}},{start:{line:5733,column:44},end:{line:5733,column:53}}],line:5733},"345":{loc:{start:{line:5738,column:21},end:{line:5738,column:33}},type:"binary-expr",locations:[{start:{line:5738,column:21},end:{line:5738,column:27}},{start:{line:5738,column:31},end:{line:5738,column:33}}],line:5738},"346":{loc:{start:{line:5739,column:23},end:{line:5739,column:47}},type:"binary-expr",locations:[{start:{line:5739,column:23},end:{line:5739,column:31}},{start:{line:5739,column:35},end:{line:5739,column:47}}],line:5739},"347":{loc:{start:{line:5744,column:16},end:{line:5750,column:17}},type:"if",locations:[{start:{line:5744,column:16},end:{line:5750,column:17}},{start:{line:5744,column:16},end:{line:5750,column:17}}],line:5744},"348":{loc:{start:{line:5774,column:21},end:{line:5774,column:33}},type:"binary-expr",locations:[{start:{line:5774,column:21},end:{line:5774,column:27}},{start:{line:5774,column:31},end:{line:5774,column:33}}],line:5774},"349":{loc:{start:{line:5777,column:29},end:{line:5777,column:49}},type:"binary-expr",locations:[{start:{line:5777,column:29},end:{line:5777,column:44}},{start:{line:5777,column:48},end:{line:5777,column:49}}],line:5777},"350":{loc:{start:{line:5783,column:23},end:{line:5783,column:48}},type:"binary-expr",locations:[{start:{line:5783,column:23},end:{line:5783,column:31}},{start:{line:5783,column:35},end:{line:5783,column:48}}],line:5783},"351":{loc:{start:{line:5791,column:16},end:{line:5799,column:17}},type:"if",locations:[{start:{line:5791,column:16},end:{line:5799,column:17}},{start:{line:5791,column:16},end:{line:5799,column:17}}],line:5791},"352":{loc:{start:{line:5795,column:38},end:{line:5795,column:76}},type:"cond-expr",locations:[{start:{line:5795,column:53},end:{line:5795,column:72}},{start:{line:5795,column:75},end:{line:5795,column:76}}],line:5795}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0,"1197":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0},b:{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,0],"53":[0,0],"54":[0,0],"55":[0,0],"56":[0,0],"57":[0,0],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,0],"63":[0,0],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0,0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0,0],"83":[0,0],"84":[0,0],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0,0],"89":[0,0],"90":[0,0],"91":[0,0],"92":[0,0],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0,0],"97":[0,0],"98":[0,0],"99":[0,0],"100":[0,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[0,0],"105":[0,0],"106":[0,0],"107":[0,0],"108":[0,0],"109":[0,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[0,0],"114":[0,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[0,0],"119":[0,0],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[0,0],"127":[0,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[0,0],"134":[0,0],"135":[0,0],"136":[0,0],"137":[0,0],"138":[0,0],"139":[0,0],"140":[0,0],"141":[0,0],"142":[0,0],"143":[0,0],"144":[0,0],"145":[0,0,0],"146":[0,0],"147":[0,0],"148":[0,0],"149":[0,0,0],"150":[0,0],"151":[0,0],"152":[0,0],"153":[0,0],"154":[0,0,0],"155":[0,0],"156":[0,0],"157":[0,0],"158":[0,0],"159":[0,0],"160":[0,0],"161":[0,0],"162":[0,0],"163":[0,0],"164":[0,0],"165":[0,0],"166":[0,0],"167":[0,0],"168":[0,0],"169":[0,0],"170":[0,0],"171":[0,0],"172":[0,0],"173":[0,0],"174":[0,0],"175":[0,0],"176":[0,0],"177":[0,0],"178":[0,0],"179":[0,0],"180":[0,0],"181":[0,0],"182":[0,0],"183":[0,0],"184":[0,0],"185":[0,0],"186":[0,0],"187":[0,0],"188":[0,0],"189":[0,0],"190":[0,0],"191":[0,0],"192":[0,0,0,0],"193":[0,0],"194":[0,0],"195":[0,0],"196":[0,0],"197":[0,0],"198":[0,0],"199":[0,0],"200":[0,0],"201":[0,0],"202":[0,0],"203":[0,0],"204":[0,0],"205":[0,0],"206":[0,0],"207":[0,0],"208":[0,0],"209":[0,0],"210":[0,0],"211":[0,0],"212":[0,0,0],"213":[0,0],"214":[0,0],"215":[0,0],"216":[0,0],"217":[0,0],"218":[0,0],"219":[0,0],"220":[0,0,0],"221":[0,0],"222":[0,0],"223":[0,0],"224":[0,0],"225":[0,0],"226":[0,0],"227":[0,0],"228":[0,0],"229":[0,0],"230":[0,0],"231":[0,0],"232":[0,0],"233":[0,0],"234":[0,0],"235":[0,0],"236":[0,0],"237":[0,0],"238":[0,0],"239":[0,0],"240":[0,0],"241":[0,0],"242":[0,0],"243":[0,0],"244":[0,0],"245":[0,0],"246":[0,0],"247":[0,0],"248":[0,0],"249":[0,0],"250":[0,0],"251":[0,0],"252":[0,0],"253":[0,0],"254":[0,0],"255":[0,0],"256":[0,0],"257":[0,0],"258":[0,0],"259":[0,0],"260":[0,0],"261":[0,0],"262":[0,0],"263":[0,0],"264":[0,0],"265":[0,0],"266":[0,0],"267":[0,0],"268":[0,0],"269":[0,0],"270":[0,0],"271":[0,0],"272":[0,0],"273":[0,0],"274":[0,0],"275":[0,0],"276":[0,0],"277":[0,0],"278":[0,0],"279":[0,0],"280":[0,0],"281":[0,0],"282":[0,0],"283":[0,0],"284":[0,0],"285":[0,0],"286":[0,0],"287":[0,0],"288":[0,0],"289":[0,0],"290":[0,0],"291":[0,0],"292":[0,0],"293":[0,0],"294":[0,0],"295":[0,0],"296":[0,0],"297":[0,0],"298":[0,0],"299":[0,0],"300":[0,0],"301":[0,0],"302":[0,0],"303":[0,0],"304":[0,0],"305":[0,0],"306":[0,0],"307":[0,0],"308":[0,0],"309":[0,0],"310":[0,0],"311":[0,0],"312":[0,0],"313":[0,0],"314":[0,0],"315":[0,0],"316":[0,0],"317":[0,0],"318":[0,0],"319":[0,0],"320":[0,0],"321":[0,0,0],"322":[0,0],"323":[0,0],"324":[0,0],"325":[0,0],"326":[0,0],"327":[0,0],"328":[0,0],"329":[0,0],"330":[0,0],"331":[0,0],"332":[0,0],"333":[0,0],"334":[0,0],"335":[0,0],"336":[0,0],"337":[0,0],"338":[0,0,0],"339":[0,0,0],"340":[0,0,0],"341":[0,0],"342":[0,0],"343":[0,0],"344":[0,0],"345":[0,0],"346":[0,0],"347":[0,0],"348":[0,0],"349":[0,0],"350":[0,0],"351":[0,0],"352":[0,0]},_coverageSchema:"1a1c01bbd47fc00a2c39e90264f33305004495a9",hash:"1e13507780108878ff5a225bb0ab3d0d383df74e"};var coverage=global[gcv]||(global[gcv]={});if(!coverage[path]||coverage[path].hash!==hash){coverage[path]=coverageData;}var actualCoverage=coverage[path];{// @ts-ignore +cov_1ks4ntaci2=function(){return actualCoverage;};}return actualCoverage;}cov_1ks4ntaci2();cov_1ks4ntaci2().s[0]++;/*!*/ // Copyright 2014 Splunk, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +(function(){"use strict";cov_1ks4ntaci2().f[0]++;var Context=(cov_1ks4ntaci2().s[1]++,require('./context'));var Http=(cov_1ks4ntaci2().s[2]++,require('./http'));var Async=(cov_1ks4ntaci2().s[3]++,require('./async'));var Paths=(cov_1ks4ntaci2().s[4]++,require('./paths').Paths);var Class=(cov_1ks4ntaci2().s[5]++,require('./jquery.class').Class);var utils=(cov_1ks4ntaci2().s[6]++,require('./utils'));var root=(cov_1ks4ntaci2().s[7]++,(cov_1ks4ntaci2().b[0][0]++,exports)||(cov_1ks4ntaci2().b[0][1]++,this));var Service=(cov_1ks4ntaci2().s[8]++,null);/** + * Contains functionality common to Splunk Enterprise and Splunk Storm. + * + * This class is an implementation detail and is therefore SDK-private. + * + * @class splunkjs.private.BaseService + * @extends splunkjs.Context + */var BaseService=(cov_1ks4ntaci2().s[9]++,Context.extend({init:function(){cov_1ks4ntaci2().f[1]++;cov_1ks4ntaci2().s[10]++;this._super.apply(this,arguments);}}));/** + * Provides a root access point to Splunk functionality with typed access to + * Splunk resources such as searches, indexes, inputs, and more. Provides + * methods to authenticate and create specialized instances of the service. + * + * @class splunkjs.Service + * @extends splunkjs.private.BaseService + */cov_1ks4ntaci2().s[11]++;module.exports=root=Service=BaseService.extend({/** + * Constructor for `splunkjs.Service`. + * + * @constructor + * @param {splunkjs.Http} http An instance of a `splunkjs.Http` class. + * @param {Object} params A dictionary of optional parameters: + * - `scheme` (_string_): The scheme ("http" or "https") for accessing Splunk. + * - `host` (_string_): The host name (the default is "localhost"). + * - `port` (_integer_): The port number (the default is 8089). + * - `username` (_string_): The Splunk account username, which is used to authenticate the Splunk instance. + * - `password` (_string_): The password, which is used to authenticate the Splunk instance. + * - `owner` (_string_): The owner (username) component of the namespace. + * - `app` (_string_): The app component of the namespace. + * - `sessionKey` (_string_): The current session token. + * - `autologin` (_boolean_): `true` to automatically try to log in again if the session terminates, `false` if not (`true` by default). + * - `version` (_string_): The version string for Splunk, for example "4.3.2" (the default is "5.0"). + * @return {splunkjs.Service} A new `splunkjs.Service` instance. + * + * @method splunkjs.Service + */init:function(){cov_1ks4ntaci2().f[2]++;cov_1ks4ntaci2().s[12]++;this._super.apply(this,arguments);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[13]++;this.specialize=utils.bind(this,this.specialize);cov_1ks4ntaci2().s[14]++;this.apps=utils.bind(this,this.apps);cov_1ks4ntaci2().s[15]++;this.configurations=utils.bind(this,this.configurations);cov_1ks4ntaci2().s[16]++;this.indexes=utils.bind(this,this.indexes);cov_1ks4ntaci2().s[17]++;this.savedSearches=utils.bind(this,this.savedSearches);cov_1ks4ntaci2().s[18]++;this.jobs=utils.bind(this,this.jobs);cov_1ks4ntaci2().s[19]++;this.users=utils.bind(this,this.users);cov_1ks4ntaci2().s[20]++;this.currentUser=utils.bind(this,this.currentUser);cov_1ks4ntaci2().s[21]++;this.views=utils.bind(this,this.views);cov_1ks4ntaci2().s[22]++;this.firedAlertGroups=utils.bind(this,this.firedAlertGroups);cov_1ks4ntaci2().s[23]++;this.dataModels=utils.bind(this,this.dataModels);},/** + * Creates a specialized version of the current `Service` instance for + * a specific namespace context. + * + * @example + * + * var svc = ...; + * var newService = svc.specialize("myuser", "unix"); + * + * @param {String} owner The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * @param {String} app The app context for this resource (such as "search"). The "-" wildcard means all apps. + * @return {splunkjs.Service} The specialized `Service` instance. + * + * @method splunkjs.Service + */specialize:function(owner,app){cov_1ks4ntaci2().f[3]++;cov_1ks4ntaci2().s[24]++;return new Service(this.http,{scheme:this.scheme,host:this.host,port:this.port,username:this.username,password:this.password,owner:owner,app:app,sessionKey:this.sessionKey,version:this.version});},/** + * Gets the `Applications` collection, which allows you to + * list installed apps and retrieve information about them. + * + * @example + * + * // List installed apps + * var apps = svc.apps(); + * apps.fetch(function(err) { console.log(apps.list()); }); + * + * @return {splunkjs.Service.Collection} The `Applications` collection. + * + * @endpoint apps/local + * @method splunkjs.Service + * @see splunkjs.Service.Applications + */apps:function(){cov_1ks4ntaci2().f[4]++;cov_1ks4ntaci2().s[25]++;return new root.Applications(this);},/** + * Gets the `Configurations` collection, which lets you + * create, list, and retrieve configuration (.conf) files. + * + * @example + * + * // List all properties in the 'props.conf' file + * var files = svc.configurations(); + * files.item("props", function(err, propsFile) { + * propsFile.fetch(function(err, props) { + * console.log(props.properties()); + * }); + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Configurations} The `Configurations` collection. + * + * @endpoint configs + * @method splunkjs.Service + * @see splunkjs.Service.Configurations + */configurations:function(namespace){cov_1ks4ntaci2().f[5]++;cov_1ks4ntaci2().s[26]++;return new root.Configurations(this,namespace);},/** + * Gets the `Indexes` collection, which lets you create, + * list, and update indexes. + * + * @example + * + * // Check if we have an _internal index + * var indexes = svc.indexes(); + * indexes.fetch(function(err, indexes) { + * var index = indexes.item("_internal"); + * console.log("Was index found: " + !!index); + * // `index` is an Index object. + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Indexes} The `Indexes` collection. + * + * @endpoint data/indexes + * @method splunkjs.Service + * @see splunkjs.Service.Indexes + */indexes:function(namespace){cov_1ks4ntaci2().f[6]++;cov_1ks4ntaci2().s[27]++;return new root.Indexes(this,namespace);},/** + * Gets the `SavedSearches` collection, which lets you + * create, list, and update saved searches. + * + * @example + * + * // List all # of saved searches + * var savedSearches = svc.savedSearches(); + * savedSearches.fetch(function(err, savedSearches) { + * console.log("# Of Saved Searches: " + savedSearches.list().length); + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.SavedSearches} The `SavedSearches` collection. + * + * @endpoint saved/searches + * @method splunkjs.Service + * @see splunkjs.Service.SavedSearches + */savedSearches:function(namespace){cov_1ks4ntaci2().f[7]++;cov_1ks4ntaci2().s[28]++;return new root.SavedSearches(this,namespace);},/** + * Gets the `StoragePasswords` collection, which lets you + * create, list, and update storage passwords. + * + * @example + * + * // List all # of storage passwords + * var storagePasswords = svc.storagePasswords(); + * storagePasswords.fetch(function(err, storagePasswords) { + * console.log("# of Storage Passwords: " + storagePasswords.list().length); + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.StoragePasswords} The `StoragePasswords` collection. + * + * @endpoint storage/passwords + * @method splunkjs.Service + * @see splunkjs.Service.StoragePasswords + */storagePasswords:function(namespace){cov_1ks4ntaci2().f[8]++;cov_1ks4ntaci2().s[29]++;return new root.StoragePasswords(this,namespace);},/** + * Gets the `FiredAlertGroupCollection` collection, which lets you + * list alert groups. + * + * @example + * + * // List all # of fired alert groups + * var firedAlertGroups = svc.firedAlertGroups(); + * firedAlertGroups.fetch(function(err, firedAlertGroups) { + * console.log("# of alert groups: " + firedAlertGroups.list().length); + * }); + * + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.FiredAlertGroupCollection} The `FiredAlertGroupCollection` collection. + * + * @endpoint saved/searches + * @method splunkjs.Service + * @see splunkjs.Service.FiredAlertGroupCollection + */firedAlertGroups:function(namespace){cov_1ks4ntaci2().f[9]++;cov_1ks4ntaci2().s[30]++;return new root.FiredAlertGroupCollection(this,namespace);},/** + * Gets the `Jobs` collection, which lets you create, list, + * and retrieve search jobs. + * + * @example + * + * // List all job IDs + * var jobs = svc.jobs(); + * jobs.fetch(function(err, jobs) { + * var list = jobs.list(); + * for(var i = 0; i < list.length; i++) { + * console.log("Job " + (i+1) + ": " + list[i].sid); + * } + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Jobs} The `Jobs` collection. + * + * @endpoint search/jobs + * @method splunkjs.Service + * @see splunkjs.Service.Jobs + */jobs:function(namespace){cov_1ks4ntaci2().f[10]++;cov_1ks4ntaci2().s[31]++;return new root.Jobs(this,namespace);},/** + * Gets the `DataModels` collection, which lets you create, list, + * and retrieve data models. + * + * @endpoint datamodel/model + * @method splunkjs.Service + * @see splunkjs.Service.DataModels + */dataModels:function(namespace){cov_1ks4ntaci2().f[11]++;cov_1ks4ntaci2().s[32]++;return new root.DataModels(this,namespace);},/** + * Gets the `Users` collection, which lets you create, + * list, and retrieve users. + * + * @example + * + * // List all usernames + * var users = svc.users(); + * users.fetch(function(err, users) { + * var list = users.list(); + * for(var i = 0; i < list.length; i++) { + * console.log("User " + (i+1) + ": " + list[i].properties().name); + * } + * }); + * + * @return {splunkjs.Service.Users} The `Users` collection. + * + * @endpoint authorization/users + * @method splunkjs.Service + * @see splunkjs.Service.Users + */users:function(){cov_1ks4ntaci2().f[12]++;cov_1ks4ntaci2().s[33]++;return new root.Users(this);},/** + * Gets the `Views` collection, which lets you create, + * list, and retrieve views (custom UIs built in Splunk's app framework). + * + * @example + * + * // List all views + * var views = svc.views(); + * views.fetch(function(err, views) { + * var list = views.list(); + * for(var i = 0; i < list.length; i++) { + * console.log("View " + (i+1) + ": " + list[i].properties().name); + * } + * }); + * + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Views} The `Views` collection. + * + * @endpoint data/ui/views + * @method splunkjs.Service + * @see splunkjs.Service.Views + */views:function(namespace){cov_1ks4ntaci2().f[13]++;cov_1ks4ntaci2().s[34]++;return new root.Views(this,namespace);},/** + * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: + * + * - Use `exec_mode=normal` to return a search job ID immediately (default). + * Poll for completion to find out when you can retrieve search results. + * + * - Use `exec_mode=blocking` to return the search job ID when the search has finished. + * + * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.oneshotSearch`. + * + * @example + * + * service.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { + * console.log("CREATED": newJob.sid); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Function} callback A function to call with the created job: `(err, createdJob)`. + * + * @endpoint search/jobs + * @method splunkjs.Service + */search:function(query,params,namespace,callback){cov_1ks4ntaci2().f[14]++;cov_1ks4ntaci2().s[35]++;if((cov_1ks4ntaci2().b[2][0]++,!callback)&&(cov_1ks4ntaci2().b[2][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[1][0]++;cov_1ks4ntaci2().s[36]++;callback=namespace;cov_1ks4ntaci2().s[37]++;namespace=null;}else{cov_1ks4ntaci2().b[1][1]++;}var jobs=(cov_1ks4ntaci2().s[38]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[39]++;return jobs.search(query,params,callback);},/** + * A convenience method to get a `Job` by its sid. + * + * @param {String} sid The search ID for a search job. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Function} callback A function to call with the created job: `(err, job)`. + * + * @endpoint search/jobs + * @method splunkjs.Service + */getJob:function(sid,namespace,callback){cov_1ks4ntaci2().f[15]++;cov_1ks4ntaci2().s[40]++;if((cov_1ks4ntaci2().b[4][0]++,!callback)&&(cov_1ks4ntaci2().b[4][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[3][0]++;cov_1ks4ntaci2().s[41]++;callback=namespace;cov_1ks4ntaci2().s[42]++;namespace=null;}else{cov_1ks4ntaci2().b[3][1]++;}var job=(cov_1ks4ntaci2().s[43]++,new root.Job(this,sid,namespace));cov_1ks4ntaci2().s[44]++;return job.fetch({},callback);},/** + * Creates a oneshot search from a given search query and optional parameters. + * + * @example + * + * service.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { + * console.log("RESULT FIELDS": results.fields); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search: + * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). + * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `rf` (_string_): Specifies one or more fields to add to the search. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Function} callback A function to call with the results of the search: `(err, results)`. + * + * @endpoint search/jobs + * @method splunkjs.Service + */oneshotSearch:function(query,params,namespace,callback){cov_1ks4ntaci2().f[16]++;cov_1ks4ntaci2().s[45]++;if((cov_1ks4ntaci2().b[6][0]++,!callback)&&(cov_1ks4ntaci2().b[6][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[5][0]++;cov_1ks4ntaci2().s[46]++;callback=namespace;cov_1ks4ntaci2().s[47]++;namespace=null;}else{cov_1ks4ntaci2().b[5][1]++;}var jobs=(cov_1ks4ntaci2().s[48]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[49]++;return jobs.oneshotSearch(query,params,callback);},/** + * Gets the user that is currently logged in. + * + * @example + * + * service.currentUser(function(err, user) { + * console.log("Real name: ", user.properties().realname); + * }); + * + * @param {Function} callback A function to call with the user instance: `(err, user)`. + * @return {splunkjs.Service.currentUser} The `User`. + * + * @endpoint authorization/current-context + * @method splunkjs.Service + */currentUser:function(callback){cov_1ks4ntaci2().f[17]++;cov_1ks4ntaci2().s[50]++;callback=(cov_1ks4ntaci2().b[7][0]++,callback)||(cov_1ks4ntaci2().b[7][1]++,function(){cov_1ks4ntaci2().f[18]++;});var that=(cov_1ks4ntaci2().s[51]++,this);var req=(cov_1ks4ntaci2().s[52]++,this.get(Paths.currentUser,{},function(err,response){cov_1ks4ntaci2().f[19]++;cov_1ks4ntaci2().s[53]++;if(err){cov_1ks4ntaci2().b[8][0]++;cov_1ks4ntaci2().s[54]++;callback(err);}else{cov_1ks4ntaci2().b[8][1]++;var username=(cov_1ks4ntaci2().s[55]++,response.data.entry[0].content.username);var user=(cov_1ks4ntaci2().s[56]++,new root.User(that,username));cov_1ks4ntaci2().s[57]++;user.fetch(function(){cov_1ks4ntaci2().f[20]++;cov_1ks4ntaci2().s[58]++;if(req.wasAborted){cov_1ks4ntaci2().b[9][0]++;cov_1ks4ntaci2().s[59]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[9][1]++;cov_1ks4ntaci2().s[60]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[61]++;return req;},/** + * Gets configuration information about the server. + * + * @example + * + * service.serverInfo(function(err, info) { + * console.log("Splunk Version: ", info.properties().version); + * }); + * + * @param {Function} callback A function to call with the server info: `(err, info)`. + * + * @endpoint server/info + * @method splunkjs.Service + */serverInfo:function(callback){cov_1ks4ntaci2().f[21]++;cov_1ks4ntaci2().s[62]++;callback=(cov_1ks4ntaci2().b[10][0]++,callback)||(cov_1ks4ntaci2().b[10][1]++,function(){cov_1ks4ntaci2().f[22]++;});var serverInfo=(cov_1ks4ntaci2().s[63]++,new root.ServerInfo(this));cov_1ks4ntaci2().s[64]++;return serverInfo.fetch(callback);},/** + * Parses a search query. + * + * @example + * + * service.parse("search index=_internal | head 1", function(err, parse) { + * console.log("Commands: ", parse.commands); + * }); + * + * @param {String} query The search query to parse. + * @param {Object} params An object of options for the parser: + * - `enable_lookups` (_boolean_): If `true`, performs reverse lookups to expand the search expression. + * - `output_mode` (_string_): The output format (XML or JSON). + * - `parse_only` (_boolean_): If `true`, disables the expansion of search due to evaluation of subsearches, time term expansion, lookups, tags, eventtypes, and sourcetype alias. + * - `reload_macros` (_boolean_): If `true`, reloads macro definitions from macros.conf. + * @param {Function} callback A function to call with the parse info: `(err, parse)`. + * + * @endpoint search/parser + * @method splunkjs.Service + */parse:function(query,params,callback){cov_1ks4ntaci2().f[23]++;cov_1ks4ntaci2().s[65]++;if((cov_1ks4ntaci2().b[12][0]++,!callback)&&(cov_1ks4ntaci2().b[12][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[11][0]++;cov_1ks4ntaci2().s[66]++;callback=params;cov_1ks4ntaci2().s[67]++;params={};}else{cov_1ks4ntaci2().b[11][1]++;}cov_1ks4ntaci2().s[68]++;callback=(cov_1ks4ntaci2().b[13][0]++,callback)||(cov_1ks4ntaci2().b[13][1]++,function(){cov_1ks4ntaci2().f[24]++;});cov_1ks4ntaci2().s[69]++;params=(cov_1ks4ntaci2().b[14][0]++,params)||(cov_1ks4ntaci2().b[14][1]++,{});cov_1ks4ntaci2().s[70]++;params.q=query;cov_1ks4ntaci2().s[71]++;return this.get(Paths.parser,params,function(err,response){cov_1ks4ntaci2().f[25]++;cov_1ks4ntaci2().s[72]++;if(err){cov_1ks4ntaci2().b[15][0]++;cov_1ks4ntaci2().s[73]++;callback(err);}else{cov_1ks4ntaci2().b[15][1]++;cov_1ks4ntaci2().s[74]++;callback(null,response.data);}});},/** + * Provides auto-complete suggestions for search queries. + * + * @example + * + * service.typeahead("index=", 10, function(err, options) { + * console.log("Autocompletion options: ", options); + * }); + * + * @param {String} prefix The query fragment to autocomplete. + * @param {Number} count The number of options to return (optional). + * @param {Function} callback A function to call with the autocompletion info: `(err, options)`. + * + * @endpoint search/typeahead + * @method splunkjs.Service + */typeahead:function(prefix,count,callback){cov_1ks4ntaci2().f[26]++;cov_1ks4ntaci2().s[75]++;if((cov_1ks4ntaci2().b[17][0]++,!callback)&&(cov_1ks4ntaci2().b[17][1]++,utils.isFunction(count))){cov_1ks4ntaci2().b[16][0]++;cov_1ks4ntaci2().s[76]++;callback=count;cov_1ks4ntaci2().s[77]++;count=10;}else{cov_1ks4ntaci2().b[16][1]++;}cov_1ks4ntaci2().s[78]++;callback=(cov_1ks4ntaci2().b[18][0]++,callback)||(cov_1ks4ntaci2().b[18][1]++,function(){cov_1ks4ntaci2().f[27]++;});var params=(cov_1ks4ntaci2().s[79]++,{count:(cov_1ks4ntaci2().b[19][0]++,count)||(cov_1ks4ntaci2().b[19][1]++,10),prefix:prefix});cov_1ks4ntaci2().s[80]++;return this.get(Paths.typeahead,params,function(err,response){cov_1ks4ntaci2().f[28]++;cov_1ks4ntaci2().s[81]++;if(err){cov_1ks4ntaci2().b[20][0]++;cov_1ks4ntaci2().s[82]++;callback(err);}else{cov_1ks4ntaci2().b[20][1]++;var results=(cov_1ks4ntaci2().s[83]++,((cov_1ks4ntaci2().b[21][0]++,response.data)||(cov_1ks4ntaci2().b[21][1]++,{})).results);cov_1ks4ntaci2().s[84]++;callback(null,(cov_1ks4ntaci2().b[22][0]++,results)||(cov_1ks4ntaci2().b[22][1]++,[]));}});},/** + * Logs an event to Splunk. + * + * @example + * + * service.log("A new event", {index: "_internal", sourcetype: "mysourcetype"}, function(err, result) { + * console.log("Submitted event: ", result); + * }); + * + * @param {String|Object} event The text for this event, or a JSON object. + * @param {Object} params A dictionary of parameters for indexing: + * - `index` (_string_): The index to send events from this input to. + * - `host` (_string_): The value to populate in the Host field for events from this data input. + * - `host_regex` (_string_): A regular expression used to extract the host value from each event. + * - `source` (_string_): The value to populate in the Source field for events from this data input. + * - `sourcetype` (_string_): The value to populate in the Sourcetype field for events from this data input. + * @param {Function} callback A function to call when the event is submitted: `(err, result)`. + * + * @endpoint receivers/simple + * @method splunkjs.Service + */log:function(event,params,callback){cov_1ks4ntaci2().f[29]++;cov_1ks4ntaci2().s[85]++;if((cov_1ks4ntaci2().b[24][0]++,!callback)&&(cov_1ks4ntaci2().b[24][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[23][0]++;cov_1ks4ntaci2().s[86]++;callback=params;cov_1ks4ntaci2().s[87]++;params={};}else{cov_1ks4ntaci2().b[23][1]++;}cov_1ks4ntaci2().s[88]++;callback=(cov_1ks4ntaci2().b[25][0]++,callback)||(cov_1ks4ntaci2().b[25][1]++,function(){cov_1ks4ntaci2().f[30]++;});cov_1ks4ntaci2().s[89]++;params=(cov_1ks4ntaci2().b[26][0]++,params)||(cov_1ks4ntaci2().b[26][1]++,{});// If the event is a JSON object, convert it to a string. +cov_1ks4ntaci2().s[90]++;if(utils.isObject(event)){cov_1ks4ntaci2().b[27][0]++;cov_1ks4ntaci2().s[91]++;event=JSON.stringify(event);}else{cov_1ks4ntaci2().b[27][1]++;}var path=(cov_1ks4ntaci2().s[92]++,this.paths.submitEvent);var method=(cov_1ks4ntaci2().s[93]++,"POST");var headers=(cov_1ks4ntaci2().s[94]++,{"Content-Type":"text/plain"});var body=(cov_1ks4ntaci2().s[95]++,event);var get=(cov_1ks4ntaci2().s[96]++,params);var post=(cov_1ks4ntaci2().s[97]++,{});var req=(cov_1ks4ntaci2().s[98]++,this.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[31]++;cov_1ks4ntaci2().s[99]++;if(err){cov_1ks4ntaci2().b[28][0]++;cov_1ks4ntaci2().s[100]++;callback(err);}else{cov_1ks4ntaci2().b[28][1]++;cov_1ks4ntaci2().s[101]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[102]++;return req;}});/** + * Provides a base definition for a Splunk endpoint, which is a combination of + * a specific service and path. Provides convenience methods for GET, POST, and + * DELETE operations used in splunkjs, automatically preparing the path correctly + * and allowing for relative calls. + * + * @class splunkjs.Service.Endpoint + */cov_1ks4ntaci2().s[103]++;root.Endpoint=Class.extend({/** + * Constructor for `splunkjs.Service.Endpoint`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} qualifiedPath A fully-qualified relative endpoint path (for example, "/services/search/jobs"). + * @return {splunkjs.Service.Endpoint} A new `splunkjs.Service.Endpoint` instance. + * + * @method splunkjs.Service.Endpoint + */init:function(service,qualifiedPath){cov_1ks4ntaci2().f[32]++;cov_1ks4ntaci2().s[104]++;if(!service){cov_1ks4ntaci2().b[29][0]++;cov_1ks4ntaci2().s[105]++;throw new Error("Passed in a null Service.");}else{cov_1ks4ntaci2().b[29][1]++;}cov_1ks4ntaci2().s[106]++;if(!qualifiedPath){cov_1ks4ntaci2().b[30][0]++;cov_1ks4ntaci2().s[107]++;throw new Error("Passed in an empty path.");}else{cov_1ks4ntaci2().b[30][1]++;}cov_1ks4ntaci2().s[108]++;this.service=service;cov_1ks4ntaci2().s[109]++;this.qualifiedPath=qualifiedPath;// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[110]++;this.get=utils.bind(this,this.get);cov_1ks4ntaci2().s[111]++;this.get_v2=utils.bind(this,this.get_v2);cov_1ks4ntaci2().s[112]++;this.post=utils.bind(this,this.post);cov_1ks4ntaci2().s[113]++;this.del=utils.bind(this,this.del);},/** + * Performs a relative GET request on an endpoint's path, + * combined with the parameters and a relative path if specified. + * + * @example + * + * // Will make a request to {service.prefix}/search/jobs/123456/results?offset=1 + * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); + * endpoint.get("results", {offset: 1}, function() { console.log("DONE"))}); + * + * @param {String} relpath A relative path to append to the endpoint path. + * @param {Object} params A dictionary of entity-specific parameters to add to the query string. + * @param {Function} callback A function to call when the request is complete: `(err, response)`. + * + * @method splunkjs.Service.Endpoint + */get:function(relpath,params,callback){cov_1ks4ntaci2().f[33]++;var url=(cov_1ks4ntaci2().s[114]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[115]++;if(relpath){cov_1ks4ntaci2().b[31][0]++;cov_1ks4ntaci2().s[116]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[31][1]++;}cov_1ks4ntaci2().s[117]++;return this.service.get(url,params,callback);},get_v2:function(relpath,params){cov_1ks4ntaci2().f[34]++;var url=(cov_1ks4ntaci2().s[118]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[119]++;if(relpath){cov_1ks4ntaci2().b[32][0]++;cov_1ks4ntaci2().s[120]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[32][1]++;}cov_1ks4ntaci2().s[121]++;return this.service.get_v2(url,params);},/** + * Performs a relative POST request on an endpoint's path, + * combined with the parameters and a relative path if specified. + * + * @example + * + * // Will make a request to {service.prefix}/search/jobs/123456/control + * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); + * endpoint.post("control", {action: "cancel"}, function() { console.log("CANCELLED"))}); + * + * @param {String} relpath A relative path to append to the endpoint path. + * @param {Object} params A dictionary of entity-specific parameters to add to the body. + * @param {Function} callback A function to call when the request is complete: `(err, response)`. + * + * @method splunkjs.Service.Endpoint + */post:function(relpath,params,callback){cov_1ks4ntaci2().f[35]++;var url=(cov_1ks4ntaci2().s[122]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[123]++;if(relpath){cov_1ks4ntaci2().b[33][0]++;cov_1ks4ntaci2().s[124]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[33][1]++;}cov_1ks4ntaci2().s[125]++;return this.service.post(url,params,callback);},/** + * Performs a relative DELETE request on an endpoint's path, + * combined with the parameters and a relative path if specified. + * + * @example + * + * // Will make a request to {service.prefix}/search/jobs/123456 + * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); + * endpoint.delete("", {}, function() { console.log("DELETED"))}); + * + * @param {String} relpath A relative path to append to the endpoint path. + * @param {Object} params A dictionary of entity-specific parameters to add to the query string. + * @param {Function} callback A function to call when the request is complete: `(err, response)`. + * + * @method splunkjs.Service.Endpoint + */del:function(relpath,params,callback){cov_1ks4ntaci2().f[36]++;var url=(cov_1ks4ntaci2().s[126]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding +// slash. +cov_1ks4ntaci2().s[127]++;if(relpath){cov_1ks4ntaci2().b[34][0]++;cov_1ks4ntaci2().s[128]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[34][1]++;}cov_1ks4ntaci2().s[129]++;return this.service.del(url,params,callback);}});/** + * Provides a base definition for a Splunk resource (for example, an entity + * such as an index or search job, or a collection of entities). Provides + * basic methods for handling Splunk resources, such as validation and + * accessing properties. + * + * This class should not be used directly because most methods are meant to be overridden. + * + * @class splunkjs.Service.Resource + * @extends splunkjs.Service.Endpoint + */cov_1ks4ntaci2().s[130]++;root.Resource=root.Endpoint.extend({/** + * Constructor for `splunkjs.Service.Resource`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} path A relative endpoint path (for example, "search/jobs"). + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Resource} A new `splunkjs.Service.Resource` instance. + * + * @method splunkjs.Service.Resource + */init:function(service,path,namespace){cov_1ks4ntaci2().f[37]++;var fullpath=(cov_1ks4ntaci2().s[131]++,service.fullpath(path,namespace));cov_1ks4ntaci2().s[132]++;this._super(service,fullpath);cov_1ks4ntaci2().s[133]++;this.namespace=namespace;cov_1ks4ntaci2().s[134]++;this._properties={};cov_1ks4ntaci2().s[135]++;this._state={};// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[136]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[137]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[138]++;this.properties=utils.bind(this,this.properties);cov_1ks4ntaci2().s[139]++;this.state=utils.bind(this,this.state);cov_1ks4ntaci2().s[140]++;this.path=utils.bind(this,this.path);},/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Resource + */path:function(){cov_1ks4ntaci2().f[38]++;cov_1ks4ntaci2().s[141]++;throw new Error("MUST BE OVERRIDDEN");},/** + * Loads the resource and stores the properties. + * + * @param {Object} properties The properties for this resource. + * + * @method splunkjs.Service.Resource + * @protected + */_load:function(properties){cov_1ks4ntaci2().f[39]++;cov_1ks4ntaci2().s[142]++;this._properties=(cov_1ks4ntaci2().b[35][0]++,properties)||(cov_1ks4ntaci2().b[35][1]++,{});cov_1ks4ntaci2().s[143]++;this._state=(cov_1ks4ntaci2().b[36][0]++,properties)||(cov_1ks4ntaci2().b[36][1]++,{});},/** + * Refreshes the resource by fetching the object from the server + * and loading it. + * + * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. + * + * @method splunkjs.Service.Resource + * @protected + */fetch:function(callback){cov_1ks4ntaci2().f[40]++;cov_1ks4ntaci2().s[144]++;throw new Error("MUST BE OVERRIDDEN");},/** + * Retrieves the current properties for this resource. + * + * @return {Object} The properties. + * + * @method splunkjs.Service.Resource + */properties:function(){cov_1ks4ntaci2().f[41]++;cov_1ks4ntaci2().s[145]++;return this._properties;},/** + * Retrieves the current full state (properties and metadata) of this resource. + * + * @return {Object} The current full state of this resource. + * + * @method splunkjs.Service.Resource + */state:function(){cov_1ks4ntaci2().f[42]++;cov_1ks4ntaci2().s[146]++;return this._state;}});/** + * Defines a base class for a Splunk entity, which is a well-defined construct + * with certain operations (such as "properties", "update", and "delete"). + * Entities include search jobs, indexes, inputs, apps, and more. + * + * Provides basic methods for working with Splunk entities, such as fetching and + * updating them. + * + * @class splunkjs.Service.Entity + * @extends splunkjs.Service.Resource + */cov_1ks4ntaci2().s[147]++;root.Entity=root.Resource.extend({/** + * A static property that indicates whether to call `fetch` after an + * update to get the updated entity. By default, the entity is not + * fetched because the endpoint returns (echoes) the updated entity. + * + * @method splunkjs.Service.Entity + */fetchOnUpdate:false,/** + * Constructor for `splunkjs.Service.Entity`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} path A relative endpoint path (for example, "search/jobs"). + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. + * + * @method splunkjs.Service.Entity + */init:function(service,path,namespace){cov_1ks4ntaci2().f[43]++;cov_1ks4ntaci2().s[148]++;this._super(service,path,namespace);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[149]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[150]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[151]++;this.remove=utils.bind(this,this.remove);cov_1ks4ntaci2().s[152]++;this.update=utils.bind(this,this.update);cov_1ks4ntaci2().s[153]++;this.fields=utils.bind(this,this.fields);cov_1ks4ntaci2().s[154]++;this.links=utils.bind(this,this.links);cov_1ks4ntaci2().s[155]++;this.acl=utils.bind(this,this.acl);cov_1ks4ntaci2().s[156]++;this.author=utils.bind(this,this.author);cov_1ks4ntaci2().s[157]++;this.updated=utils.bind(this,this.updated);cov_1ks4ntaci2().s[158]++;this.published=utils.bind(this,this.published);cov_1ks4ntaci2().s[159]++;this.enable=utils.bind(this,this.enable);cov_1ks4ntaci2().s[160]++;this.disable=utils.bind(this,this.disable);cov_1ks4ntaci2().s[161]++;this.reload=utils.bind(this,this.reload);// Initial values +cov_1ks4ntaci2().s[162]++;this._properties={};cov_1ks4ntaci2().s[163]++;this._fields={};cov_1ks4ntaci2().s[164]++;this._acl={};cov_1ks4ntaci2().s[165]++;this._links={};},/** + * Loads the entity and stores the properties. + * + * @param {Object} properties The properties for this entity. + * + * @method splunkjs.Service.Entity + * @protected + */_load:function(properties){cov_1ks4ntaci2().f[44]++;cov_1ks4ntaci2().s[166]++;properties=utils.isArray(properties)?(cov_1ks4ntaci2().b[37][0]++,properties[0]):(cov_1ks4ntaci2().b[37][1]++,properties);// Initialize the properties to +// empty values +cov_1ks4ntaci2().s[167]++;properties=(cov_1ks4ntaci2().b[38][0]++,properties)||(cov_1ks4ntaci2().b[38][1]++,{content:{},fields:{},acl:{},links:{}});cov_1ks4ntaci2().s[168]++;this._super(properties);// Take out the entity-specific content +cov_1ks4ntaci2().s[169]++;this._properties=(cov_1ks4ntaci2().b[39][0]++,properties.content)||(cov_1ks4ntaci2().b[39][1]++,{});cov_1ks4ntaci2().s[170]++;this._fields=(cov_1ks4ntaci2().b[40][0]++,properties.fields)||(cov_1ks4ntaci2().b[40][1]++,this._fields)||(cov_1ks4ntaci2().b[40][2]++,{});cov_1ks4ntaci2().s[171]++;this._acl=(cov_1ks4ntaci2().b[41][0]++,properties.acl)||(cov_1ks4ntaci2().b[41][1]++,{});cov_1ks4ntaci2().s[172]++;this._links=(cov_1ks4ntaci2().b[42][0]++,properties.links)||(cov_1ks4ntaci2().b[42][1]++,{});cov_1ks4ntaci2().s[173]++;this._author=(cov_1ks4ntaci2().b[43][0]++,properties.author)||(cov_1ks4ntaci2().b[43][1]++,null);cov_1ks4ntaci2().s[174]++;this._updated=(cov_1ks4ntaci2().b[44][0]++,properties.updated)||(cov_1ks4ntaci2().b[44][1]++,null);cov_1ks4ntaci2().s[175]++;this._published=(cov_1ks4ntaci2().b[45][0]++,properties.published)||(cov_1ks4ntaci2().b[45][1]++,null);},/** + * Retrieves the fields information for this entity, indicating which + * fields are wildcards, required, and optional. + * + * @return {Object} The fields information. + * + * @method splunkjs.Service.Entity + */fields:function(){cov_1ks4ntaci2().f[45]++;cov_1ks4ntaci2().s[176]++;return this._fields;},/** + * Retrieves the access control list (ACL) information for this entity, + * which contains the permissions for accessing the entity. + * + * @return {Object} The ACL. + * + * @method splunkjs.Service.Entity + */acl:function(){cov_1ks4ntaci2().f[46]++;cov_1ks4ntaci2().s[177]++;return this._acl;},/** + * Retrieves the links information for this entity, which is the URI of + * the entity relative to the management port of a Splunk instance. + * + * @return {Object} The links information. + * + * @method splunkjs.Service.Entity + */links:function(){cov_1ks4ntaci2().f[47]++;cov_1ks4ntaci2().s[178]++;return this._links;},/** + * Retrieves the author information for this entity. + * + * @return {String} The author. + * + * @method splunkjs.Service.Entity + */author:function(){cov_1ks4ntaci2().f[48]++;cov_1ks4ntaci2().s[179]++;return this._author;},/** + * Retrieves the updated time for this entity. + * + * @return {String} The updated time. + * + * @method splunkjs.Service.Entity + */updated:function(){cov_1ks4ntaci2().f[49]++;cov_1ks4ntaci2().s[180]++;return this._updated;},/** + * Retrieves the published time for this entity. + * + * @return {String} The published time. + * + * @method splunkjs.Service.Entity + */published:function(){cov_1ks4ntaci2().f[50]++;cov_1ks4ntaci2().s[181]++;return this._published;},/** + * Refreshes the entity by fetching the object from the server and + * loading it. + * + * @param {Object} options An optional dictionary of collection filtering and pagination options: + * - `count` (_integer_): The maximum number of items to return. + * - `offset` (_integer_): The offset of the first item to return. + * - `search` (_string_): The search query to filter responses. + * - `sort_dir` (_string_): The direction to sort returned items: “asc” or “desc”. + * - `sort_key` (_string_): The field to use for sorting (optional). + * - `sort_mode` (_string_): The collating sequence for sorting returned items: “auto”, “alpha”, “alpha_case”, or “num”. + * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. + * + * @method splunkjs.Service.Entity + */fetch:function(options,callback){cov_1ks4ntaci2().f[51]++;cov_1ks4ntaci2().s[182]++;if((cov_1ks4ntaci2().b[47][0]++,!callback)&&(cov_1ks4ntaci2().b[47][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[46][0]++;cov_1ks4ntaci2().s[183]++;callback=options;cov_1ks4ntaci2().s[184]++;options={};}else{cov_1ks4ntaci2().b[46][1]++;}cov_1ks4ntaci2().s[185]++;callback=(cov_1ks4ntaci2().b[48][0]++,callback)||(cov_1ks4ntaci2().b[48][1]++,function(){cov_1ks4ntaci2().f[52]++;});cov_1ks4ntaci2().s[186]++;options=(cov_1ks4ntaci2().b[49][0]++,options)||(cov_1ks4ntaci2().b[49][1]++,{});var that=(cov_1ks4ntaci2().s[187]++,this);cov_1ks4ntaci2().s[188]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[53]++;cov_1ks4ntaci2().s[189]++;if(err){cov_1ks4ntaci2().b[50][0]++;cov_1ks4ntaci2().s[190]++;callback(err);}else{cov_1ks4ntaci2().b[50][1]++;cov_1ks4ntaci2().s[191]++;that._load(response.data?(cov_1ks4ntaci2().b[51][0]++,response.data.entry):(cov_1ks4ntaci2().b[51][1]++,null));cov_1ks4ntaci2().s[192]++;callback(null,that);}});},/** + * Deletes the entity from the server. + * + * @param {Function} callback A function to call when the object is deleted: `(err)`. + * + * @method splunkjs.Service.Entity + * @protected + */remove:function(callback){cov_1ks4ntaci2().f[54]++;cov_1ks4ntaci2().s[193]++;callback=(cov_1ks4ntaci2().b[52][0]++,callback)||(cov_1ks4ntaci2().b[52][1]++,function(){cov_1ks4ntaci2().f[55]++;});var that=(cov_1ks4ntaci2().s[194]++,this);cov_1ks4ntaci2().s[195]++;return this.del("",{},function(err){cov_1ks4ntaci2().f[56]++;cov_1ks4ntaci2().s[196]++;callback(err);});},/** + * Updates the entity on the server. + * + * @param {Object} props The properties to update the object with. + * @param {Function} callback A function to call when the object is updated: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */update:function(props,callback){cov_1ks4ntaci2().f[57]++;cov_1ks4ntaci2().s[197]++;callback=(cov_1ks4ntaci2().b[53][0]++,callback)||(cov_1ks4ntaci2().b[53][1]++,function(){cov_1ks4ntaci2().f[58]++;});cov_1ks4ntaci2().s[198]++;if(props.hasOwnProperty("name")){cov_1ks4ntaci2().b[54][0]++;cov_1ks4ntaci2().s[199]++;throw new Error("Cannot set 'name' field in 'update'");}else{cov_1ks4ntaci2().b[54][1]++;}var that=(cov_1ks4ntaci2().s[200]++,this);var req=(cov_1ks4ntaci2().s[201]++,this.post("",props,function(err,response){cov_1ks4ntaci2().f[59]++;cov_1ks4ntaci2().s[202]++;if((cov_1ks4ntaci2().b[56][0]++,!err)&&(cov_1ks4ntaci2().b[56][1]++,!that.fetchOnUpdate)){cov_1ks4ntaci2().b[55][0]++;cov_1ks4ntaci2().s[203]++;that._load(response.data.entry);cov_1ks4ntaci2().s[204]++;callback(err,that);}else{cov_1ks4ntaci2().b[55][1]++;cov_1ks4ntaci2().s[205]++;if((cov_1ks4ntaci2().b[58][0]++,!err)&&(cov_1ks4ntaci2().b[58][1]++,that.fetchOnUpdate)){cov_1ks4ntaci2().b[57][0]++;cov_1ks4ntaci2().s[206]++;that.fetch(function(){cov_1ks4ntaci2().f[60]++;cov_1ks4ntaci2().s[207]++;if(req.wasAborted){cov_1ks4ntaci2().b[59][0]++;cov_1ks4ntaci2().s[208]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[59][1]++;cov_1ks4ntaci2().s[209]++;callback.apply(null,arguments);}});}else{cov_1ks4ntaci2().b[57][1]++;cov_1ks4ntaci2().s[210]++;callback(err,that);}}}));cov_1ks4ntaci2().s[211]++;return req;},/** + * Disables the entity on the server. + * + * @param {Function} callback A function to call when the object is disabled: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */disable:function(callback){cov_1ks4ntaci2().f[61]++;cov_1ks4ntaci2().s[212]++;callback=(cov_1ks4ntaci2().b[60][0]++,callback)||(cov_1ks4ntaci2().b[60][1]++,function(){cov_1ks4ntaci2().f[62]++;});var that=(cov_1ks4ntaci2().s[213]++,this);cov_1ks4ntaci2().s[214]++;this.post("disable",{},function(err,response){cov_1ks4ntaci2().f[63]++;cov_1ks4ntaci2().s[215]++;if(err){cov_1ks4ntaci2().b[61][0]++;cov_1ks4ntaci2().s[216]++;callback(err);}else{cov_1ks4ntaci2().b[61][1]++;cov_1ks4ntaci2().s[217]++;callback(null,that);}});},/** + * Enables the entity on the server. + * + * @param {Function} callback A function to call when the object is enabled: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */enable:function(callback){cov_1ks4ntaci2().f[64]++;cov_1ks4ntaci2().s[218]++;callback=(cov_1ks4ntaci2().b[62][0]++,callback)||(cov_1ks4ntaci2().b[62][1]++,function(){cov_1ks4ntaci2().f[65]++;});var that=(cov_1ks4ntaci2().s[219]++,this);cov_1ks4ntaci2().s[220]++;this.post("enable",{},function(err,response){cov_1ks4ntaci2().f[66]++;cov_1ks4ntaci2().s[221]++;if(err){cov_1ks4ntaci2().b[63][0]++;cov_1ks4ntaci2().s[222]++;callback(err);}else{cov_1ks4ntaci2().b[63][1]++;cov_1ks4ntaci2().s[223]++;callback(null,that);}});},/** + * Reloads the entity on the server. + * + * @param {Function} callback A function to call when the object is reloaded: `(err, entity)`. + * + * @method splunkjs.Service.Entity + * @protected + */reload:function(callback){cov_1ks4ntaci2().f[67]++;cov_1ks4ntaci2().s[224]++;callback=(cov_1ks4ntaci2().b[64][0]++,callback)||(cov_1ks4ntaci2().b[64][1]++,function(){cov_1ks4ntaci2().f[68]++;});var that=(cov_1ks4ntaci2().s[225]++,this);cov_1ks4ntaci2().s[226]++;this.post("_reload",{},function(err,response){cov_1ks4ntaci2().f[69]++;cov_1ks4ntaci2().s[227]++;if(err){cov_1ks4ntaci2().b[65][0]++;cov_1ks4ntaci2().s[228]++;callback(err);}else{cov_1ks4ntaci2().b[65][1]++;cov_1ks4ntaci2().s[229]++;callback(null,that);}});}});/** + * Defines a base class for a Splunk collection, which is a well-defined construct + * that provides basic methods for working with collections of entities, such as + * creating and listing entities. + * + * @class splunkjs.Service.Collection + * @extends splunkjs.Service.Resource + */cov_1ks4ntaci2().s[230]++;root.Collection=root.Resource.extend({/** + * A static property that indicates whether to call `fetch` after an + * entity has been created. By default, the entity is not fetched + * because the endpoint returns (echoes) the new entity. + + * @method splunkjs.Service.Collection + */fetchOnEntityCreation:false,/** + * Constructor for `splunkjs.Service.Collection`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} path A relative endpoint path (for example, "search/jobs"). + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Collection} A new `splunkjs.Service.Collection` instance. + * + * @method splunkjs.Service.Collection + */init:function(service,path,namespace){cov_1ks4ntaci2().f[70]++;cov_1ks4ntaci2().s[231]++;this._super(service,path,namespace);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[232]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[233]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[234]++;this.create=utils.bind(this,this.create);cov_1ks4ntaci2().s[235]++;this.list=utils.bind(this,this.list);cov_1ks4ntaci2().s[236]++;this.item=utils.bind(this,this.item);cov_1ks4ntaci2().s[237]++;this.instantiateEntity=utils.bind(this,this.instantiateEntity);// Initial values +cov_1ks4ntaci2().s[238]++;this._entities=[];cov_1ks4ntaci2().s[239]++;this._entitiesByName={};cov_1ks4ntaci2().s[240]++;this._properties={};cov_1ks4ntaci2().s[241]++;this._paging={};cov_1ks4ntaci2().s[242]++;this._links={};},/** + * Creates a local instance of an entity. + * + * @param {Object} props The properties for this entity. + * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. + * + * @method splunkjs.Service.Collection + */instantiateEntity:function(props){cov_1ks4ntaci2().f[71]++;cov_1ks4ntaci2().s[243]++;throw new Error("MUST BE OVERRIDDEN");},/** + * Loads the collection and properties, and creates a map of entity + * names to entity IDs (for retrieval purposes). + * + * @param {Object} properties The properties for this collection. + * + * @method splunkjs.Service.Collection + * @private + */_load:function(properties){cov_1ks4ntaci2().f[72]++;cov_1ks4ntaci2().s[244]++;this._super(properties);var entities=(cov_1ks4ntaci2().s[245]++,[]);var entitiesByName=(cov_1ks4ntaci2().s[246]++,{});var entityPropertyList=(cov_1ks4ntaci2().s[247]++,(cov_1ks4ntaci2().b[66][0]++,properties.entry)||(cov_1ks4ntaci2().b[66][1]++,[]));cov_1ks4ntaci2().s[248]++;for(var i=(cov_1ks4ntaci2().s[249]++,0);i1)&&(cov_1ks4ntaci2().b[90][1]++,!namespace)){cov_1ks4ntaci2().b[89][0]++;cov_1ks4ntaci2().s[303]++;// If there is more than one entity and we didn't +// specify a namespace, then we return an error +// saying the match is ambiguous +throw new Error("Ambiguous match for name '"+id+"'");}else{cov_1ks4ntaci2().b[89][1]++;cov_1ks4ntaci2().s[304]++;// There is more than one entity, and we do have +// a namespace, so we try and find it +for(var i=(cov_1ks4ntaci2().s[305]++,0);iPagination and Filtering options in the REST API documentation. + * @param {Function} callback A function to call when the history is retrieved: `(err, job, savedSearch)`. + * + * @endpoint saved/searches/{name}/history + * @method splunkjs.Service.SavedSearch + */history:function(options,callback){cov_1ks4ntaci2().f[97]++;cov_1ks4ntaci2().s[359]++;if((cov_1ks4ntaci2().b[106][0]++,!callback)&&(cov_1ks4ntaci2().b[106][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[105][0]++;cov_1ks4ntaci2().s[360]++;callback=options;cov_1ks4ntaci2().s[361]++;options={};}else{cov_1ks4ntaci2().b[105][1]++;}cov_1ks4ntaci2().s[362]++;callback=(cov_1ks4ntaci2().b[107][0]++,callback)||(cov_1ks4ntaci2().b[107][1]++,function(){cov_1ks4ntaci2().f[98]++;});cov_1ks4ntaci2().s[363]++;options=(cov_1ks4ntaci2().b[108][0]++,options)||(cov_1ks4ntaci2().b[108][1]++,{});var that=(cov_1ks4ntaci2().s[364]++,this);cov_1ks4ntaci2().s[365]++;return this.get("history",options,function(err,response){cov_1ks4ntaci2().f[99]++;cov_1ks4ntaci2().s[366]++;if(err){cov_1ks4ntaci2().b[109][0]++;cov_1ks4ntaci2().s[367]++;callback(err);cov_1ks4ntaci2().s[368]++;return;}else{cov_1ks4ntaci2().b[109][1]++;}var jobs=(cov_1ks4ntaci2().s[369]++,[]);var data=(cov_1ks4ntaci2().s[370]++,(cov_1ks4ntaci2().b[110][0]++,response.data.entry)||(cov_1ks4ntaci2().b[110][1]++,[]));cov_1ks4ntaci2().s[371]++;for(var i=(cov_1ks4ntaci2().s[372]++,0);iSaved search parameters on Splunk Developer Portal. + * @param {Function} callback A function to call when the object is updated: `(err, entity)`. + * + * @method splunkjs.Service.SavedSearch + */update:function(params,callback){cov_1ks4ntaci2().f[103]++;cov_1ks4ntaci2().s[383]++;params=(cov_1ks4ntaci2().b[112][0]++,params)||(cov_1ks4ntaci2().b[112][1]++,{});cov_1ks4ntaci2().s[384]++;if(!params.search){cov_1ks4ntaci2().b[113][0]++;var update=(cov_1ks4ntaci2().s[385]++,this._super);var req=(cov_1ks4ntaci2().s[386]++,this.fetch(function(err,search){cov_1ks4ntaci2().f[104]++;cov_1ks4ntaci2().s[387]++;if(err){cov_1ks4ntaci2().b[114][0]++;cov_1ks4ntaci2().s[388]++;callback(err);}else{cov_1ks4ntaci2().b[114][1]++;cov_1ks4ntaci2().s[389]++;params.search=search.properties().search;cov_1ks4ntaci2().s[390]++;update.call(search,params,function(){cov_1ks4ntaci2().f[105]++;cov_1ks4ntaci2().s[391]++;if(req.wasAborted){cov_1ks4ntaci2().b[115][0]++;cov_1ks4ntaci2().s[392]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[115][1]++;cov_1ks4ntaci2().s[393]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[394]++;return req;}else{cov_1ks4ntaci2().b[113][1]++;cov_1ks4ntaci2().s[395]++;return this._super(params,callback);}}});/** + * Represents a collection of saved searches. You can create and list saved + * searches using this collection container, or get a specific saved search. + * + * + * @endpoint saved/searches + * @class splunkjs.Service.SavedSearches + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[396]++;root.SavedSearches=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.SavedSearches + */path:function(){cov_1ks4ntaci2().f[106]++;cov_1ks4ntaci2().s[397]++;return Paths.savedSearches;},/** + * Creates a local instance of a saved search. + * + * @param {Object} props The properties for the new saved search. For a list of available parameters, see Saved search parameters on Splunk Developer Portal. + * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.SavedSearch` instance. + * + * @method splunkjs.Service.SavedSearches + */instantiateEntity:function(props){cov_1ks4ntaci2().f[107]++;var entityNamespace=(cov_1ks4ntaci2().s[398]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[399]++;return new root.SavedSearch(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.SavedSearches`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.SavedSearches} A new `splunkjs.Service.SavedSearches` instance. + * + * @method splunkjs.Service.SavedSearches + */init:function(service,namespace){cov_1ks4ntaci2().f[108]++;cov_1ks4ntaci2().s[400]++;this._super(service,this.path(),namespace);}});/** + * Represents a specific storage password, which you can then view, modify, and + * remove. + * + * @endpoint storage/passwords/{name} + * @class splunkjs.Service.StoragePassword + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[401]++;root.StoragePassword=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.StoragePassword + */path:function(){cov_1ks4ntaci2().f[109]++;cov_1ks4ntaci2().s[402]++;return Paths.storagePasswords+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.StoragePassword`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name for the new storage password. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.StoragePassword} A new `splunkjs.Service.StoragePassword` instance. + * + * @method splunkjs.Service.StoragePassword + */init:function(service,name,namespace){cov_1ks4ntaci2().f[110]++;cov_1ks4ntaci2().s[403]++;this.name=name;cov_1ks4ntaci2().s[404]++;this._super(service,this.path(),namespace);}});/** + * Represents a collection of storage passwords. You can create and list storage + * passwords using this collection container, or get a specific storage password. + * + * @endpoint storage/passwords + * @class splunkjs.Service.StoragePasswords + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[405]++;root.StoragePasswords=root.Collection.extend({/** + * Indicates whether to call `fetch` after an entity has been created. By + * default, the entity is not fetched because the endpoint returns + * (echoes) the new entity. + * + * @method splunkjs.Service.StoragePasswords + */fetchOnEntityCreation:true,/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.StoragePasswords + */path:function(){cov_1ks4ntaci2().f[111]++;cov_1ks4ntaci2().s[406]++;return Paths.storagePasswords;},/** + * Creates a local instance of a storage password. + * + * @param {Object} props The properties for the new storage password. For a list of available parameters, + * see + * POST storage/passwords on Splunk Developer Portal. + * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.StoragePassword` instance. + * + * @method splunkjs.Service.StoragePasswords + */instantiateEntity:function(props){cov_1ks4ntaci2().f[112]++;var entityNamespace=(cov_1ks4ntaci2().s[407]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[408]++;return new root.StoragePassword(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.StoragePasswords`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.StoragePasswords} A new `splunkjs.Service.StoragePasswords` instance. + * + * @method splunkjs.Service.StoragePasswords + */init:function(service,namespace){cov_1ks4ntaci2().f[113]++;cov_1ks4ntaci2().s[409]++;this._super(service,this.path(),namespace);}});/** + * Represents a fired alert. + * You can retrieve several of the fired alert's properties by + * the corresponding function name. + * + * @endpoint alerts/fired_alerts/{name} + * @class splunkjs.Service.FiredAlert + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[410]++;root.FiredAlert=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.FiredAlert + */path:function(){cov_1ks4ntaci2().f[114]++;cov_1ks4ntaci2().s[411]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** + * Returns this alert's actions (such as notifying by email, running a + * script, adding to RSS, tracking in Alert Manager, and enabling + * summary indexing). + * + * @return {Array} of actions, an empty {Array} if no actions + * @method splunkjs.Service.FiredAlert + */actions:function(){cov_1ks4ntaci2().f[115]++;cov_1ks4ntaci2().s[412]++;return(cov_1ks4ntaci2().b[116][0]++,this.properties().actions)||(cov_1ks4ntaci2().b[116][1]++,[]);},/** + * Returns this alert's type. + * + * @return {String} the alert's type. + * @method splunkjs.Service.FiredAlert + */alertType:function(){cov_1ks4ntaci2().f[116]++;cov_1ks4ntaci2().s[413]++;return(cov_1ks4ntaci2().b[117][0]++,this.properties().alert_type)||(cov_1ks4ntaci2().b[117][1]++,null);},/** + * Indicates whether the result is a set of events (digest) or a single + * event (per result). + * + * This method is available in Splunk 4.3 and later. + * + * @return {Boolean} true if the result is a digest, false if per result + * @method splunkjs.Service.FiredAlert + */isDigestMode:function(){cov_1ks4ntaci2().f[117]++;cov_1ks4ntaci2().s[414]++;// Convert this property to a Boolean +return!!this.properties().digest_mode;},/** + * Returns the rendered expiration time for this alert. + * + * This method is available in Splunk 4.3 and later. + * + * @return {String} + * @method splunkjs.Service.FiredAlert + */expirationTime:function(){cov_1ks4ntaci2().f[118]++;cov_1ks4ntaci2().s[415]++;return(cov_1ks4ntaci2().b[118][0]++,this.properties().expiration_time_rendered)||(cov_1ks4ntaci2().b[118][1]++,null);},/** + * Returns the saved search for this alert. + * + * @return {String} The saved search name, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */savedSearchName:function(){cov_1ks4ntaci2().f[119]++;cov_1ks4ntaci2().s[416]++;return(cov_1ks4ntaci2().b[119][0]++,this.properties().savedsearch_name)||(cov_1ks4ntaci2().b[119][1]++,null);},/** + * Returns this alert's severity on a scale of 1 to 10, with 1 being the + * highest severity. + * + * @return {Number} this alert's severity, -1 if not specified + * @method splunkjs.Service.FiredAlert + */severity:function(){cov_1ks4ntaci2().f[120]++;cov_1ks4ntaci2().s[417]++;return(cov_1ks4ntaci2().b[120][0]++,parseInt(this.properties().severity,10))||(cov_1ks4ntaci2().b[120][1]++,-1);},/** + * Returns this alert's search ID (SID). + * + * @return {String} This alert's SID, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */sid:function(){cov_1ks4ntaci2().f[121]++;cov_1ks4ntaci2().s[418]++;return(cov_1ks4ntaci2().b[121][0]++,this.properties().sid)||(cov_1ks4ntaci2().b[121][1]++,null);},/** + * Returns the time this alert was triggered. + * + * @return {Number} This alert's trigger time, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */triggerTime:function(){cov_1ks4ntaci2().f[122]++;cov_1ks4ntaci2().s[419]++;return(cov_1ks4ntaci2().b[122][0]++,this.properties().trigger_time)||(cov_1ks4ntaci2().b[122][1]++,null);},/** + * Returns this alert's rendered trigger time. + * + * This method is available in Splunk 4.3 and later. + * + * @return {String} This alert's rendered trigger time, or {null} if not available. + * @method splunkjs.Service.FiredAlert + */triggerTimeRendered:function(){cov_1ks4ntaci2().f[123]++;cov_1ks4ntaci2().s[420]++;return(cov_1ks4ntaci2().b[123][0]++,this.properties().trigger_time_rendered)||(cov_1ks4ntaci2().b[123][1]++,null);},/** + * Returns the count of triggered alerts. + * + * This method is available in Splunk 4.3 and later. + * + * @return {Number} The number of triggered alerts, or -1 if not specified. + * @method splunkjs.Service.FiredAlert + */triggeredAlertCount:function(){cov_1ks4ntaci2().f[124]++;cov_1ks4ntaci2().s[421]++;return(cov_1ks4ntaci2().b[124][0]++,parseInt(this.properties().triggered_alerts,10))||(cov_1ks4ntaci2().b[124][1]++,-1);},/** + * Constructor for `splunkjs.Service.FiredAlert`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name for the new alert group. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.FiredAlert} A new `splunkjs.Service.FiredAlert` instance. + * + * @method splunkjs.Service.FiredAlert + */init:function(service,name,namespace){cov_1ks4ntaci2().f[125]++;cov_1ks4ntaci2().s[422]++;this.name=name;cov_1ks4ntaci2().s[423]++;this._super(service,this.path(),namespace);}});/** + * Represents a specific alert group, which you can then view and + * remove. + * + * @endpoint alerts/fired_alerts/{name} + * @class splunkjs.Service.FiredAlertGroup + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[424]++;root.FiredAlertGroup=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.FiredAlertGroup + */path:function(){cov_1ks4ntaci2().f[126]++;cov_1ks4ntaci2().s[425]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** + * Returns the `triggered_alert_count` property, the count + * of triggered alerts. + * + * @return {Number} the count of triggered alerts + * + * @method splunkjs.Service.FiredAlertGroup + */count:function(){cov_1ks4ntaci2().f[127]++;cov_1ks4ntaci2().s[426]++;return(cov_1ks4ntaci2().b[125][0]++,parseInt(this.properties().triggered_alert_count,10))||(cov_1ks4ntaci2().b[125][1]++,0);},/** + * Returns fired instances of this alert, which is + * a list of `splunkjs.Service.FiredAlert` instances. + * + * @example + * + * var alertGroup = service.firedAlertGroups().item("MyAlert"); + * alertGroup.list(function(err, firedAlerts, alert) { + * for(var i = 0; i < firedAlerts.length; i++) { + * console.log("Fired alert", i, ":", firedAlerts[i].sid); + * } + * }); + * + * @param {Function} callback A function to call when the fired alerts are retrieved: `(err, firedAlerts, alertGroup)`. + * + * @method splunkjs.Service.FiredAlertGroup + */list:function(options,callback){cov_1ks4ntaci2().f[128]++;cov_1ks4ntaci2().s[427]++;if((cov_1ks4ntaci2().b[127][0]++,!callback)&&(cov_1ks4ntaci2().b[127][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[126][0]++;cov_1ks4ntaci2().s[428]++;callback=options;cov_1ks4ntaci2().s[429]++;options={};}else{cov_1ks4ntaci2().b[126][1]++;}cov_1ks4ntaci2().s[430]++;callback=(cov_1ks4ntaci2().b[128][0]++,callback)||(cov_1ks4ntaci2().b[128][1]++,function(){cov_1ks4ntaci2().f[129]++;});cov_1ks4ntaci2().s[431]++;options=(cov_1ks4ntaci2().b[129][0]++,options)||(cov_1ks4ntaci2().b[129][1]++,{});var that=(cov_1ks4ntaci2().s[432]++,this);cov_1ks4ntaci2().s[433]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[130]++;cov_1ks4ntaci2().s[434]++;if(err){cov_1ks4ntaci2().b[130][0]++;cov_1ks4ntaci2().s[435]++;callback(err);cov_1ks4ntaci2().s[436]++;return;}else{cov_1ks4ntaci2().b[130][1]++;}var firedAlerts=(cov_1ks4ntaci2().s[437]++,[]);var data=(cov_1ks4ntaci2().s[438]++,(cov_1ks4ntaci2().b[131][0]++,response.data.entry)||(cov_1ks4ntaci2().b[131][1]++,[]));cov_1ks4ntaci2().s[439]++;for(var i=(cov_1ks4ntaci2().s[440]++,0);iPOST apps/local endpoint in the REST API documentation. + * @return {splunkjs.Service.Application} A new `splunkjs.Service.Application` instance. + * + * @method splunkjs.Service.Applications + */instantiateEntity:function(props){cov_1ks4ntaci2().f[145]++;cov_1ks4ntaci2().s[478]++;return new root.Application(this.service,props.name,{});},/** + * Constructor for `splunkjs.Service.Applications`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @return {splunkjs.Service.Applications} A new `splunkjs.Service.Applications` instance. + * + * @method splunkjs.Service.Applications + */init:function(service){cov_1ks4ntaci2().f[146]++;cov_1ks4ntaci2().s[479]++;this._super(service,this.path(),{});}});/** + * Provides access to configuration information about the server. + * + * @endpoint server/info + * @class splunkjs.Service.ServerInfo + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[480]++;root.ServerInfo=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.ServerInfo + */path:function(){cov_1ks4ntaci2().f[147]++;cov_1ks4ntaci2().s[481]++;return Paths.info;},/** + * Constructor for `splunkjs.Service.ServerInfo`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @return {splunkjs.Service.ServerInfo} A new `splunkjs.Service.ServerInfo` instance. + * + * @method splunkjs.Service.ServerInfo + */init:function(service){cov_1ks4ntaci2().f[148]++;cov_1ks4ntaci2().s[482]++;this.name="server-info";cov_1ks4ntaci2().s[483]++;this._super(service,this.path(),{});}});/** + * Represents a specific Splunk user, which you can view, modify, and + * remove. + * + * @endpoint authentication/users/{name} + * @class splunkjs.Service.User + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[484]++;root.User=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.User + */path:function(){cov_1ks4ntaci2().f[149]++;cov_1ks4ntaci2().s[485]++;return Paths.users+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.User`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The Splunk username. + * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. + * + * @method splunkjs.Service.User + */init:function(service,name){cov_1ks4ntaci2().f[150]++;cov_1ks4ntaci2().s[486]++;this.name=name;cov_1ks4ntaci2().s[487]++;this._super(service,this.path(),{});}});/** + * Represents a collection of users. You can create and list users using + * this collection container, or get a specific user. + * + * @endpoint authentication/users + * @class splunkjs.Service.Users + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[488]++;root.Users=root.Collection.extend({/** + * Indicates whether to call `fetch` after an entity has been created. By + * default, the entity is not fetched because the endpoint returns + * (echoes) the new entity. + * + * @method splunkjs.Service.Users + */fetchOnEntityCreation:true,/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Users + */path:function(){cov_1ks4ntaci2().f[151]++;cov_1ks4ntaci2().s[489]++;return Paths.users;},/** + * Creates a local instance of a user. + * + * @param {Object} props The properties for this new user. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. + * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. + * + * @method splunkjs.Service.Users + */instantiateEntity:function(props){cov_1ks4ntaci2().f[152]++;cov_1ks4ntaci2().s[490]++;return new root.User(this.service,props.name,{});},/** + * Constructor for `splunkjs.Service.Users`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @return {splunkjs.Service.Users} A new `splunkjs.Service.Users` instance. + * + * @method splunkjs.Service.Users + */init:function(service){cov_1ks4ntaci2().f[153]++;cov_1ks4ntaci2().s[491]++;this._super(service,this.path(),{});},/** + * Creates a new user. + * + * **Note:** This endpoint requires a special implementation. + * + * @param {Object} params A dictionary of properties. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. + * @param {Function} callback A function to call with the new entity: `(err, createdEntity)`. + * + * @method splunkjs.Service.Users + */create:function(params,callback){cov_1ks4ntaci2().f[154]++;cov_1ks4ntaci2().s[492]++;callback=(cov_1ks4ntaci2().b[136][0]++,callback)||(cov_1ks4ntaci2().b[136][1]++,function(){cov_1ks4ntaci2().f[155]++;});var that=(cov_1ks4ntaci2().s[493]++,this);var req=(cov_1ks4ntaci2().s[494]++,this.post("",params,function(err,response){cov_1ks4ntaci2().f[156]++;cov_1ks4ntaci2().s[495]++;if(err){cov_1ks4ntaci2().b[137][0]++;cov_1ks4ntaci2().s[496]++;callback(err);}else{cov_1ks4ntaci2().b[137][1]++;// This endpoint requires us to use the passed-in name +var props=(cov_1ks4ntaci2().s[497]++,{name:params.name});var entity=(cov_1ks4ntaci2().s[498]++,that.instantiateEntity(props));cov_1ks4ntaci2().s[499]++;entity.fetch(function(){cov_1ks4ntaci2().f[157]++;cov_1ks4ntaci2().s[500]++;if(req.wasAborted){cov_1ks4ntaci2().b[138][0]++;cov_1ks4ntaci2().s[501]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[138][1]++;cov_1ks4ntaci2().s[502]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[503]++;return req;}});/** + * Represents a specific Splunk view, which you can view, modify, and + * remove. + * + * @endpoint data/ui/views/{name} + * @class splunkjs.Service.View + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[504]++;root.View=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.View + */path:function(){cov_1ks4ntaci2().f[158]++;cov_1ks4ntaci2().s[505]++;return Paths.views+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.View`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name of the view. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. + * + * @method splunkjs.Service.View + */init:function(service,name,namespace){cov_1ks4ntaci2().f[159]++;cov_1ks4ntaci2().s[506]++;this.name=name;cov_1ks4ntaci2().s[507]++;this._super(service,this.path(),namespace);}});/** + * Represents a collection of views. You can create and list views using + * this collection container, or get a specific view. + * + * @endpoint data/ui/views + * @class splunkjs.Service.Views + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[508]++;root.Views=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Views + */path:function(){cov_1ks4ntaci2().f[160]++;cov_1ks4ntaci2().s[509]++;return Paths.views;},/** + * Creates a local instance of a view. + * + * @param {Object} props The properties for the new view. For a list of available parameters, see the POST scheduled/views/{name} endpoint in the REST API documentation. + * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. + * + * @method splunkjs.Service.Views + */instantiateEntity:function(props){cov_1ks4ntaci2().f[161]++;var entityNamespace=(cov_1ks4ntaci2().s[510]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[511]++;return new root.View(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.Views`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Views} A new `splunkjs.Service.Views` instance. + * + * @method splunkjs.Service.Views + */init:function(service,namespace){cov_1ks4ntaci2().f[162]++;cov_1ks4ntaci2().s[512]++;this._super(service,this.path(),namespace);}});/** + * Represents an index, which you can update and submit events to. + * + * @endpoint data/indexes/name + * @class splunkjs.Service.Index + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[513]++;root.Index=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Index + */path:function(){cov_1ks4ntaci2().f[163]++;cov_1ks4ntaci2().s[514]++;return Paths.indexes+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.Index`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name of the index. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. + * + * @method splunkjs.Service.Index + */init:function(service,name,namespace){cov_1ks4ntaci2().f[164]++;cov_1ks4ntaci2().s[515]++;this.name=name;cov_1ks4ntaci2().s[516]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[517]++;this.submitEvent=utils.bind(this,this.submitEvent);},/** + * Submits an event to this index. + * + * @example + * + * var index = service.indexes().item("_internal"); + * index.submitEvent("A new event", {sourcetype: "mysourcetype"}, function(err, result, index) { + * console.log("Submitted event: ", result); + * }); + * + * @param {String} event The text for this event. + * @param {Object} params A dictionary of parameters for indexing: + * - `host` (_string_): The value to populate in the host field for events from this data input. + * - `host_regex` (_string_): A regular expression used to extract the host value from each event. + * - `source` (_string_): The source value to fill in the metadata for this input's events. + * - `sourcetype` (_string_): The sourcetype to apply to events from this input. + * @param {Function} callback A function to call when the event is submitted: `(err, result, index)`. + * + * @endpoint receivers/simple?index={name} + * @method splunkjs.Service.Index + */submitEvent:function(event,params,callback){cov_1ks4ntaci2().f[165]++;cov_1ks4ntaci2().s[518]++;if((cov_1ks4ntaci2().b[140][0]++,!callback)&&(cov_1ks4ntaci2().b[140][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[139][0]++;cov_1ks4ntaci2().s[519]++;callback=params;cov_1ks4ntaci2().s[520]++;params={};}else{cov_1ks4ntaci2().b[139][1]++;}cov_1ks4ntaci2().s[521]++;callback=(cov_1ks4ntaci2().b[141][0]++,callback)||(cov_1ks4ntaci2().b[141][1]++,function(){cov_1ks4ntaci2().f[166]++;});cov_1ks4ntaci2().s[522]++;params=(cov_1ks4ntaci2().b[142][0]++,params)||(cov_1ks4ntaci2().b[142][1]++,{});// Add the index name +cov_1ks4ntaci2().s[523]++;params["index"]=this.name;var that=(cov_1ks4ntaci2().s[524]++,this);cov_1ks4ntaci2().s[525]++;return this.service.log(event,params,function(err,result){cov_1ks4ntaci2().f[167]++;cov_1ks4ntaci2().s[526]++;callback(err,result,that);});},remove:function(callback){cov_1ks4ntaci2().f[168]++;cov_1ks4ntaci2().s[527]++;if(this.service.versionCompare("5.0")<0){cov_1ks4ntaci2().b[143][0]++;cov_1ks4ntaci2().s[528]++;throw new Error("Indexes cannot be removed in Splunk 4.x");}else{cov_1ks4ntaci2().b[143][1]++;cov_1ks4ntaci2().s[529]++;return this._super(callback);}}});/** + * Represents a collection of indexes. You can create and list indexes using + * this collection container, or get a specific index. + * + * @endpoint data/indexes + * @class splunkjs.Service.Indexes + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[530]++;root.Indexes=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Indexes + */path:function(){cov_1ks4ntaci2().f[169]++;cov_1ks4ntaci2().s[531]++;return Paths.indexes;},/** + * Creates a local instance of an index. + * + * @param {Object} props The properties for the new index. For a list of available parameters, see Index parameters on Splunk Developer Portal. + * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. + * + * @method splunkjs.Service.Indexes + */instantiateEntity:function(props){cov_1ks4ntaci2().f[170]++;var entityNamespace=(cov_1ks4ntaci2().s[532]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[533]++;return new root.Index(this.service,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.Indexes`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Indexes} A new `splunkjs.Service.Indexes` instance. + * + * @method splunkjs.Service.Indexes + */init:function(service,namespace){cov_1ks4ntaci2().f[171]++;cov_1ks4ntaci2().s[534]++;this._super(service,this.path(),namespace);},/** + * Creates an index with the given name and parameters. + * + * @example + * + * var indexes = service.indexes(); + * indexes.create("NewIndex", {assureUTF8: true}, function(err, newIndex) { + * console.log("CREATED"); + * }); + * + * @param {String} name A name for this index. + * @param {Object} params A dictionary of properties. For a list of available parameters, see Index parameters on Splunk Developer Portal. + * @param {Function} callback A function to call with the new index: `(err, createdIndex)`. + * + * @endpoint data/indexes + * @method splunkjs.Service.Indexes + */create:function(name,params,callback){cov_1ks4ntaci2().f[172]++;cov_1ks4ntaci2().s[535]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[145][0]++,utils.isObject(name))&&(cov_1ks4ntaci2().b[145][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[145][2]++,!callback)){cov_1ks4ntaci2().b[144][0]++;cov_1ks4ntaci2().s[536]++;callback=params;cov_1ks4ntaci2().s[537]++;params=name;cov_1ks4ntaci2().s[538]++;name=params.name;}else{cov_1ks4ntaci2().b[144][1]++;}cov_1ks4ntaci2().s[539]++;params=(cov_1ks4ntaci2().b[146][0]++,params)||(cov_1ks4ntaci2().b[146][1]++,{});cov_1ks4ntaci2().s[540]++;params["name"]=name;cov_1ks4ntaci2().s[541]++;return this._super(params,callback);}});/** + * Represents a specific stanza, which you can update and remove, from a + * configuration file. + * + * @endpoint configs/conf-{file}/{name}` + * @class splunkjs.Service.ConfigurationStanza + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[542]++;root.ConfigurationStanza=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.ConfigurationStanza + */path:function(){cov_1ks4ntaci2().f[173]++;var name=(cov_1ks4ntaci2().s[543]++,this.name==="default"?(cov_1ks4ntaci2().b[147][0]++,"_new"):(cov_1ks4ntaci2().b[147][1]++,this.name));cov_1ks4ntaci2().s[544]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.file)+"/"+encodeURIComponent(name);},/** + * Constructor for `splunkjs.Service.ConfigurationStanza`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} file The name of the configuration file. + * @param {String} name The name of the new stanza. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. + * + * @method splunkjs.Service.ConfigurationStanza + */init:function(service,file,name,namespace){cov_1ks4ntaci2().f[174]++;cov_1ks4ntaci2().s[545]++;this.name=name;cov_1ks4ntaci2().s[546]++;this.file=file;cov_1ks4ntaci2().s[547]++;this._super(service,this.path(),namespace);}});/** + * Represents a collection of stanzas for a specific property file. You can + * create and list stanzas using this collection container, or get a specific + * stanza. + * + * @endpoint configs/conf-{file} + * @class splunkjs.Service.ConfigurationFile + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[548]++;root.ConfigurationFile=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.ConfigurationFile + */path:function(){cov_1ks4ntaci2().f[175]++;cov_1ks4ntaci2().s[549]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.name);},/** + * Creates a local instance of the default stanza in a configuration file. + * You cannot directly update the `ConfigurationStanza` returned by this function. + * + * This is equivalent to viewing `configs/conf-{file}/_new`. + * + * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. + * + * @method splunkjs.Service.ConfigurationFile + */getDefaultStanza:function(){cov_1ks4ntaci2().f[176]++;cov_1ks4ntaci2().s[550]++;return new root.ConfigurationStanza(this.service,this.name,"default",this.namespace);},/** + * Creates a local instance of a stanza in a configuration file. + * + * @param {Object} props The key-value properties for the new stanza. + * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. + * + * @method splunkjs.Service.ConfigurationFile + */instantiateEntity:function(props){cov_1ks4ntaci2().f[177]++;var entityNamespace=(cov_1ks4ntaci2().s[551]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[552]++;return new root.ConfigurationStanza(this.service,this.name,props.name,entityNamespace);},/** + * Constructor for `splunkjs.Service.ConfigurationFile`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name of the configuration file. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. + * + * @method splunkjs.Service.ConfigurationFile + */init:function(service,name,namespace){cov_1ks4ntaci2().f[178]++;cov_1ks4ntaci2().s[553]++;this.name=name;cov_1ks4ntaci2().s[554]++;this._super(service,this.path(),namespace);},/** + * Creates a stanza in this configuration file. + * + * @example + * + * var file = service.configurations().item("props"); + * file.create("my_stanza", function(err, newStanza) { + * console.log("CREATED"); + * }); + * + * @param {String} stanzaName A name for this stanza. + * @param {Object} values A dictionary of key-value pairs to put in this stanza. + * @param {Function} callback A function to call with the created stanza: `(err, createdStanza)`. + * + * @endpoint configs/conf-{file} + * @method splunkjs.Service.ConfigurationFile + */create:function(stanzaName,values,callback){cov_1ks4ntaci2().f[179]++;cov_1ks4ntaci2().s[555]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[149][0]++,utils.isObject(stanzaName))&&(cov_1ks4ntaci2().b[149][1]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[149][2]++,!callback)){cov_1ks4ntaci2().b[148][0]++;cov_1ks4ntaci2().s[556]++;callback=values;cov_1ks4ntaci2().s[557]++;values=stanzaName;cov_1ks4ntaci2().s[558]++;stanzaName=values.name;}else{cov_1ks4ntaci2().b[148][1]++;}cov_1ks4ntaci2().s[559]++;if((cov_1ks4ntaci2().b[151][0]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[151][1]++,!callback)){cov_1ks4ntaci2().b[150][0]++;cov_1ks4ntaci2().s[560]++;callback=values;cov_1ks4ntaci2().s[561]++;values={};}else{cov_1ks4ntaci2().b[150][1]++;}cov_1ks4ntaci2().s[562]++;values=(cov_1ks4ntaci2().b[152][0]++,values)||(cov_1ks4ntaci2().b[152][1]++,{});cov_1ks4ntaci2().s[563]++;values["name"]=stanzaName;cov_1ks4ntaci2().s[564]++;return this._super(values,callback);}});/** + * Represents a collection of configuration files. You can create and list + * configuration files using this collection container, or get a specific file. + * + * @endpoint properties + * @class splunkjs.Service.Configurations + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[565]++;root.Configurations=root.Collection.extend({/** + * Indicates whether to call `fetch` after an entity has been created. By + * default, the entity is not fetched because the endpoint returns + * (echoes) the new entity. + * + * @method splunkjs.Service.Configurations + */fetchOnEntityCreation:true,/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Configurations + */path:function(){cov_1ks4ntaci2().f[180]++;cov_1ks4ntaci2().s[566]++;return Paths.properties;},/** + * Creates a local instance of a configuration file. + * + * @param {Object} props The properties for this configuration file. + * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. + * + * @method splunkjs.Service.Configurations + */instantiateEntity:function(props){cov_1ks4ntaci2().f[181]++;cov_1ks4ntaci2().s[567]++;return new root.ConfigurationFile(this.service,props.name,this.namespace);},/** + * Constructor for `splunkjs.Service.Configurations`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Configurations} A new `splunkjs.Service.Configurations` instance. + * + * @method splunkjs.Service.Configurations + */init:function(service,namespace){cov_1ks4ntaci2().f[182]++;cov_1ks4ntaci2().s[568]++;if((cov_1ks4ntaci2().b[154][0]++,!namespace)||(cov_1ks4ntaci2().b[154][1]++,namespace.owner==="-")||(cov_1ks4ntaci2().b[154][2]++,namespace.app==="-")){cov_1ks4ntaci2().b[153][0]++;cov_1ks4ntaci2().s[569]++;throw new Error("Configurations requires a non-wildcard owner/app");}else{cov_1ks4ntaci2().b[153][1]++;}cov_1ks4ntaci2().s[570]++;this._super(service,this.path(),namespace);},/** + * Creates a configuration file. + * + * @example + * + * var configurations = service.configurations(); + * configurations.create("myprops", function(err, newFile) { + * console.log("CREATED"); + * }); + * + * @param {String} filename A name for this configuration file. + * @param {Function} callback A function to call with the new configuration file: `(err, createdFile)`. + * + * @endpoint properties + * @method splunkjs.Service.Configurations + */create:function(filename,callback){cov_1ks4ntaci2().f[183]++;cov_1ks4ntaci2().s[571]++;// If someone called us with the default style of (params, callback), +// lets make it work +if(utils.isObject(filename)){cov_1ks4ntaci2().b[155][0]++;cov_1ks4ntaci2().s[572]++;filename=filename["__conf"];}else{cov_1ks4ntaci2().b[155][1]++;}cov_1ks4ntaci2().s[573]++;callback=(cov_1ks4ntaci2().b[156][0]++,callback)||(cov_1ks4ntaci2().b[156][1]++,function(){cov_1ks4ntaci2().f[184]++;});var that=(cov_1ks4ntaci2().s[574]++,this);var req=(cov_1ks4ntaci2().s[575]++,this.post("",{__conf:filename},function(err,response){cov_1ks4ntaci2().f[185]++;cov_1ks4ntaci2().s[576]++;if(err){cov_1ks4ntaci2().b[157][0]++;cov_1ks4ntaci2().s[577]++;callback(err);}else{cov_1ks4ntaci2().b[157][1]++;var entity=(cov_1ks4ntaci2().s[578]++,new root.ConfigurationFile(that.service,filename));cov_1ks4ntaci2().s[579]++;entity.fetch(function(){cov_1ks4ntaci2().f[186]++;cov_1ks4ntaci2().s[580]++;if(req.wasAborted){cov_1ks4ntaci2().b[158][0]++;cov_1ks4ntaci2().s[581]++;return;// aborted, so ignore +}else{cov_1ks4ntaci2().b[158][1]++;cov_1ks4ntaci2().s[582]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[583]++;return req;},doesFileExist:async function(filename){cov_1ks4ntaci2().f[187]++;cov_1ks4ntaci2().s[584]++;try{var that=(cov_1ks4ntaci2().s[585]++,this);// 1. Fetch files list +var response=(cov_1ks4ntaci2().s[586]++,await this.get_v2("",{__conf:filename}));// 2. Filter the files +var files=(cov_1ks4ntaci2().s[587]++,response?.body?.entry?.filter(f=>{cov_1ks4ntaci2().f[188]++;cov_1ks4ntaci2().s[588]++;return f.name===filename;}));// 2. Check if the file exists +cov_1ks4ntaci2().s[589]++;if((cov_1ks4ntaci2().b[160][0]++,files)&&(cov_1ks4ntaci2().b[160][1]++,files.length==0)){cov_1ks4ntaci2().b[159][0]++;cov_1ks4ntaci2().s[590]++;return{code:"FILE_NOT_FOUND",message:`File with the name '${filename}' does not exist.`};}else{cov_1ks4ntaci2().b[159][1]++;}// 3. Create a local instance +var configurationFile=(cov_1ks4ntaci2().s[591]++,new root.ConfigurationFile(that.service,filename));// 4. Load the file content +var fetchedFile=(cov_1ks4ntaci2().s[592]++,await configurationFile.fetch_v2());cov_1ks4ntaci2().s[593]++;return{file:fetchedFile};}catch(error){cov_1ks4ntaci2().s[594]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},doesStanzaExist:async function(file,stanza){cov_1ks4ntaci2().f[189]++;cov_1ks4ntaci2().s[595]++;try{// 1. check if the stanza exists +var fetchedStanza=(cov_1ks4ntaci2().s[596]++,file.item(stanza));cov_1ks4ntaci2().s[597]++;if(!fetchedStanza){cov_1ks4ntaci2().b[161][0]++;cov_1ks4ntaci2().s[598]++;return{code:"STANZA_NOT_FOUND",message:`Stanza with the name '${stanza}' does not exist.`};}else{cov_1ks4ntaci2().b[161][1]++;cov_1ks4ntaci2().s[599]++;return{stanza:fetchedStanza};}}catch(error){cov_1ks4ntaci2().s[600]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},create_v2:async function(configs,svc,filename,stanza,keyValueMap,callback){cov_1ks4ntaci2().f[190]++;cov_1ks4ntaci2().s[601]++;callback=(cov_1ks4ntaci2().b[162][0]++,callback)||(cov_1ks4ntaci2().b[162][1]++,function(){cov_1ks4ntaci2().f[191]++;});var that=(cov_1ks4ntaci2().s[602]++,this);// 1. Check if the file exists +var doesFileExistResponse=(cov_1ks4ntaci2().s[603]++,await this.doesFileExist(filename));var configFile=(cov_1ks4ntaci2().s[604]++,doesFileExistResponse.file);// 2. If the file doesn't exist, create a new file +cov_1ks4ntaci2().s[605]++;if(!configFile){cov_1ks4ntaci2().b[163][0]++;cov_1ks4ntaci2().s[606]++;console.log(doesFileExistResponse);cov_1ks4ntaci2().s[607]++;console.log("Creating a new configuration file...");cov_1ks4ntaci2().s[608]++;that.create({__conf:filename},(err,newFile)=>{cov_1ks4ntaci2().f[192]++;cov_1ks4ntaci2().s[609]++;return console.log(`Configuration File created: ${filename}`);});cov_1ks4ntaci2().s[610]++;configFile=new root.ConfigurationFile(that.service,filename);cov_1ks4ntaci2().s[611]++;configFile=await configFile.fetch_v2();}else{cov_1ks4ntaci2().b[163][1]++;}// 2. Check if the stanza exists +var doesStanzaExistResponse=(cov_1ks4ntaci2().s[612]++,await this.doesStanzaExist(configFile,stanza));var configStanza=(cov_1ks4ntaci2().s[613]++,doesStanzaExistResponse.stanza);// 3. If the stanza doesn't exist, create a new stanza with given keyValueMap +cov_1ks4ntaci2().s[614]++;if(!configStanza){cov_1ks4ntaci2().b[164][0]++;cov_1ks4ntaci2().s[615]++;console.log(doesStanzaExistResponse);cov_1ks4ntaci2().s[616]++;console.log("Creating a new configuration stanza...");cov_1ks4ntaci2().s[617]++;configFile.create(stanza,keyValueMap,function(err,newStanza){cov_1ks4ntaci2().f[193]++;cov_1ks4ntaci2().s[618]++;console.log(`Configuration Stanza created: ${stanza}`);cov_1ks4ntaci2().s[619]++;callback();});}// 4. If the stanza exists, update it with the keyValueMap +else{cov_1ks4ntaci2().b[164][1]++;cov_1ks4ntaci2().s[620]++;configStanza.update(keyValueMap,(err,updatedStanza)=>{cov_1ks4ntaci2().f[194]++;cov_1ks4ntaci2().s[621]++;console.log(`Configuration Stanza updated: ${stanza}`);cov_1ks4ntaci2().s[622]++;callback();});}}});/** + * Represents a specific search job. You can perform different operations + * on this job, such as reading its status, canceling it, and getting results. + * + * @endpoint search/jobs/{search_id} + * @class splunkjs.Service.Job + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[623]++;root.Job=root.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Job + */path:function(){cov_1ks4ntaci2().f[195]++;cov_1ks4ntaci2().s[624]++;return Paths.jobs+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.Job`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} sid The search ID for this search job. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. + * + * @method splunkjs.Service.Job + */init:function(service,sid,namespace){cov_1ks4ntaci2().f[196]++;cov_1ks4ntaci2().s[625]++;this.name=sid;cov_1ks4ntaci2().s[626]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[627]++;this.sid=sid;// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[628]++;this.cancel=utils.bind(this,this.cancel);cov_1ks4ntaci2().s[629]++;this.disablePreview=utils.bind(this,this.disablePreview);cov_1ks4ntaci2().s[630]++;this.enablePreview=utils.bind(this,this.enablePreview);cov_1ks4ntaci2().s[631]++;this.events=utils.bind(this,this.events);cov_1ks4ntaci2().s[632]++;this.finalize=utils.bind(this,this.finalize);cov_1ks4ntaci2().s[633]++;this.pause=utils.bind(this,this.pause);cov_1ks4ntaci2().s[634]++;this.preview=utils.bind(this,this.preview);cov_1ks4ntaci2().s[635]++;this.results=utils.bind(this,this.results);cov_1ks4ntaci2().s[636]++;this.searchlog=utils.bind(this,this.searchlog);cov_1ks4ntaci2().s[637]++;this.setPriority=utils.bind(this,this.setPriority);cov_1ks4ntaci2().s[638]++;this.setTTL=utils.bind(this,this.setTTL);cov_1ks4ntaci2().s[639]++;this.summary=utils.bind(this,this.summary);cov_1ks4ntaci2().s[640]++;this.timeline=utils.bind(this,this.timeline);cov_1ks4ntaci2().s[641]++;this.touch=utils.bind(this,this.touch);cov_1ks4ntaci2().s[642]++;this.unpause=utils.bind(this,this.unpause);},/** + * Cancels a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.cancel(function(err) { + * console.log("CANCELLED"); + * }); + * + * @param {Function} callback A function to call when the search is done: `(err)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */cancel:function(callback){cov_1ks4ntaci2().f[197]++;var req=(cov_1ks4ntaci2().s[643]++,this.post("control",{action:"cancel"},callback));cov_1ks4ntaci2().s[644]++;return req;},/** + * Disables preview generation for a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.disablePreview(function(err, job) { + * console.log("PREVIEW DISABLED"); + * }); + * + * @param {Function} callback A function to call with this search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */disablePreview:function(callback){cov_1ks4ntaci2().f[198]++;cov_1ks4ntaci2().s[645]++;callback=(cov_1ks4ntaci2().b[165][0]++,callback)||(cov_1ks4ntaci2().b[165][1]++,function(){cov_1ks4ntaci2().f[199]++;});var that=(cov_1ks4ntaci2().s[646]++,this);var req=(cov_1ks4ntaci2().s[647]++,this.post("control",{action:"disablepreview"},function(err){cov_1ks4ntaci2().f[200]++;cov_1ks4ntaci2().s[648]++;callback(err,that);}));cov_1ks4ntaci2().s[649]++;return req;},/** + * Enables preview generation for a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.disablePreview(function(err, job) { + * console.log("PREVIEW ENABLED"); + * }); + * + * @param {Function} callback A function to call with this search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */enablePreview:function(callback){cov_1ks4ntaci2().f[201]++;cov_1ks4ntaci2().s[650]++;callback=(cov_1ks4ntaci2().b[166][0]++,callback)||(cov_1ks4ntaci2().b[166][1]++,function(){cov_1ks4ntaci2().f[202]++;});var that=(cov_1ks4ntaci2().s[651]++,this);var req=(cov_1ks4ntaci2().s[652]++,this.post("control",{action:"enablepreview"},function(err){cov_1ks4ntaci2().f[203]++;cov_1ks4ntaci2().s[653]++;callback(err,that);}));cov_1ks4ntaci2().s[654]++;return req;},/** + * Returns the events of a search job with given parameters. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.events({count: 10}, function(err, events, job) { + * console.log("Fields: ", events.fields); + * }); + * + * @param {Object} params The parameters for retrieving events. For a list of available parameters, see the GET search/jobs/{search_id}/events endpoint in the REST API documentation. + * @param {Function} callback A function to call when the events are retrieved: `(err, events, job)`. + * + * @endpoint search/jobs/{search_id}/events + * @method splunkjs.Service.Job + */events:function(params,callback){cov_1ks4ntaci2().f[204]++;cov_1ks4ntaci2().s[655]++;callback=(cov_1ks4ntaci2().b[167][0]++,callback)||(cov_1ks4ntaci2().b[167][1]++,function(){cov_1ks4ntaci2().f[205]++;});cov_1ks4ntaci2().s[656]++;params=(cov_1ks4ntaci2().b[168][0]++,params)||(cov_1ks4ntaci2().b[168][1]++,{});cov_1ks4ntaci2().s[657]++;params.output_mode=(cov_1ks4ntaci2().b[169][0]++,params.output_mode)||(cov_1ks4ntaci2().b[169][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[658]++,this);cov_1ks4ntaci2().s[659]++;return this.get("events",params,function(err,response){cov_1ks4ntaci2().f[206]++;cov_1ks4ntaci2().s[660]++;if(err){cov_1ks4ntaci2().b[170][0]++;cov_1ks4ntaci2().s[661]++;callback(err);}else{cov_1ks4ntaci2().b[170][1]++;cov_1ks4ntaci2().s[662]++;callback(null,response.data,that);}});},/** + * Finalizes a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.finalize(function(err, job) { + * console.log("JOB FINALIZED"); + * }); + * + * @param {Function} callback A function to call with the job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */finalize:function(callback){cov_1ks4ntaci2().f[207]++;cov_1ks4ntaci2().s[663]++;callback=(cov_1ks4ntaci2().b[171][0]++,callback)||(cov_1ks4ntaci2().b[171][1]++,function(){cov_1ks4ntaci2().f[208]++;});var that=(cov_1ks4ntaci2().s[664]++,this);var req=(cov_1ks4ntaci2().s[665]++,this.post("control",{action:"finalize"},function(err){cov_1ks4ntaci2().f[209]++;cov_1ks4ntaci2().s[666]++;callback(err,that);}));cov_1ks4ntaci2().s[667]++;return req;},/** + * Returns an iterator over this search job's events or results. + * + * @param {String} type One of {"events", "preview", "results"}. + * @param {Object} params A dictionary of optional parameters: + * - `pagesize` (_integer_): The number of items to return on each request. Defaults to as many as possible. + * @return {Object} An iterator object with a `next(callback)` method, where `callback` is of the form `(err, results, hasMoreResults)`. + * + * @endpoint search/jobs/{search_id}/results + * @method splunkjs.Service.Job + */iterator:function(type,params){cov_1ks4ntaci2().f[210]++;cov_1ks4ntaci2().s[668]++;return new root.PaginatedEndpointIterator(this[type],params);},/** + * Pauses a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.pause(function(err, job) { + * console.log("JOB PAUSED"); + * }); + * + * @param {Function} callback A function to call with the job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */pause:function(callback){cov_1ks4ntaci2().f[211]++;cov_1ks4ntaci2().s[669]++;callback=(cov_1ks4ntaci2().b[172][0]++,callback)||(cov_1ks4ntaci2().b[172][1]++,function(){cov_1ks4ntaci2().f[212]++;});var that=(cov_1ks4ntaci2().s[670]++,this);var req=(cov_1ks4ntaci2().s[671]++,this.post("control",{action:"pause"},function(err){cov_1ks4ntaci2().f[213]++;cov_1ks4ntaci2().s[672]++;callback(err,that);}));cov_1ks4ntaci2().s[673]++;return req;},/* + * Gets the preview results for a search job with given parameters. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.preview({count: 10}, function(err, results, job) { + * console.log("Fields: ", results.fields); + * }); + * + * @param {Object} params The parameters for retrieving preview results. For a list of available parameters, see the GET search/jobs/{search_id}/results_preview endpoint in the REST API documentation. + * @param {Function} callback A function to call when the preview results are retrieved : `(err, results, job)`. + * + * @endpoint search/jobs/{search_id}/results_preview + * @method splunkjs.Service.Job + */preview:function(params,callback){cov_1ks4ntaci2().f[214]++;cov_1ks4ntaci2().s[674]++;callback=(cov_1ks4ntaci2().b[173][0]++,callback)||(cov_1ks4ntaci2().b[173][1]++,function(){cov_1ks4ntaci2().f[215]++;});cov_1ks4ntaci2().s[675]++;params=(cov_1ks4ntaci2().b[174][0]++,params)||(cov_1ks4ntaci2().b[174][1]++,{});cov_1ks4ntaci2().s[676]++;params.output_mode=(cov_1ks4ntaci2().b[175][0]++,params.output_mode)||(cov_1ks4ntaci2().b[175][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[677]++,this);cov_1ks4ntaci2().s[678]++;return this.get("results_preview",params,function(err,response){cov_1ks4ntaci2().f[216]++;cov_1ks4ntaci2().s[679]++;if(err){cov_1ks4ntaci2().b[176][0]++;cov_1ks4ntaci2().s[680]++;callback(err);}else{cov_1ks4ntaci2().b[176][1]++;cov_1ks4ntaci2().s[681]++;callback(null,response.data,that);}});},/** + * Gets the results for a search job with given parameters. + * + * The callback can get `undefined` for its `results` parameter if the + * job is not yet done. To avoid this, use the `Job.track()` method to + * wait until the job is complete prior to fetching the results with + * this method. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.results({count: 10}, function(err, results, job) { + * console.log("Fields: ", results.results); + * }); + * + * @param {Object} params The parameters for retrieving search results. For a list of available parameters, see the GET search/jobs/{search_id}/results endpoint in the REST API documentation. + * @param {Function} callback A function to call when the results are retrieved: `(err, results, job)`. + * + * @endpoint search/jobs/{search_id}/results + * @method splunkjs.Service.Job + */results:function(params,callback){cov_1ks4ntaci2().f[217]++;cov_1ks4ntaci2().s[682]++;callback=(cov_1ks4ntaci2().b[177][0]++,callback)||(cov_1ks4ntaci2().b[177][1]++,function(){cov_1ks4ntaci2().f[218]++;});cov_1ks4ntaci2().s[683]++;params=(cov_1ks4ntaci2().b[178][0]++,params)||(cov_1ks4ntaci2().b[178][1]++,{});cov_1ks4ntaci2().s[684]++;params.output_mode=(cov_1ks4ntaci2().b[179][0]++,params.output_mode)||(cov_1ks4ntaci2().b[179][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[685]++,this);cov_1ks4ntaci2().s[686]++;return this.get("results",params,function(err,response){cov_1ks4ntaci2().f[219]++;cov_1ks4ntaci2().s[687]++;if(err){cov_1ks4ntaci2().b[180][0]++;cov_1ks4ntaci2().s[688]++;callback(err);}else{cov_1ks4ntaci2().b[180][1]++;cov_1ks4ntaci2().s[689]++;callback(null,response.data,that);}});},/** + * Gets the search log for this search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.searchlog(function(err, searchlog, job) { + * console.log(searchlog); + * }); + * + * @param {Function} callback A function to call with the search log and job: `(err, searchlog, job)`. + * + * @endpoint search/jobs/{search_id}/search.log + * @method splunkjs.Service.Job + */searchlog:function(callback){cov_1ks4ntaci2().f[220]++;cov_1ks4ntaci2().s[690]++;callback=(cov_1ks4ntaci2().b[181][0]++,callback)||(cov_1ks4ntaci2().b[181][1]++,function(){cov_1ks4ntaci2().f[221]++;});var that=(cov_1ks4ntaci2().s[691]++,this);cov_1ks4ntaci2().s[692]++;return this.get("search.log",{},function(err,response){cov_1ks4ntaci2().f[222]++;cov_1ks4ntaci2().s[693]++;if(err){cov_1ks4ntaci2().b[182][0]++;cov_1ks4ntaci2().s[694]++;callback(err);}else{cov_1ks4ntaci2().b[182][1]++;cov_1ks4ntaci2().s[695]++;callback(null,response.data,that);}});},/** + * Sets the priority for this search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.setPriority(6, function(err, job) { + * console.log("JOB PRIORITY SET"); + * }); + * + * @param {Number} value The priority (an integer between 1-10). A higher value means a higher priority. + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */setPriority:function(value,callback){cov_1ks4ntaci2().f[223]++;cov_1ks4ntaci2().s[696]++;callback=(cov_1ks4ntaci2().b[183][0]++,callback)||(cov_1ks4ntaci2().b[183][1]++,function(){cov_1ks4ntaci2().f[224]++;});var that=(cov_1ks4ntaci2().s[697]++,this);var req=(cov_1ks4ntaci2().s[698]++,this.post("control",{action:"setpriority",priority:value},function(err){cov_1ks4ntaci2().f[225]++;cov_1ks4ntaci2().s[699]++;callback(err,that);}));cov_1ks4ntaci2().s[700]++;return req;},/** + * Sets the time to live (TTL) for the search job, which is the time before + * the search job expires after it has been completed and is still available. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.setTTL(1000, function(err, job) { + * console.log("JOB TTL SET"); + * }); + * + * @param {Number} value The time to live, in seconds. + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */setTTL:function(value,callback){cov_1ks4ntaci2().f[226]++;cov_1ks4ntaci2().s[701]++;callback=(cov_1ks4ntaci2().b[184][0]++,callback)||(cov_1ks4ntaci2().b[184][1]++,function(){cov_1ks4ntaci2().f[227]++;});var that=(cov_1ks4ntaci2().s[702]++,this);var req=(cov_1ks4ntaci2().s[703]++,this.post("control",{action:"setttl",ttl:value},function(err){cov_1ks4ntaci2().f[228]++;cov_1ks4ntaci2().s[704]++;callback(err,that);}));cov_1ks4ntaci2().s[705]++;return req;},/** + * Gets the summary for this search job with the given parameters. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.summary({top_count: 5}, function(err, summary, job) { + * console.log("Summary: ", summary); + * }); + * + * @param {Object} params The parameters for retrieving the summary. For a list of available parameters, see the GET search/jobs/{search_id}/summary endpoint in the REST API documentation. + * @param {Function} callback A function to call with the summary and search job: `(err, summary, job)`. + * + * @endpoint search/jobs/{search_id}/summmary + * @method splunkjs.Service.Job + */summary:function(params,callback){cov_1ks4ntaci2().f[229]++;cov_1ks4ntaci2().s[706]++;callback=(cov_1ks4ntaci2().b[185][0]++,callback)||(cov_1ks4ntaci2().b[185][1]++,function(){cov_1ks4ntaci2().f[230]++;});var that=(cov_1ks4ntaci2().s[707]++,this);cov_1ks4ntaci2().s[708]++;return this.get("summary",params,function(err,response){cov_1ks4ntaci2().f[231]++;cov_1ks4ntaci2().s[709]++;if(err){cov_1ks4ntaci2().b[186][0]++;cov_1ks4ntaci2().s[710]++;callback(err);}else{cov_1ks4ntaci2().b[186][1]++;cov_1ks4ntaci2().s[711]++;callback(null,response.data,that);}});},/** + * Gets the timeline for this search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.timeline({time_format: "%c"}, function(err, job, timeline) { + * console.log("Timeline: ", timeline); + * }); + * + * @param {Object} params The parameters for retrieving the timeline. For a list of available parameters, see the GET search/jobs/{search_id}/timeline endpoint in the REST API documentation. + * @param {Function} callback A function to call with the timeline and search job: `(err, timeline, job)`. + * + * @endpoint search/jobs/{search_id}/timeline + * @method splunkjs.Service.Job + */timeline:function(params,callback){cov_1ks4ntaci2().f[232]++;cov_1ks4ntaci2().s[712]++;callback=(cov_1ks4ntaci2().b[187][0]++,callback)||(cov_1ks4ntaci2().b[187][1]++,function(){cov_1ks4ntaci2().f[233]++;});var that=(cov_1ks4ntaci2().s[713]++,this);cov_1ks4ntaci2().s[714]++;return this.get("timeline",params,function(err,response){cov_1ks4ntaci2().f[234]++;cov_1ks4ntaci2().s[715]++;if(err){cov_1ks4ntaci2().b[188][0]++;cov_1ks4ntaci2().s[716]++;callback(err);}else{cov_1ks4ntaci2().b[188][1]++;cov_1ks4ntaci2().s[717]++;callback(null,response.data,that);}});},/** + * Touches a search job, which means extending the expiration time of + * the search to now plus the time to live (TTL). + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.touch(function(err) { + * console.log("JOB TOUCHED"); + * }); + * + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */touch:function(callback){cov_1ks4ntaci2().f[235]++;cov_1ks4ntaci2().s[718]++;callback=(cov_1ks4ntaci2().b[189][0]++,callback)||(cov_1ks4ntaci2().b[189][1]++,function(){cov_1ks4ntaci2().f[236]++;});var that=(cov_1ks4ntaci2().s[719]++,this);var req=(cov_1ks4ntaci2().s[720]++,this.post("control",{action:"touch"},function(err){cov_1ks4ntaci2().f[237]++;cov_1ks4ntaci2().s[721]++;callback(err,that);}));cov_1ks4ntaci2().s[722]++;return req;},/** + * Starts polling the status of this search job, and fires callbacks + * upon each status change. + * + * @param {Object} options A dictionary of optional parameters: + * - `period` (_integer_): The number of milliseconds to wait between each poll. Defaults to 500. + * @param {Object|Function} callbacks A dictionary of optional callbacks: + * - `ready`: A function `(job)` invoked when the job's properties first become available. + * - `progress`: A function `(job)` invoked whenever new job properties are available. + * - `done`: A function `(job)` invoked if the job completes successfully. No further polling is done. + * - `failed`: A function `(job)` invoked if the job fails executing on the server. No further polling is done. + * - `error`: A function `(err)` invoked if an error occurs while polling. No further polling is done. + * Or, if a function `(job)`, equivalent to passing it as a `done` callback. + * + * @method splunkjs.Service.Job + */track:function(options,callbacks){cov_1ks4ntaci2().f[238]++;var period=(cov_1ks4ntaci2().s[723]++,(cov_1ks4ntaci2().b[190][0]++,options.period)||(cov_1ks4ntaci2().b[190][1]++,500));// ms +cov_1ks4ntaci2().s[724]++;if(utils.isFunction(callbacks)){cov_1ks4ntaci2().b[191][0]++;cov_1ks4ntaci2().s[725]++;callbacks={done:callbacks};}else{cov_1ks4ntaci2().b[191][1]++;}var noCallbacksAfterReady=(cov_1ks4ntaci2().s[726]++,(cov_1ks4ntaci2().b[192][0]++,!callbacks.progress)&&(cov_1ks4ntaci2().b[192][1]++,!callbacks.done)&&(cov_1ks4ntaci2().b[192][2]++,!callbacks.failed)&&(cov_1ks4ntaci2().b[192][3]++,!callbacks.error));cov_1ks4ntaci2().s[727]++;callbacks.ready=(cov_1ks4ntaci2().b[193][0]++,callbacks.ready)||(cov_1ks4ntaci2().b[193][1]++,function(){cov_1ks4ntaci2().f[239]++;});cov_1ks4ntaci2().s[728]++;callbacks.progress=(cov_1ks4ntaci2().b[194][0]++,callbacks.progress)||(cov_1ks4ntaci2().b[194][1]++,function(){cov_1ks4ntaci2().f[240]++;});cov_1ks4ntaci2().s[729]++;callbacks.done=(cov_1ks4ntaci2().b[195][0]++,callbacks.done)||(cov_1ks4ntaci2().b[195][1]++,function(){cov_1ks4ntaci2().f[241]++;});cov_1ks4ntaci2().s[730]++;callbacks.failed=(cov_1ks4ntaci2().b[196][0]++,callbacks.failed)||(cov_1ks4ntaci2().b[196][1]++,function(){cov_1ks4ntaci2().f[242]++;});cov_1ks4ntaci2().s[731]++;callbacks.error=(cov_1ks4ntaci2().b[197][0]++,callbacks.error)||(cov_1ks4ntaci2().b[197][1]++,function(){cov_1ks4ntaci2().f[243]++;});// For use by tests only +cov_1ks4ntaci2().s[732]++;callbacks._preready=(cov_1ks4ntaci2().b[198][0]++,callbacks._preready)||(cov_1ks4ntaci2().b[198][1]++,function(){cov_1ks4ntaci2().f[244]++;});cov_1ks4ntaci2().s[733]++;callbacks._stoppedAfterReady=(cov_1ks4ntaci2().b[199][0]++,callbacks._stoppedAfterReady)||(cov_1ks4ntaci2().b[199][1]++,function(){cov_1ks4ntaci2().f[245]++;});var that=(cov_1ks4ntaci2().s[734]++,this);var emittedReady=(cov_1ks4ntaci2().s[735]++,false);var doneLooping=(cov_1ks4ntaci2().s[736]++,false);cov_1ks4ntaci2().s[737]++;Async.whilst(function(){cov_1ks4ntaci2().f[246]++;cov_1ks4ntaci2().s[738]++;return!doneLooping;},function(nextIteration){cov_1ks4ntaci2().f[247]++;cov_1ks4ntaci2().s[739]++;that.fetch(function(err,job){cov_1ks4ntaci2().f[248]++;cov_1ks4ntaci2().s[740]++;if(err){cov_1ks4ntaci2().b[200][0]++;cov_1ks4ntaci2().s[741]++;nextIteration(err);cov_1ks4ntaci2().s[742]++;return;}else{cov_1ks4ntaci2().b[200][1]++;}var dispatchState=(cov_1ks4ntaci2().s[743]++,job.properties().dispatchState);var notReady=(cov_1ks4ntaci2().s[744]++,(cov_1ks4ntaci2().b[201][0]++,dispatchState==="QUEUED")||(cov_1ks4ntaci2().b[201][1]++,dispatchState==="PARSING"));cov_1ks4ntaci2().s[745]++;if(notReady){cov_1ks4ntaci2().b[202][0]++;cov_1ks4ntaci2().s[746]++;callbacks._preready(job);}else{cov_1ks4ntaci2().b[202][1]++;cov_1ks4ntaci2().s[747]++;if(!emittedReady){cov_1ks4ntaci2().b[203][0]++;cov_1ks4ntaci2().s[748]++;callbacks.ready(job);cov_1ks4ntaci2().s[749]++;emittedReady=true;// Optimization: Don't keep polling the job if the +// caller only cares about the `ready` event. +cov_1ks4ntaci2().s[750]++;if(noCallbacksAfterReady){cov_1ks4ntaci2().b[204][0]++;cov_1ks4ntaci2().s[751]++;callbacks._stoppedAfterReady(job);cov_1ks4ntaci2().s[752]++;doneLooping=true;cov_1ks4ntaci2().s[753]++;nextIteration();cov_1ks4ntaci2().s[754]++;return;}else{cov_1ks4ntaci2().b[204][1]++;}}else{cov_1ks4ntaci2().b[203][1]++;}cov_1ks4ntaci2().s[755]++;callbacks.progress(job);var props=(cov_1ks4ntaci2().s[756]++,job.properties());cov_1ks4ntaci2().s[757]++;if((cov_1ks4ntaci2().b[206][0]++,dispatchState==="DONE")&&(cov_1ks4ntaci2().b[206][1]++,props.isDone)){cov_1ks4ntaci2().b[205][0]++;cov_1ks4ntaci2().s[758]++;callbacks.done(job);cov_1ks4ntaci2().s[759]++;doneLooping=true;cov_1ks4ntaci2().s[760]++;nextIteration();cov_1ks4ntaci2().s[761]++;return;}else{cov_1ks4ntaci2().b[205][1]++;cov_1ks4ntaci2().s[762]++;if((cov_1ks4ntaci2().b[208][0]++,dispatchState==="FAILED")&&(cov_1ks4ntaci2().b[208][1]++,props.isFailed)){cov_1ks4ntaci2().b[207][0]++;cov_1ks4ntaci2().s[763]++;callbacks.failed(job);cov_1ks4ntaci2().s[764]++;doneLooping=true;cov_1ks4ntaci2().s[765]++;nextIteration();cov_1ks4ntaci2().s[766]++;return;}else{cov_1ks4ntaci2().b[207][1]++;}}}cov_1ks4ntaci2().s[767]++;Async.sleep(period,nextIteration);});},function(err){cov_1ks4ntaci2().f[249]++;cov_1ks4ntaci2().s[768]++;if(err){cov_1ks4ntaci2().b[209][0]++;cov_1ks4ntaci2().s[769]++;callbacks.error(err);}else{cov_1ks4ntaci2().b[209][1]++;}});},/** + * Resumes a search job. + * + * @example + * + * var job = service.jobs().item("mysid"); + * job.unpause(function(err) { + * console.log("JOB UNPAUSED"); + * }); + * + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @endpoint search/jobs/{search_id}/control + * @method splunkjs.Service.Job + */unpause:function(callback){cov_1ks4ntaci2().f[250]++;cov_1ks4ntaci2().s[770]++;callback=(cov_1ks4ntaci2().b[210][0]++,callback)||(cov_1ks4ntaci2().b[210][1]++,function(){cov_1ks4ntaci2().f[251]++;});var that=(cov_1ks4ntaci2().s[771]++,this);var req=(cov_1ks4ntaci2().s[772]++,this.post("control",{action:"unpause"},function(err){cov_1ks4ntaci2().f[252]++;cov_1ks4ntaci2().s[773]++;callback(err,that);}));cov_1ks4ntaci2().s[774]++;return req;}});/** + * Represents a collection of search jobs. You can create and list search + * jobs using this collection container, or get a specific search job. + * + * @endpoint search/jobs + * @class splunkjs.Service.Jobs + * @extends splunkjs.Service.Collection + */cov_1ks4ntaci2().s[775]++;root.Jobs=root.Collection.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.Jobs + */path:function(){cov_1ks4ntaci2().f[253]++;cov_1ks4ntaci2().s[776]++;return Paths.jobs;},/** + * Creates a local instance of a job. + * + * @param {Object} props The properties for this new job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. + * + * @method splunkjs.Service.Jobs + */instantiateEntity:function(props){cov_1ks4ntaci2().f[254]++;var sid=(cov_1ks4ntaci2().s[777]++,props.content.sid);var entityNamespace=(cov_1ks4ntaci2().s[778]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[779]++;return new root.Job(this.service,sid,entityNamespace);},/** + * Constructor for `splunkjs.Service.Jobs`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {Object} namespace Namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @return {splunkjs.Service.Jobs} A new `splunkjs.Service.Jobs` instance. + * + * @method splunkjs.Service.Jobs + */init:function(service,namespace){cov_1ks4ntaci2().f[255]++;cov_1ks4ntaci2().s[780]++;this._super(service,this.path(),namespace);// We perform the bindings so that every function works +// properly when it is passed as a callback. +cov_1ks4ntaci2().s[781]++;this.create=utils.bind(this,this.create);},/** + * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: + * + * - Use `exec_mode=normal` to return a search job ID immediately (default). + * Poll for completion to find out when you can retrieve search results. + * + * - Use `exec_mode=blocking` to return the search job ID when the search has finished. + * + * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * @param {Function} callback A function to call with the created job: `(err, createdJob)`. + * + * @endpoint search/jobs + * @method splunkjs.Service.Jobs + */create:function(query,params,callback){cov_1ks4ntaci2().f[256]++;cov_1ks4ntaci2().s[782]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[212][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[212][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[212][2]++,!callback)){cov_1ks4ntaci2().b[211][0]++;cov_1ks4ntaci2().s[783]++;callback=params;cov_1ks4ntaci2().s[784]++;params=query;cov_1ks4ntaci2().s[785]++;query=params.search;}else{cov_1ks4ntaci2().b[211][1]++;}cov_1ks4ntaci2().s[786]++;callback=(cov_1ks4ntaci2().b[213][0]++,callback)||(cov_1ks4ntaci2().b[213][1]++,function(){cov_1ks4ntaci2().f[257]++;});cov_1ks4ntaci2().s[787]++;params=(cov_1ks4ntaci2().b[214][0]++,params)||(cov_1ks4ntaci2().b[214][1]++,{});cov_1ks4ntaci2().s[788]++;params.search=query;cov_1ks4ntaci2().s[789]++;if(((cov_1ks4ntaci2().b[216][0]++,params.exec_mode)||(cov_1ks4ntaci2().b[216][1]++,"")).toLowerCase()==="oneshot"){cov_1ks4ntaci2().b[215][0]++;cov_1ks4ntaci2().s[790]++;throw new Error("Please use splunkjs.Service.Jobs.oneshotSearch for exec_mode=oneshot");}else{cov_1ks4ntaci2().b[215][1]++;}cov_1ks4ntaci2().s[791]++;if(!params.search){cov_1ks4ntaci2().b[217][0]++;cov_1ks4ntaci2().s[792]++;callback("Must provide a query to create a search job");cov_1ks4ntaci2().s[793]++;return;}else{cov_1ks4ntaci2().b[217][1]++;}var that=(cov_1ks4ntaci2().s[794]++,this);cov_1ks4ntaci2().s[795]++;return this.post("",params,function(err,response){cov_1ks4ntaci2().f[258]++;cov_1ks4ntaci2().s[796]++;if(err){cov_1ks4ntaci2().b[218][0]++;cov_1ks4ntaci2().s[797]++;callback(err);}else{cov_1ks4ntaci2().b[218][1]++;var job=(cov_1ks4ntaci2().s[798]++,new root.Job(that.service,response.data.sid,that.namespace));cov_1ks4ntaci2().s[799]++;callback(null,job);}});},/** + * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: + * + * - Use `exec_mode=normal` to return a search job ID immediately (default). + * Poll for completion to find out when you can retrieve search results. + * + * - Use `exec_mode=blocking` to return the search job ID when the search has finished. + * + * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. + * + * @example + * + * var jobs = service.jobs(); + * jobs.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { + * console.log("CREATED": newJob.sid); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {Function} callback A function to call with the new search job: `(err, createdJob)`. + * + * @endpoint search/jobs + * @method splunkjs.Service.Jobs + */search:function(query,params,callback){cov_1ks4ntaci2().f[259]++;cov_1ks4ntaci2().s[800]++;return this.create(query,params,callback);},/** + * Creates a oneshot search from a given search query and parameters. + * + * @example + * + * var jobs = service.jobs(); + * jobs.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { + * console.log("RESULT FIELDS": results.fields); + * }); + * + * @param {String} query The search query. + * @param {Object} params A dictionary of properties for the search: + * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). + * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. + * - `rf` (_string_): Specifies one or more fields to add to the search. + * @param {Function} callback A function to call with the results of the search: `(err, results)`. + * + * @endpoint search/jobs + * @method splunkjs.Service.Jobs + */oneshotSearch:function(query,params,callback){cov_1ks4ntaci2().f[260]++;cov_1ks4ntaci2().s[801]++;// If someone called us with the default style of (params, callback), +// lets make it work +if((cov_1ks4ntaci2().b[220][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[220][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[220][2]++,!callback)){cov_1ks4ntaci2().b[219][0]++;cov_1ks4ntaci2().s[802]++;callback=params;cov_1ks4ntaci2().s[803]++;params=query;cov_1ks4ntaci2().s[804]++;query=params.search;}else{cov_1ks4ntaci2().b[219][1]++;}cov_1ks4ntaci2().s[805]++;callback=(cov_1ks4ntaci2().b[221][0]++,callback)||(cov_1ks4ntaci2().b[221][1]++,function(){cov_1ks4ntaci2().f[261]++;});cov_1ks4ntaci2().s[806]++;params=(cov_1ks4ntaci2().b[222][0]++,params)||(cov_1ks4ntaci2().b[222][1]++,{});cov_1ks4ntaci2().s[807]++;params.search=query;cov_1ks4ntaci2().s[808]++;params.exec_mode="oneshot";cov_1ks4ntaci2().s[809]++;if(!params.search){cov_1ks4ntaci2().b[223][0]++;cov_1ks4ntaci2().s[810]++;callback("Must provide a query to create a search job");}else{cov_1ks4ntaci2().b[223][1]++;}var outputMode=(cov_1ks4ntaci2().s[811]++,(cov_1ks4ntaci2().b[224][0]++,params.output_mode)||(cov_1ks4ntaci2().b[224][1]++,"json_rows"));var path=(cov_1ks4ntaci2().s[812]++,this.qualifiedPath);var method=(cov_1ks4ntaci2().s[813]++,"POST");var headers=(cov_1ks4ntaci2().s[814]++,{});var post=(cov_1ks4ntaci2().s[815]++,params);var get=(cov_1ks4ntaci2().s[816]++,{output_mode:outputMode});var body=(cov_1ks4ntaci2().s[817]++,null);var req=(cov_1ks4ntaci2().s[818]++,this.service.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[262]++;cov_1ks4ntaci2().s[819]++;if(err){cov_1ks4ntaci2().b[225][0]++;cov_1ks4ntaci2().s[820]++;callback(err);}else{cov_1ks4ntaci2().b[225][1]++;cov_1ks4ntaci2().s[821]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[822]++;return req;}});/** + * Represents a field of a data model object. + * This is a helper class for `DataModelCalculation` + * and `DataModelObject`. + * + * Has these properties: + * - `fieldName` (_string_): The name of this field. + * - `displayName` (_string_): A human readable name for this field. + * - `type` (_string_): The type of this field. + * - `multivalued` (_boolean_): Whether this field is multivalued. + * - `required` (_boolean_): Whether this field is required. + * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. + * - `editable` (_boolean_): Whether this field can be edited. + * - `comment` (_string_): A comment for this field, or `null` if there isn't one. + * - `fieldSearch` (_string_): A search query fragment for this field. + * - `lineage` (_array_): An array of strings of the lineage of the data model + * on which this field is defined. + * - `owner` (_string_): The name of the data model object on which this field is defined. + * + * Possible types for a data model field: + * - `string` + * - `boolean` + * - `number` + * - `timestamp` + * - `objectCount` + * - `childCount` + * - `ipv4` + * + * @class splunkjs.Service.DataModelField + */cov_1ks4ntaci2().s[823]++;root.DataModelField=Class.extend({_types:["string","number","timestamp","objectCount","childCount","ipv4","boolean"],/** + * Constructor for a data model field. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `fieldName` (_string_): The name of this field. + * - `displayName` (_string_): A human readable name for this field. + * - `type` (_string_): The type of this field, see valid types in class docs. + * - `multivalue` (_boolean_): Whether this field is multivalued. + * - `required` (_boolean_): Whether this field is required on events in the object + * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. + * - `editable` (_boolean_): Whether this field can be edited. + * - `comment` (_string_): A comment for this field, or `null` if there isn't one. + * - `fieldSearch` (_string_): A search query fragment for this field. + * - `lineage` (_string_): The lineage of the data model object on which this field + * is defined, items are delimited by a dot. This is converted into an array of + * strings upon construction. + * + * @method splunkjs.Service.DataModelField + */init:function(props){cov_1ks4ntaci2().f[263]++;cov_1ks4ntaci2().s[824]++;props=(cov_1ks4ntaci2().b[226][0]++,props)||(cov_1ks4ntaci2().b[226][1]++,{});cov_1ks4ntaci2().s[825]++;props.owner=(cov_1ks4ntaci2().b[227][0]++,props.owner)||(cov_1ks4ntaci2().b[227][1]++,"");cov_1ks4ntaci2().s[826]++;this.name=props.fieldName;cov_1ks4ntaci2().s[827]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[828]++;this.type=props.type;cov_1ks4ntaci2().s[829]++;this.multivalued=props.multivalue;cov_1ks4ntaci2().s[830]++;this.required=props.required;cov_1ks4ntaci2().s[831]++;this.hidden=props.hidden;cov_1ks4ntaci2().s[832]++;this.editable=props.editable;cov_1ks4ntaci2().s[833]++;this.comment=(cov_1ks4ntaci2().b[228][0]++,props.comment)||(cov_1ks4ntaci2().b[228][1]++,null);cov_1ks4ntaci2().s[834]++;this.fieldSearch=props.fieldSearch;cov_1ks4ntaci2().s[835]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[836]++;this.owner=this.lineage[this.lineage.length-1];},/** + * Is this data model field of type string? + * + * @return {Boolean} True if this data model field is of type string. + * + * @method splunkjs.Service.DataModelField + */isString:function(){cov_1ks4ntaci2().f[264]++;cov_1ks4ntaci2().s[837]++;return"string"===this.type;},/** + * Is this data model field of type number? + * + * @return {Boolean} True if this data model field is of type number. + * + * @method splunkjs.Service.DataModelField + */isNumber:function(){cov_1ks4ntaci2().f[265]++;cov_1ks4ntaci2().s[838]++;return"number"===this.type;},/** + * Is this data model field of type timestamp? + * + * @return {Boolean} True if this data model field is of type timestamp. + * + * @method splunkjs.Service.DataModelField + */isTimestamp:function(){cov_1ks4ntaci2().f[266]++;cov_1ks4ntaci2().s[839]++;return"timestamp"===this.type;},/** + * Is this data model field of type object count? + * + * @return {Boolean} True if this data model field is of type object count. + * + * @method splunkjs.Service.DataModelField + */isObjectcount:function(){cov_1ks4ntaci2().f[267]++;cov_1ks4ntaci2().s[840]++;return"objectCount"===this.type;},/** + * Is this data model field of type child count? + * + * @return {Boolean} True if this data model field is of type child count. + * + * @method splunkjs.Service.DataModelField + */isChildcount:function(){cov_1ks4ntaci2().f[268]++;cov_1ks4ntaci2().s[841]++;return"childCount"===this.type;},/** + * Is this data model field of type ipv4? + * + * @return {Boolean} True if this data model field is of type ipv4. + * + * @method splunkjs.Service.DataModelField + */isIPv4:function(){cov_1ks4ntaci2().f[269]++;cov_1ks4ntaci2().s[842]++;return"ipv4"===this.type;},/** + * Is this data model field of type boolean? + * + * @return {Boolean} True if this data model field is of type boolean. + * + * @method splunkjs.Service.DataModelField + */isBoolean:function(){cov_1ks4ntaci2().f[270]++;cov_1ks4ntaci2().s[843]++;return"boolean"===this.type;}});/** + * Represents a constraint on a `DataModelObject` or a `DataModelField`. + * + * Has these properties: + * - `query` (_string_): The search query defining this data model constraint. + * - `lineage` (_array_): The lineage of this data model constraint. + * - `owner` (_string_): The name of the data model object that owns + * this data model constraint. + * + * @class splunkjs.Service.DataModelConstraint + */cov_1ks4ntaci2().s[844]++;root.DataModelConstraint=Class.extend({/** + * Constructor for a data model constraint. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `search` (_string_): The Splunk search query this constraint specifies. + * - `owner` (_string_): The lineage of the data model object that owns this + * constraint, items are delimited by a dot. This is converted into + * an array of strings upon construction. + * + * @method splunkjs.Service.DataModelConstraint + */init:function(props){cov_1ks4ntaci2().f[271]++;cov_1ks4ntaci2().s[845]++;props=(cov_1ks4ntaci2().b[229][0]++,props)||(cov_1ks4ntaci2().b[229][1]++,{});cov_1ks4ntaci2().s[846]++;props.owner=(cov_1ks4ntaci2().b[230][0]++,props.owner)||(cov_1ks4ntaci2().b[230][1]++,"");cov_1ks4ntaci2().s[847]++;this.query=props.search;cov_1ks4ntaci2().s[848]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[849]++;this.owner=this.lineage[this.lineage.length-1];}});/** + * Used for specifying a calculation on a `DataModelObject`. + * + * Has these properties: + * - `id` (_string_): The ID for this data model calculation. + * - `type` (_string_): The type of this data model calculation. + * - `comment` (_string_|_null_): The comment for this data model calculation, or `null`. + * - `editable` (_boolean_): True if this calculation can be edited, false otherwise. + * - `lineage` (_array_): The lineage of the data model object on which this calculation + * is defined in an array of strings. + * - `owner` (_string_): The data model that this calculation belongs to. + * - `outputFields` (_array_): The fields output by this calculation. + * + * The Rex and Eval types have an additional property: + * - `expression` (_string_): The expression to use for this calculation. + * + * The Rex and GeoIP types have an additional property: + * - `inputField` (_string_): The field to use for calculation. + * + * The Lookup type has additional properties: + * - `lookupName` (_string_): The name of the lookup to perform. + * - `inputFieldMappings` (_object_): The mappings from fields in the events to fields in the lookup. + * + * Valid types of calculations are: + * - `Lookup` + * - `Eval` + * - `GeoIP` + * - `Rex` + * + * @class splunkjs.Service.DataModelCalculation + */cov_1ks4ntaci2().s[850]++;root.DataModelCalculation=Class.extend({_types:["Lookup","Eval","GeoIP","Rex"],/** + * Constructor for a data model calculation. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `calculationID` (_string_): The ID of this calculation. + * - `calculationType` (_string_): The type of this calculation, see class docs for valid types. + * - `editable` (_boolean_): Whether this calculation can be edited. + * - `comment` (_string_): A comment for this calculation, or `null` if there isn't one. + * - `owner` (_string_): The lineage of the data model object on which this calculation + * is defined, items are delimited by a dot. This is converted into an array of + * strings upon construction. + * - `outputFields` (_array_): An array of the fields this calculation generates. + * - `expression` (_string_): The expression to use for this calculation; exclusive to `Eval` and `Rex` calculations (optional) + * - `inputField` (_string_): The field to use for calculation; exclusive to `GeoIP` and `Rex` calculations (optional) + * - `lookupName` (_string_): The name of the lookup to perform; exclusive to `Lookup` calculations (optional) + * - `inputFieldMappings` (_array_): One element array containing an object with the mappings from fields in the events to fields + * in the lookup; exclusive to `Lookup` calculations (optional) + * + * @method splunkjs.Service.DataModelCalculation + */init:function(props){cov_1ks4ntaci2().f[272]++;cov_1ks4ntaci2().s[851]++;props=(cov_1ks4ntaci2().b[231][0]++,props)||(cov_1ks4ntaci2().b[231][1]++,{});cov_1ks4ntaci2().s[852]++;props.owner=(cov_1ks4ntaci2().b[232][0]++,props.owner)||(cov_1ks4ntaci2().b[232][1]++,"");cov_1ks4ntaci2().s[853]++;this.id=props.calculationID;cov_1ks4ntaci2().s[854]++;this.type=props.calculationType;cov_1ks4ntaci2().s[855]++;this.comment=(cov_1ks4ntaci2().b[233][0]++,props.comment)||(cov_1ks4ntaci2().b[233][1]++,null);cov_1ks4ntaci2().s[856]++;this.editable=props.editable;cov_1ks4ntaci2().s[857]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[858]++;this.owner=this.lineage[this.lineage.length-1];cov_1ks4ntaci2().s[859]++;this.outputFields=[];cov_1ks4ntaci2().s[860]++;for(var i=(cov_1ks4ntaci2().s[861]++,0);iSearch job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {Function} callback A function to call when done creating the search job: `(err, job)`. + * @method splunkjs.Service.Pivot + */run:function(args,callback){cov_1ks4ntaci2().f[280]++;cov_1ks4ntaci2().s[884]++;if(utils.isUndefined(callback)){cov_1ks4ntaci2().b[240][0]++;cov_1ks4ntaci2().s[885]++;callback=args;cov_1ks4ntaci2().s[886]++;args={};}else{cov_1ks4ntaci2().b[240][1]++;}cov_1ks4ntaci2().s[887]++;if((cov_1ks4ntaci2().b[242][0]++,!args)||(cov_1ks4ntaci2().b[242][1]++,Object.keys(args).length===0)){cov_1ks4ntaci2().b[241][0]++;cov_1ks4ntaci2().s[888]++;args={};}else{cov_1ks4ntaci2().b[241][1]++;}// If tstats is undefined, use pivotSearch (try to run an accelerated search if possible) +cov_1ks4ntaci2().s[889]++;this.service.search((cov_1ks4ntaci2().b[243][0]++,this.tstatsSearch)||(cov_1ks4ntaci2().b[243][1]++,this.pivotSearch),args,callback);}});/** + * PivotSpecification represents a pivot to be done on a particular data model object. + * The user creates a PivotSpecification on some data model object, adds filters, row splits, + * column splits, and cell values, then calls the pivot method to query splunkd and + * get a set of SPL queries corresponding to this specification. + * + * Call the `pivot` method to query Splunk for SPL queries corresponding to this pivot. + * + * This class supports a fluent API, each function except `init`, `toJsonObject` & `pivot` + * return the modified `splunkjs.Service.PivotSpecification` instance. + * + * @example + * service.dataModels().fetch(function(err, dataModels) { + * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); + * var pivotSpecification = searches.createPivotSpecification(); + * pivotSpecification + * .addRowSplit("user", "Executing user") + * .addRangeColumnSplit("exec_time", {limit: 4}) + * .addCellValue("search", "Search Query", "values") + * .pivot(function(err, pivot) { + * console.log("Got a Pivot object from the Splunk server!"); + * }); + * }); + * + * Has these properties: + * - `dataModelObject` (_splunkjs.Service.DataModelObject_): The `DataModelObject` from which + * this `PivotSpecification` was created. + * - `columns` (_array_): The column splits on this `PivotSpecification`. + * - `rows` (_array_): The row splits on this `PivotSpecification`. + * - `filters` (_array_): The filters on this `PivotSpecification`. + * - `cells` (_array_): The cell aggregations for this`PivotSpecification`. + * - `accelerationNamespace` (_string_|_null_): The name of the `DataModel` that owns the `DataModelObject` + * on which this `PivotSpecification` was created if the `DataModel` is accelerated. Alternatively, + * you can set this property manually to the sid of an acceleration job in the format `sid=`. + * + * Valid comparison types are: + * - `boolean` + * - `string` + * - `number` + * - `ipv4` + * + * Valid boolean comparisons are: + * - `=` + * - `is` + * - `isNull` + * - `isNotNull` + * + * Valid string comparisons are: + * - `=` + * - `is` + * - `isNull` + * - `isNotNull` + * - `contains` + * - `doesNotContain` + * - `startsWith` + * - `endsWith` + * - `regex` + * + * Valid number comparisons are: + * - `=` + * - `!=` + * - `<` + * - `>` + * - `<=` + * - `>=` + * - `is` + * - `isNull` + * - `isNotNull` + * + * Valid ipv4 comparisons are: + * - `is` + * - `isNull` + * - `isNotNull` + * - `contains` + * - `doesNotContain` + * - `startsWith` + * + * Valid binning values are: + * - `auto` + * - `year` + * - `month` + * - `day` + * - `hour` + * - `minute` + * - `second` + * + * Valid sort directions are: + * - `ASCENDING` + * - `DECENDING` + * - `DEFAULT` + * + * Valid stats functions are: + * - `list` + * - `values` + * - `first` + * - `last` + * - `count` + * - `dc` + * - `sum` + * - `average` + * - `max` + * - `min` + * - `stdev` + * - `duration` + * - `earliest` + * - `latest` + * + * @class splunkjs.Service.PivotSpecification + */cov_1ks4ntaci2().s[890]++;root.PivotSpecification=Class.extend({_comparisons:{boolean:["=","is","isNull","isNotNull"],string:["=","is","isNull","isNotNull","contains","doesNotContain","startsWith","endsWith","regex"],number:["=","!=","<",">","<=",">=","is","isNull","isNotNull"],ipv4:["is","isNull","isNotNull","contains","doesNotContain","startsWith"]},_binning:["auto","year","month","day","hour","minute","second"],_sortDirection:["ASCENDING","DESCENDING","DEFAULT"],_statsFunctions:["list","values","first","last","count","dc","sum","average","max","min","stdev","duration","earliest","latest"],/** + * Constructor for a pivot specification. + * + * @constructor + * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. + * + * @method splunkjs.Service.PivotSpecification + */init:function(dataModelObject){cov_1ks4ntaci2().f[281]++;cov_1ks4ntaci2().s[891]++;this.dataModelObject=dataModelObject;cov_1ks4ntaci2().s[892]++;this.columns=[];cov_1ks4ntaci2().s[893]++;this.rows=[];cov_1ks4ntaci2().s[894]++;this.filters=[];cov_1ks4ntaci2().s[895]++;this.cells=[];cov_1ks4ntaci2().s[896]++;this.accelerationNamespace=dataModelObject.dataModel.isAccelerated()?(cov_1ks4ntaci2().b[244][0]++,dataModelObject.dataModel.name):(cov_1ks4ntaci2().b[244][1]++,null);cov_1ks4ntaci2().s[897]++;this.run=utils.bind(this,this.run);cov_1ks4ntaci2().s[898]++;this.pivot=utils.bind(this,this.pivot);},/** + * Set the acceleration cache for this pivot specification to a job, + * usually generated by createLocalAccelerationJob on a DataModelObject + * instance, as the acceleration cache for this pivot specification. + * + * @param {String|splunkjs.Service.Job} sid The sid of an acceleration job, + * or, a `splunkjs.Service.Job` instance. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */setAccelerationJob:function(sid){cov_1ks4ntaci2().f[282]++;cov_1ks4ntaci2().s[899]++;// If a search object is passed in, get its sid +if((cov_1ks4ntaci2().b[246][0]++,sid)&&(cov_1ks4ntaci2().b[246][1]++,sid instanceof Service.Job)){cov_1ks4ntaci2().b[245][0]++;cov_1ks4ntaci2().s[900]++;sid=sid.sid;}else{cov_1ks4ntaci2().b[245][1]++;}cov_1ks4ntaci2().s[901]++;if(!sid){cov_1ks4ntaci2().b[247][0]++;cov_1ks4ntaci2().s[902]++;throw new Error("Sid to use for acceleration must not be null.");}else{cov_1ks4ntaci2().b[247][1]++;}cov_1ks4ntaci2().s[903]++;this.accelerationNamespace="sid="+sid;cov_1ks4ntaci2().s[904]++;return this;},/** + * Add a filter on a boolean valued field. The filter will be a constraint of the form + * `field `comparison` compareTo`, for example: `is_remote = false`. + * + * @param {String} fieldName The name of field to filter on + * @param {String} comparisonType The type of comparison, see class docs for valid types. + * @param {String} comparisonOp The comparison, see class docs for valid comparisons, based on type. + * @param {String} compareTo The value to compare the field to. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addFilter:function(fieldName,comparisonType,comparisonOp,compareTo){cov_1ks4ntaci2().f[283]++;cov_1ks4ntaci2().s[905]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[248][0]++;cov_1ks4ntaci2().s[906]++;throw new Error("Cannot add filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[248][1]++;}cov_1ks4ntaci2().s[907]++;if(comparisonType!==this.dataModelObject.fieldByName(fieldName).type){cov_1ks4ntaci2().b[249][0]++;cov_1ks4ntaci2().s[908]++;throw new Error("Cannot add "+comparisonType+" filter on "+fieldName+" because it is of type "+this.dataModelObject.fieldByName(fieldName).type);}else{cov_1ks4ntaci2().b[249][1]++;}cov_1ks4ntaci2().s[909]++;if(!utils.contains(this._comparisons[comparisonType],comparisonOp)){cov_1ks4ntaci2().b[250][0]++;cov_1ks4ntaci2().s[910]++;throw new Error("Cannot add "+comparisonType+" filter because "+comparisonOp+" is not a valid comparison operator");}else{cov_1ks4ntaci2().b[250][1]++;}var ret=(cov_1ks4ntaci2().s[911]++,{fieldName:fieldName,owner:this.dataModelObject.fieldByName(fieldName).lineage.join("."),type:comparisonType});// These fields are type dependent +cov_1ks4ntaci2().s[912]++;if(utils.contains(["boolean","string","ipv4","number"],ret.type)){cov_1ks4ntaci2().b[251][0]++;cov_1ks4ntaci2().s[913]++;ret.rule={comparator:comparisonOp,compareTo:compareTo};}else{cov_1ks4ntaci2().b[251][1]++;}cov_1ks4ntaci2().s[914]++;this.filters.push(ret);cov_1ks4ntaci2().s[915]++;return this;},/** + * Add a limit on the events shown in a pivot by sorting them according to some field, then taking + * the specified number from the beginning or end of the list. + * + * @param {String} fieldName The name of field to filter on. + * @param {String} sortAttribute The name of the field to use for sorting. + * @param {String} sortDirection The direction to sort events, see class docs for valid types. + * @param {String} limit The number of values from the sorted list to allow through this filter. + * @param {String} statsFunction The stats function to use for aggregation before sorting, see class docs for valid types. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addLimitFilter:function(fieldName,sortAttribute,sortDirection,limit,statsFunction){cov_1ks4ntaci2().f[284]++;cov_1ks4ntaci2().s[916]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[252][0]++;cov_1ks4ntaci2().s[917]++;throw new Error("Cannot add limit filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[252][1]++;}var f=(cov_1ks4ntaci2().s[918]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[919]++;if(!utils.contains(["string","number","objectCount"],f.type)){cov_1ks4ntaci2().b[253][0]++;cov_1ks4ntaci2().s[920]++;throw new Error("Cannot add limit filter on "+fieldName+" because it is of type "+f.type);}else{cov_1ks4ntaci2().b[253][1]++;}cov_1ks4ntaci2().s[921]++;if((cov_1ks4ntaci2().b[255][0]++,"string"===f.type)&&(cov_1ks4ntaci2().b[255][1]++,!utils.contains(["count","dc"],statsFunction))){cov_1ks4ntaci2().b[254][0]++;cov_1ks4ntaci2().s[922]++;throw new Error("Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[254][1]++;}cov_1ks4ntaci2().s[923]++;if((cov_1ks4ntaci2().b[257][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[257][1]++,!utils.contains(["count","dc","average","sum"],statsFunction))){cov_1ks4ntaci2().b[256][0]++;cov_1ks4ntaci2().s[924]++;throw new Error("Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found "+statsFunction);}else{cov_1ks4ntaci2().b[256][1]++;}cov_1ks4ntaci2().s[925]++;if((cov_1ks4ntaci2().b[259][0]++,"objectCount"===f.type)&&(cov_1ks4ntaci2().b[259][1]++,!utils.contains(["count"],statsFunction))){cov_1ks4ntaci2().b[258][0]++;cov_1ks4ntaci2().s[926]++;throw new Error("Stats function for fields of type object count must be COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[258][1]++;}var filter=(cov_1ks4ntaci2().s[927]++,{fieldName:fieldName,owner:f.lineage.join("."),type:f.type,attributeName:sortAttribute,attributeOwner:this.dataModelObject.fieldByName(sortAttribute).lineage.join("."),sortDirection:sortDirection,limitAmount:limit,statsFn:statsFunction});// Assumed "highest" is preferred for when sortDirection is "DEFAULT" +cov_1ks4ntaci2().s[928]++;filter.limitType="ASCENDING"===sortDirection?(cov_1ks4ntaci2().b[260][0]++,"lowest"):(cov_1ks4ntaci2().b[260][1]++,"highest");cov_1ks4ntaci2().s[929]++;this.filters.push(filter);cov_1ks4ntaci2().s[930]++;return this;},/** + * Add a row split on a numeric or string valued field, splitting on each distinct value of the field. + * + * @param {String} fieldName The name of field to split on. + * @param {String} label A human readable name for this set of rows. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addRowSplit:function(fieldName,label){cov_1ks4ntaci2().f[285]++;cov_1ks4ntaci2().s[931]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[261][0]++;cov_1ks4ntaci2().s[932]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[261][1]++;}var f=(cov_1ks4ntaci2().s[933]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[934]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[262][0]++;cov_1ks4ntaci2().s[935]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[262][1]++;}var row=(cov_1ks4ntaci2().s[936]++,{fieldName:fieldName,owner:f.owner,type:f.type,label:label});cov_1ks4ntaci2().s[937]++;if("number"===f.type){cov_1ks4ntaci2().b[263][0]++;cov_1ks4ntaci2().s[938]++;row.display="all";}else{cov_1ks4ntaci2().b[263][1]++;}cov_1ks4ntaci2().s[939]++;this.rows.push(row);cov_1ks4ntaci2().s[940]++;return this;},/** + * Add a row split on a numeric field, splitting into numeric ranges. + * + * This split generates bins with edges equivalent to the + * classic loop 'for i in to by ' but with a maximum + * number of bins . This dispatches to the stats and xyseries search commands. + * See their documentation for more details. + * + * @param {String} fieldName The field to split on. + * @param {String} label A human readable name for this set of rows. + * @param {Object} options An optional dictionary of collection filtering and pagination options: + * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. + * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. + * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. + * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addRangeRowSplit:function(field,label,ranges){cov_1ks4ntaci2().f[286]++;cov_1ks4ntaci2().s[941]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[264][0]++;cov_1ks4ntaci2().s[942]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[264][1]++;}var f=(cov_1ks4ntaci2().s[943]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[944]++;if("number"!==f.type){cov_1ks4ntaci2().b[265][0]++;cov_1ks4ntaci2().s[945]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[265][1]++;}var updateRanges=(cov_1ks4ntaci2().s[946]++,{});cov_1ks4ntaci2().s[947]++;if((cov_1ks4ntaci2().b[267][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[267][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[266][0]++;cov_1ks4ntaci2().s[948]++;updateRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[266][1]++;}cov_1ks4ntaci2().s[949]++;if((cov_1ks4ntaci2().b[269][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[269][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[268][0]++;cov_1ks4ntaci2().s[950]++;updateRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[268][1]++;}cov_1ks4ntaci2().s[951]++;if((cov_1ks4ntaci2().b[271][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[271][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[270][0]++;cov_1ks4ntaci2().s[952]++;updateRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[270][1]++;}cov_1ks4ntaci2().s[953]++;if((cov_1ks4ntaci2().b[273][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[273][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[272][0]++;cov_1ks4ntaci2().s[954]++;updateRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[272][1]++;}cov_1ks4ntaci2().s[955]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,display:"ranges",ranges:updateRanges});cov_1ks4ntaci2().s[956]++;return this;},/** + * Add a row split on a boolean valued field. + * + * @param {String} fieldName The name of field to split on. + * @param {String} label A human readable name for this set of rows. + * @param {String} trueDisplayValue A string to display in the true valued row label. + * @param {String} falseDisplayValue A string to display in the false valued row label. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addBooleanRowSplit:function(field,label,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[287]++;cov_1ks4ntaci2().s[957]++;if(!this.dataModelObject.fieldByName(field)){cov_1ks4ntaci2().b[274][0]++;cov_1ks4ntaci2().s[958]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[274][1]++;}var f=(cov_1ks4ntaci2().s[959]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[960]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[275][0]++;cov_1ks4ntaci2().s[961]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[275][1]++;}cov_1ks4ntaci2().s[962]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[963]++;return this;},/** + * Add a row split on a timestamp valued field, binned by the specified bucket size. + * + * @param {String} fieldName The name of field to split on. + * @param {String} label A human readable name for this set of rows. + * @param {String} binning The size of bins to use, see class docs for valid types. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addTimestampRowSplit:function(field,label,binning){cov_1ks4ntaci2().f[288]++;cov_1ks4ntaci2().s[964]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[276][0]++;cov_1ks4ntaci2().s[965]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[276][1]++;}var f=(cov_1ks4ntaci2().s[966]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[967]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[277][0]++;cov_1ks4ntaci2().s[968]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[277][1]++;}cov_1ks4ntaci2().s[969]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[278][0]++;cov_1ks4ntaci2().s[970]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[278][1]++;}cov_1ks4ntaci2().s[971]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,period:binning});cov_1ks4ntaci2().s[972]++;return this;},/** + * Add a column split on a string or number valued field, producing a column for + * each distinct value of the field. + * + * @param {String} fieldName The name of field to split on. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addColumnSplit:function(fieldName){cov_1ks4ntaci2().f[289]++;cov_1ks4ntaci2().s[973]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[279][0]++;cov_1ks4ntaci2().s[974]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[279][1]++;}var f=(cov_1ks4ntaci2().s[975]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[976]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[280][0]++;cov_1ks4ntaci2().s[977]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[280][1]++;}var col=(cov_1ks4ntaci2().s[978]++,{fieldName:fieldName,owner:f.owner,type:f.type});cov_1ks4ntaci2().s[979]++;if("number"===f.type){cov_1ks4ntaci2().b[281][0]++;cov_1ks4ntaci2().s[980]++;col.display="all";}else{cov_1ks4ntaci2().b[281][1]++;}cov_1ks4ntaci2().s[981]++;this.columns.push(col);cov_1ks4ntaci2().s[982]++;return this;},/** + * Add a column split on a numeric field, splitting the values into ranges. + * + * @param {String} fieldName The field to split on. + * @param {Object} options An optional dictionary of collection filtering and pagination options: + * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. + * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. + * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. + * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addRangeColumnSplit:function(fieldName,ranges){cov_1ks4ntaci2().f[290]++;cov_1ks4ntaci2().s[983]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[282][0]++;cov_1ks4ntaci2().s[984]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[282][1]++;}var f=(cov_1ks4ntaci2().s[985]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[986]++;if("number"!==f.type){cov_1ks4ntaci2().b[283][0]++;cov_1ks4ntaci2().s[987]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[283][1]++;}// In Splunk 6.0.1.1, data models incorrectly expect strings for these fields +// instead of numbers. In 6.1, this is fixed and both are accepted. +var updatedRanges=(cov_1ks4ntaci2().s[988]++,{});cov_1ks4ntaci2().s[989]++;if((cov_1ks4ntaci2().b[285][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[285][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[284][0]++;cov_1ks4ntaci2().s[990]++;updatedRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[284][1]++;}cov_1ks4ntaci2().s[991]++;if((cov_1ks4ntaci2().b[287][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[287][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[286][0]++;cov_1ks4ntaci2().s[992]++;updatedRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[286][1]++;}cov_1ks4ntaci2().s[993]++;if((cov_1ks4ntaci2().b[289][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[289][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[288][0]++;cov_1ks4ntaci2().s[994]++;updatedRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[288][1]++;}cov_1ks4ntaci2().s[995]++;if((cov_1ks4ntaci2().b[291][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[291][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[290][0]++;cov_1ks4ntaci2().s[996]++;updatedRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[290][1]++;}cov_1ks4ntaci2().s[997]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,display:"ranges",ranges:updatedRanges});cov_1ks4ntaci2().s[998]++;return this;},/** + * Add a column split on a boolean valued field. + * + * @param {String} fieldName The name of field to split on. + * @param {String} trueDisplayValue A string to display in the true valued column label. + * @param {String} falseDisplayValue A string to display in the false valued column label. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addBooleanColumnSplit:function(fieldName,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[291]++;cov_1ks4ntaci2().s[999]++;if(!this.dataModelObject.fieldByName(fieldName)){cov_1ks4ntaci2().b[292][0]++;cov_1ks4ntaci2().s[1000]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[292][1]++;}var f=(cov_1ks4ntaci2().s[1001]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1002]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[293][0]++;cov_1ks4ntaci2().s[1003]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[293][1]++;}cov_1ks4ntaci2().s[1004]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[1005]++;return this;},/** + * Add a column split on a timestamp valued field, binned by the specified bucket size. + * + * @param {String} fieldName The name of field to split on. + * @param {String} binning The size of bins to use, see class docs for valid types. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addTimestampColumnSplit:function(field,binning){cov_1ks4ntaci2().f[292]++;cov_1ks4ntaci2().s[1006]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[294][0]++;cov_1ks4ntaci2().s[1007]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[294][1]++;}var f=(cov_1ks4ntaci2().s[1008]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[1009]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[295][0]++;cov_1ks4ntaci2().s[1010]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[295][1]++;}cov_1ks4ntaci2().s[1011]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[296][0]++;cov_1ks4ntaci2().s[1012]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[296][1]++;}cov_1ks4ntaci2().s[1013]++;this.columns.push({fieldName:field,owner:f.owner,type:f.type,period:binning});cov_1ks4ntaci2().s[1014]++;return this;},/** + * Add an aggregate to each cell of the pivot. + * + * @param {String} fieldName The name of field to aggregate. + * @param {String} label a human readable name for this aggregate. + * @param {String} statsFunction The function to use for aggregation, see class docs for valid stats functions. + * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */addCellValue:function(fieldName,label,statsFunction){cov_1ks4ntaci2().f[293]++;cov_1ks4ntaci2().s[1015]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[297][0]++;cov_1ks4ntaci2().s[1016]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[297][1]++;}var f=(cov_1ks4ntaci2().s[1017]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1018]++;if((cov_1ks4ntaci2().b[299][0]++,utils.contains(["string","ipv4"],f.type))&&(cov_1ks4ntaci2().b[299][1]++,!utils.contains(["list","values","first","last","count","dc"],statsFunction))){cov_1ks4ntaci2().b[298][0]++;cov_1ks4ntaci2().s[1019]++;throw new Error("Stats function on string and IPv4 fields must be one of:"+" list, distinct_values, first, last, count, or distinct_count; found "+statsFunction);}else{cov_1ks4ntaci2().b[298][1]++;cov_1ks4ntaci2().s[1020]++;if((cov_1ks4ntaci2().b[301][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[301][1]++,!utils.contains(["sum","count","average","min","max","stdev","list","values"],statsFunction))){cov_1ks4ntaci2().b[300][0]++;cov_1ks4ntaci2().s[1021]++;throw new Error("Stats function on number field must be must be one of:"+" sum, count, average, max, min, stdev, list, or distinct_values; found "+statsFunction);}else{cov_1ks4ntaci2().b[300][1]++;cov_1ks4ntaci2().s[1022]++;if((cov_1ks4ntaci2().b[303][0]++,"timestamp"===f.type)&&(cov_1ks4ntaci2().b[303][1]++,!utils.contains(["duration","earliest","latest","list","values"],statsFunction))){cov_1ks4ntaci2().b[302][0]++;cov_1ks4ntaci2().s[1023]++;throw new Error("Stats function on timestamp field must be one of:"+" duration, earliest, latest, list, or distinct values; found "+statsFunction);}else{cov_1ks4ntaci2().b[302][1]++;cov_1ks4ntaci2().s[1024]++;if((cov_1ks4ntaci2().b[305][0]++,utils.contains(["objectCount","childCount"],f.type))&&(cov_1ks4ntaci2().b[305][1]++,"count"!==statsFunction)){cov_1ks4ntaci2().b[304][0]++;cov_1ks4ntaci2().s[1025]++;throw new Error("Stats function on childcount and objectcount fields must be count; "+"found "+statsFunction);}else{cov_1ks4ntaci2().b[304][1]++;cov_1ks4ntaci2().s[1026]++;if("boolean"===f.type){cov_1ks4ntaci2().b[306][0]++;cov_1ks4ntaci2().s[1027]++;throw new Error("Cannot use boolean valued fields as cell values.");}else{cov_1ks4ntaci2().b[306][1]++;}}}}}cov_1ks4ntaci2().s[1028]++;this.cells.push({fieldName:fieldName,owner:f.lineage.join("."),type:f.type,label:label,sparkline:false,// Not properly implemented in core yet. +value:statsFunction});cov_1ks4ntaci2().s[1029]++;return this;},/** + * Returns a JSON ready object representation of this pivot specification. + * + * @return {Object} The JSON ready object representation of this pivot specification. + * + * @method splunkjs.Service.PivotSpecification + */toJsonObject:function(){cov_1ks4ntaci2().f[294]++;cov_1ks4ntaci2().s[1030]++;return{dataModel:this.dataModelObject.dataModel.name,baseClass:this.dataModelObject.name,rows:this.rows,columns:this.columns,cells:this.cells,filters:this.filters};},/** + * Query Splunk for SPL queries corresponding to a pivot report + * for this data model, defined by this `PivotSpecification`. + * + * @example + * + * service.dataModels().fetch(function(err, dataModels) { + * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); + * var pivotSpec = searches.createPivotSpecification(); + * // Use of the fluent API + * pivotSpec.addRowSplit("user", "Executing user") + * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) + * .addCellValue("search", "Search Query", "values") + * .pivot(function(pivotErr, pivot) { + * console.log("Pivot search is:", pivot.search); + * }); + * }); + * + * @param {Function} callback A function to call when done getting the pivot: `(err, pivot)`. + * + * @method splunkjs.Service.PivotSpecification + */pivot:function(callback){cov_1ks4ntaci2().f[295]++;var svc=(cov_1ks4ntaci2().s[1031]++,this.dataModelObject.dataModel.service);var args=(cov_1ks4ntaci2().s[1032]++,{pivot_json:JSON.stringify(this.toJsonObject())});cov_1ks4ntaci2().s[1033]++;if(!utils.isUndefined(this.accelerationNamespace)){cov_1ks4ntaci2().b[307][0]++;cov_1ks4ntaci2().s[1034]++;args.namespace=this.accelerationNamespace;}else{cov_1ks4ntaci2().b[307][1]++;}cov_1ks4ntaci2().s[1035]++;return svc.get(Paths.pivot+"/"+encodeURIComponent(this.dataModelObject.dataModel.name),args,function(err,response){cov_1ks4ntaci2().f[296]++;cov_1ks4ntaci2().s[1036]++;if(err){cov_1ks4ntaci2().b[308][0]++;cov_1ks4ntaci2().s[1037]++;callback(new Error(err.data.messages[0].text),response);cov_1ks4ntaci2().s[1038]++;return;}else{cov_1ks4ntaci2().b[308][1]++;}cov_1ks4ntaci2().s[1039]++;if((cov_1ks4ntaci2().b[310][0]++,response.data.entry)&&(cov_1ks4ntaci2().b[310][1]++,response.data.entry[0])){cov_1ks4ntaci2().b[309][0]++;cov_1ks4ntaci2().s[1040]++;callback(null,new root.Pivot(svc,response.data.entry[0].content));}else{cov_1ks4ntaci2().b[309][1]++;cov_1ks4ntaci2().s[1041]++;callback(new Error("Didn't get a Pivot report back from Splunk"),response);}});},/** + * Convenience method to wrap up the `PivotSpecification.pivot()` and + * `Pivot.run()` function calls. + * + * Query Splunk for SPL queries corresponding to a pivot report + * for this data model, defined by this `PivotSpecification`; then, + * starts a search job running this pivot, accelerated if possible. + * + * service.dataModels().fetch(function(fetchErr, dataModels) { + * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); + * var pivotSpec = searches.createPivotSpecification(); + * // Use of the fluent API + * pivotSpec.addRowSplit("user", "Executing user") + * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) + * .addCellValue("search", "Search Query", "values") + * .run(function(err, job, pivot) { + * console.log("Job SID is:", job.sid); + * console.log("Pivot search is:", pivot.search); + * }); + * }); + * @param {Object} args A dictionary of properties for the search job (optional). For a list of available parameters, see Search job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {Function} callback A function to call when done getting the pivot: `(err, job, pivot)`. + * + * @method splunkjs.Service.PivotSpecification + */run:function(args,callback){cov_1ks4ntaci2().f[297]++;cov_1ks4ntaci2().s[1042]++;if(!callback){cov_1ks4ntaci2().b[311][0]++;cov_1ks4ntaci2().s[1043]++;callback=args;cov_1ks4ntaci2().s[1044]++;args={};}else{cov_1ks4ntaci2().b[311][1]++;}cov_1ks4ntaci2().s[1045]++;args=(cov_1ks4ntaci2().b[312][0]++,args)||(cov_1ks4ntaci2().b[312][1]++,{});cov_1ks4ntaci2().s[1046]++;this.pivot(function(err,pivot){cov_1ks4ntaci2().f[298]++;cov_1ks4ntaci2().s[1047]++;if(err){cov_1ks4ntaci2().b[313][0]++;cov_1ks4ntaci2().s[1048]++;callback(err,null,null);}else{cov_1ks4ntaci2().b[313][1]++;cov_1ks4ntaci2().s[1049]++;pivot.run(args,Async.augment(callback,pivot));}});}});/** + * Represents one of the structured views in a `DataModel`. + * + * Has these properties: + * - `dataModel` (_splunkjs.Service.DataModel_): The `DataModel` to which this `DataModelObject` belongs. + * - `name` (_string_): The name of this `DataModelObject`. + * - `displayName` (_string_): The human readable name of this `DataModelObject`. + * - `parentName` (_string_): The name of the parent `DataModelObject` to this one. + * - `lineage` (_array_): An array of strings of the lineage of the data model + * on which this field is defined. + * - `fields` (_object_): A dictionary of `DataModelField` objects, accessible by name. + * - `constraints` (_array_): An array of `DataModelConstraint` objects. + * - `calculations` (_object_): A dictionary of `DataModelCalculation` objects, accessible by ID. + * + * BaseSearch has an additional property: + * - `baseSearch` (_string_): The search query wrapped by this data model object. + * + * BaseTransaction has additional properties: + * - `groupByFields` (_string_): The fields that will be used to group events into transactions. + * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned + * and split into transactions. + * - `maxSpan` (_string_): The maximum time span of a transaction. + * - `maxPause` (_string_): The maximum pause time of a transaction. + * + * @class splunkjs.Service.DataModelObject + */cov_1ks4ntaci2().s[1050]++;root.DataModelObject=Class.extend({/** + * Constructor for a data model object. + * SDK users are not expected to invoke this constructor directly. + * + * @constructor + * @param {Object} props A dictionary of properties to set: + * - `objectName` (_string_): The name for this data model object. + * - `displayName` (_string_): A human readable name for this data model object. + * - `parentName` (_string_): The name of the data model that owns this data model object. + * - `lineage` (_string_): The lineage of the data model that owns this data model object, + * items are delimited by a dot. This is converted into an array of + * strings upon construction. + * - `fields` (_array_): An array of data model fields. + * - `constraints` (_array_): An array of data model constraints. + * - `calculations` (_array_): An array of data model calculations. + * - `baseSearch` (_string_): The search query wrapped by this data model object; exclusive to BaseSearch (optional) + * - `groupByFields` (_array_): The fields that will be used to group events into transactions; exclusive to BaseTransaction (optional) + * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned + * and split into transactions; exclusive to BaseTransaction (optional) + * - `maxSpan` (_string_): The maximum time span of a transaction; exclusive to BaseTransaction (optional) + * - `maxPause` (_string_): The maximum pause time of a transaction; exclusive to BaseTransaction (optional) + * + * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. + * + * @method splunkjs.Service.DataModelObject + */init:function(props,parentDataModel){cov_1ks4ntaci2().f[299]++;cov_1ks4ntaci2().s[1051]++;props=(cov_1ks4ntaci2().b[314][0]++,props)||(cov_1ks4ntaci2().b[314][1]++,{});cov_1ks4ntaci2().s[1052]++;props.owner=(cov_1ks4ntaci2().b[315][0]++,props.owner)||(cov_1ks4ntaci2().b[315][1]++,"");cov_1ks4ntaci2().s[1053]++;this.dataModel=parentDataModel;cov_1ks4ntaci2().s[1054]++;this.name=props.objectName;cov_1ks4ntaci2().s[1055]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[1056]++;this.parentName=props.parentName;cov_1ks4ntaci2().s[1057]++;this.lineage=props.lineage.split(".");// Properties exclusive to BaseTransaction +cov_1ks4ntaci2().s[1058]++;if(props.hasOwnProperty("groupByFields")){cov_1ks4ntaci2().b[316][0]++;cov_1ks4ntaci2().s[1059]++;this.groupByFields=props.groupByFields;}else{cov_1ks4ntaci2().b[316][1]++;}cov_1ks4ntaci2().s[1060]++;if(props.hasOwnProperty("objectsToGroup")){cov_1ks4ntaci2().b[317][0]++;cov_1ks4ntaci2().s[1061]++;this.objectsToGroup=props.objectsToGroup;}else{cov_1ks4ntaci2().b[317][1]++;}cov_1ks4ntaci2().s[1062]++;if(props.hasOwnProperty("transactionMaxTimeSpan")){cov_1ks4ntaci2().b[318][0]++;cov_1ks4ntaci2().s[1063]++;this.maxSpan=props.transactionMaxTimeSpan;}else{cov_1ks4ntaci2().b[318][1]++;}cov_1ks4ntaci2().s[1064]++;if(props.hasOwnProperty("transactionMaxPause")){cov_1ks4ntaci2().b[319][0]++;cov_1ks4ntaci2().s[1065]++;this.maxPause=props.transactionMaxPause;}else{cov_1ks4ntaci2().b[319][1]++;}// Property exclusive to BaseSearch +cov_1ks4ntaci2().s[1066]++;if(props.hasOwnProperty("baseSearch")){cov_1ks4ntaci2().b[320][0]++;cov_1ks4ntaci2().s[1067]++;this.baseSearch=props.baseSearch;}else{cov_1ks4ntaci2().b[320][1]++;}// Parse fields +cov_1ks4ntaci2().s[1068]++;this.fields={};cov_1ks4ntaci2().s[1069]++;for(var i=(cov_1ks4ntaci2().s[1070]++,0);iSearch job parameters on Splunk Developer Portal. + * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. + * @param {String} querySuffix A search query, starting with a '|' that will be appended to the command to fetch the contents of this data model object (e.g., "| head 3"). + * @param {Function} callback A function to call with the search job: `(err, job)`. + * + * @method splunkjs.Service.DataModelObject + */startSearch:function(params,querySuffix,callback){cov_1ks4ntaci2().f[311]++;var query=(cov_1ks4ntaci2().s[1113]++,"| datamodel "+this.dataModel.name+" "+this.name+" search");// Prepend a space to the querySuffix, or set it to an empty string if null or undefined +cov_1ks4ntaci2().s[1114]++;querySuffix=querySuffix?(cov_1ks4ntaci2().b[327][0]++," "+querySuffix):(cov_1ks4ntaci2().b[327][1]++,"");cov_1ks4ntaci2().s[1115]++;this.dataModel.service.search(query+querySuffix,params,callback);},/** + * Returns the data model object this one inherits from if it is a user defined, + * otherwise return null. + * + * @return {splunkjs.Service.DataModelObject|null} This data model object's parent + * or null if this is not a user defined data model object. + * + * @method splunkjs.Service.DataModelObject + */parent:function(){cov_1ks4ntaci2().f[312]++;cov_1ks4ntaci2().s[1116]++;return this.dataModel.objectByName(this.parentName);},/** + * Returns a new Pivot Specification, accepts no parameters. + * + * @return {splunkjs.Service.PivotSpecification} A new pivot specification. + * + * @method splunkjs.Service.DataModelObject + */createPivotSpecification:function(){cov_1ks4ntaci2().f[313]++;cov_1ks4ntaci2().s[1117]++;// Pass in this DataModelObject to create a PivotSpecification +return new root.PivotSpecification(this);}});/** + * Represents a data model on the server. Data models + * contain `DataModelObject` instances, which specify structured + * views on Splunk data. + * + * @endpoint datamodel/model/{name} + * @class splunkjs.Service.DataModel + * @extends splunkjs.Service.Entity + */cov_1ks4ntaci2().s[1118]++;root.DataModel=Service.Entity.extend({/** + * Retrieves the REST endpoint path for this resource (with no namespace). + * + * @method splunkjs.Service.DataModel + */path:function(){cov_1ks4ntaci2().f[314]++;cov_1ks4ntaci2().s[1119]++;return Paths.dataModels+"/"+encodeURIComponent(this.name);},/** + * Constructor for `splunkjs.Service.DataModel`. + * + * @constructor + * @param {splunkjs.Service} service A `Service` instance. + * @param {String} name The name for the new data model. + * @param {Object} namespace (Optional) namespace information: + * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. + * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. + * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". + * @param {Object} props Properties of this data model: + * - `acceleration` (_string_): A JSON object with an `enabled` key, representing if acceleration is enabled or not. + * - `concise` (_string_): Indicates whether to list a concise JSON description of the data model, should always be "0". + * - `description` (_string_): The JSON describing the data model. + * - `displayName` (_string_): The name displayed for the data model in Splunk Web. + * + * @method splunkjs.Service.DataModel + */init:function(service,name,namespace,props){cov_1ks4ntaci2().f[315]++;cov_1ks4ntaci2().s[1120]++;// If not given a 4th arg, assume the namespace was omitted +if(!props){cov_1ks4ntaci2().b[328][0]++;cov_1ks4ntaci2().s[1121]++;props=namespace;cov_1ks4ntaci2().s[1122]++;namespace={};}else{cov_1ks4ntaci2().b[328][1]++;}cov_1ks4ntaci2().s[1123]++;this.name=name;cov_1ks4ntaci2().s[1124]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[1125]++;this.acceleration=(cov_1ks4ntaci2().b[329][0]++,JSON.parse(props.content.acceleration))||(cov_1ks4ntaci2().b[329][1]++,{});cov_1ks4ntaci2().s[1126]++;if(this.acceleration.hasOwnProperty("enabled")){cov_1ks4ntaci2().b[330][0]++;cov_1ks4ntaci2().s[1127]++;// convert the enabled property to a boolean +this.acceleration.enabled=!!this.acceleration.enabled;}else{cov_1ks4ntaci2().b[330][1]++;}// concise=0 (false) forces the server to return all details of the newly created data model. +// we do not want a summary of this data model +cov_1ks4ntaci2().s[1128]++;if((cov_1ks4ntaci2().b[332][0]++,!props.hasOwnProperty("concise"))||(cov_1ks4ntaci2().b[332][1]++,utils.isUndefined(props.concise))){cov_1ks4ntaci2().b[331][0]++;cov_1ks4ntaci2().s[1129]++;this.concise="0";}else{cov_1ks4ntaci2().b[331][1]++;}var dataModelDefinition=(cov_1ks4ntaci2().s[1130]++,JSON.parse(props.content.description));cov_1ks4ntaci2().s[1131]++;this.objectNames=dataModelDefinition.objectNameList;cov_1ks4ntaci2().s[1132]++;this.displayName=dataModelDefinition.displayName;cov_1ks4ntaci2().s[1133]++;this.description=dataModelDefinition.description;// Parse the objects for this data model +var objs=(cov_1ks4ntaci2().s[1134]++,dataModelDefinition.objects);cov_1ks4ntaci2().s[1135]++;this.objects=[];cov_1ks4ntaci2().s[1136]++;for(var i=(cov_1ks4ntaci2().s[1137]++,0);i0);}});}});})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2UuanMiXSwibmFtZXMiOlsiQ29udGV4dCIsInJlcXVpcmUiLCJIdHRwIiwiQXN5bmMiLCJQYXRocyIsIkNsYXNzIiwidXRpbHMiLCJyb290IiwiZXhwb3J0cyIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSIsImV4dGVuZCIsImluaXQiLCJfc3VwZXIiLCJhcHBseSIsImFyZ3VtZW50cyIsIm1vZHVsZSIsInNwZWNpYWxpemUiLCJiaW5kIiwiYXBwcyIsImNvbmZpZ3VyYXRpb25zIiwiaW5kZXhlcyIsInNhdmVkU2VhcmNoZXMiLCJqb2JzIiwidXNlcnMiLCJjdXJyZW50VXNlciIsInZpZXdzIiwiZmlyZWRBbGVydEdyb3VwcyIsImRhdGFNb2RlbHMiLCJvd25lciIsImFwcCIsImh0dHAiLCJzY2hlbWUiLCJob3N0IiwicG9ydCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZXNzaW9uS2V5IiwidmVyc2lvbiIsIkFwcGxpY2F0aW9ucyIsIm5hbWVzcGFjZSIsIkNvbmZpZ3VyYXRpb25zIiwiSW5kZXhlcyIsIlNhdmVkU2VhcmNoZXMiLCJzdG9yYWdlUGFzc3dvcmRzIiwiU3RvcmFnZVBhc3N3b3JkcyIsIkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb24iLCJKb2JzIiwiRGF0YU1vZGVscyIsIlVzZXJzIiwiVmlld3MiLCJzZWFyY2giLCJxdWVyeSIsInBhcmFtcyIsImNhbGxiYWNrIiwiaXNGdW5jdGlvbiIsImdldEpvYiIsInNpZCIsImpvYiIsIkpvYiIsImZldGNoIiwib25lc2hvdFNlYXJjaCIsInRoYXQiLCJyZXEiLCJnZXQiLCJlcnIiLCJyZXNwb25zZSIsImRhdGEiLCJlbnRyeSIsImNvbnRlbnQiLCJ1c2VyIiwiVXNlciIsIndhc0Fib3J0ZWQiLCJzZXJ2ZXJJbmZvIiwiU2VydmVySW5mbyIsInBhcnNlIiwicSIsInBhcnNlciIsInR5cGVhaGVhZCIsInByZWZpeCIsImNvdW50IiwicmVzdWx0cyIsImxvZyIsImV2ZW50IiwiaXNPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5IiwicGF0aCIsInBhdGhzIiwic3VibWl0RXZlbnQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsInBvc3QiLCJyZXF1ZXN0IiwiRW5kcG9pbnQiLCJzZXJ2aWNlIiwicXVhbGlmaWVkUGF0aCIsIkVycm9yIiwiZ2V0X3YyIiwiZGVsIiwicmVscGF0aCIsInVybCIsIlJlc291cmNlIiwiZnVsbHBhdGgiLCJfcHJvcGVydGllcyIsIl9zdGF0ZSIsIl9sb2FkIiwicHJvcGVydGllcyIsInN0YXRlIiwiRW50aXR5IiwiZmV0Y2hPblVwZGF0ZSIsInJlbW92ZSIsInVwZGF0ZSIsImZpZWxkcyIsImxpbmtzIiwiYWNsIiwiYXV0aG9yIiwidXBkYXRlZCIsInB1Ymxpc2hlZCIsImVuYWJsZSIsImRpc2FibGUiLCJyZWxvYWQiLCJfZmllbGRzIiwiX2FjbCIsIl9saW5rcyIsImlzQXJyYXkiLCJfYXV0aG9yIiwiX3VwZGF0ZWQiLCJfcHVibGlzaGVkIiwib3B0aW9ucyIsInByb3BzIiwiaGFzT3duUHJvcGVydHkiLCJDb2xsZWN0aW9uIiwiZmV0Y2hPbkVudGl0eUNyZWF0aW9uIiwiY3JlYXRlIiwibGlzdCIsIml0ZW0iLCJpbnN0YW50aWF0ZUVudGl0eSIsIl9lbnRpdGllcyIsIl9lbnRpdGllc0J5TmFtZSIsIl9wYWdpbmciLCJlbnRpdGllcyIsImVudGl0aWVzQnlOYW1lIiwiZW50aXR5UHJvcGVydHlMaXN0IiwiaSIsImxlbmd0aCIsImVudGl0eSIsInB1c2giLCJuYW1lIiwicGFnaW5nIiwiZmV0Y2hfdjIiLCJpZCIsImlzRW1wdHkiLCJmdWxsUGF0aCIsImNsb25lIiwiU2F2ZWRTZWFyY2giLCJlbmNvZGVVUklDb21wb25lbnQiLCJhY2tub3dsZWRnZSIsImRpc3BhdGNoIiwiaGlzdG9yeSIsInN1cHByZXNzSW5mbyIsImFsZXJ0Q291bnQiLCJwYXJzZUludCIsInRyaWdnZXJlZF9hbGVydF9jb3VudCIsImZpcmVkQWxlcnRHcm91cCIsIkZpcmVkQWxlcnRHcm91cCIsImpvYkRhdGEiLCJuYW1lc3BhY2VGcm9tUHJvcGVydGllcyIsImNhbGwiLCJlbnRpdHlOYW1lc3BhY2UiLCJTdG9yYWdlUGFzc3dvcmQiLCJGaXJlZEFsZXJ0IiwiZmlyZWRBbGVydHMiLCJhY3Rpb25zIiwiYWxlcnRUeXBlIiwiYWxlcnRfdHlwZSIsImlzRGlnZXN0TW9kZSIsImRpZ2VzdF9tb2RlIiwiZXhwaXJhdGlvblRpbWUiLCJleHBpcmF0aW9uX3RpbWVfcmVuZGVyZWQiLCJzYXZlZFNlYXJjaE5hbWUiLCJzYXZlZHNlYXJjaF9uYW1lIiwic2V2ZXJpdHkiLCJ0cmlnZ2VyVGltZSIsInRyaWdnZXJfdGltZSIsInRyaWdnZXJUaW1lUmVuZGVyZWQiLCJ0cmlnZ2VyX3RpbWVfcmVuZGVyZWQiLCJ0cmlnZ2VyZWRBbGVydENvdW50IiwidHJpZ2dlcmVkX2FsZXJ0cyIsImZpcmVkQWxlcnREYXRhIiwiZmlyZWRBbGVydCIsIkFwcGxpY2F0aW9uIiwic2V0dXBJbmZvIiwidXBkYXRlSW5mbyIsImluZm8iLCJWaWV3IiwiSW5kZXgiLCJyZXN1bHQiLCJ2ZXJzaW9uQ29tcGFyZSIsIkNvbmZpZ3VyYXRpb25TdGFuemEiLCJmaWxlIiwiQ29uZmlndXJhdGlvbkZpbGUiLCJnZXREZWZhdWx0U3RhbnphIiwic3RhbnphTmFtZSIsInZhbHVlcyIsImZpbGVuYW1lIiwiX19jb25mIiwiZG9lc0ZpbGVFeGlzdCIsImZpbGVzIiwiZmlsdGVyIiwiZiIsImNvZGUiLCJtZXNzYWdlIiwiY29uZmlndXJhdGlvbkZpbGUiLCJmZXRjaGVkRmlsZSIsImVycm9yIiwiZXJyb3JDb2RlIiwiZXJyb3JNZXNzYWdlIiwiZG9lc1N0YW56YUV4aXN0Iiwic3RhbnphIiwiZmV0Y2hlZFN0YW56YSIsImNyZWF0ZV92MiIsImNvbmZpZ3MiLCJzdmMiLCJrZXlWYWx1ZU1hcCIsImRvZXNGaWxlRXhpc3RSZXNwb25zZSIsImNvbmZpZ0ZpbGUiLCJjb25zb2xlIiwibmV3RmlsZSIsImRvZXNTdGFuemFFeGlzdFJlc3BvbnNlIiwiY29uZmlnU3RhbnphIiwibmV3U3RhbnphIiwidXBkYXRlZFN0YW56YSIsImNhbmNlbCIsImRpc2FibGVQcmV2aWV3IiwiZW5hYmxlUHJldmlldyIsImV2ZW50cyIsImZpbmFsaXplIiwicGF1c2UiLCJwcmV2aWV3Iiwic2VhcmNobG9nIiwic2V0UHJpb3JpdHkiLCJzZXRUVEwiLCJzdW1tYXJ5IiwidGltZWxpbmUiLCJ0b3VjaCIsInVucGF1c2UiLCJhY3Rpb24iLCJvdXRwdXRfbW9kZSIsIml0ZXJhdG9yIiwidHlwZSIsIlBhZ2luYXRlZEVuZHBvaW50SXRlcmF0b3IiLCJ2YWx1ZSIsInByaW9yaXR5IiwidHRsIiwidHJhY2siLCJjYWxsYmFja3MiLCJwZXJpb2QiLCJkb25lIiwibm9DYWxsYmFja3NBZnRlclJlYWR5IiwicHJvZ3Jlc3MiLCJmYWlsZWQiLCJyZWFkeSIsIl9wcmVyZWFkeSIsIl9zdG9wcGVkQWZ0ZXJSZWFkeSIsImVtaXR0ZWRSZWFkeSIsImRvbmVMb29waW5nIiwid2hpbHN0IiwibmV4dEl0ZXJhdGlvbiIsImRpc3BhdGNoU3RhdGUiLCJub3RSZWFkeSIsImlzRG9uZSIsImlzRmFpbGVkIiwic2xlZXAiLCJleGVjX21vZGUiLCJ0b0xvd2VyQ2FzZSIsIm91dHB1dE1vZGUiLCJEYXRhTW9kZWxGaWVsZCIsIl90eXBlcyIsImZpZWxkTmFtZSIsImRpc3BsYXlOYW1lIiwibXVsdGl2YWx1ZWQiLCJtdWx0aXZhbHVlIiwicmVxdWlyZWQiLCJoaWRkZW4iLCJlZGl0YWJsZSIsImNvbW1lbnQiLCJmaWVsZFNlYXJjaCIsImxpbmVhZ2UiLCJzcGxpdCIsImlzU3RyaW5nIiwiaXNOdW1iZXIiLCJpc1RpbWVzdGFtcCIsImlzT2JqZWN0Y291bnQiLCJpc0NoaWxkY291bnQiLCJpc0lQdjQiLCJpc0Jvb2xlYW4iLCJEYXRhTW9kZWxDb25zdHJhaW50IiwiRGF0YU1vZGVsQ2FsY3VsYXRpb24iLCJjYWxjdWxhdGlvbklEIiwiY2FsY3VsYXRpb25UeXBlIiwib3V0cHV0RmllbGRzIiwiZXhwcmVzc2lvbiIsImlucHV0RmllbGQiLCJsb29rdXBOYW1lIiwiaW5wdXRGaWVsZE1hcHBpbmdzIiwibG9va3VwSW5wdXRzIiwib3V0cHV0RmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJpc0VkaXRhYmxlIiwiaXNMb29rdXAiLCJpc0V2YWwiLCJpc1JleCIsImlzR2VvSVAiLCJQaXZvdCIsImRyaWxsZG93blNlYXJjaCIsImRyaWxsZG93bl9zZWFyY2giLCJwcmV0dHlRdWVyeSIsIm9wZW5JblNlYXJjaCIsIm9wZW5faW5fc2VhcmNoIiwicGl2b3RTZWFyY2giLCJwaXZvdF9zZWFyY2giLCJ0c3RhdHNTZWFyY2giLCJ0c3RhdHNfc2VhcmNoIiwicnVuIiwiYXJncyIsImlzVW5kZWZpbmVkIiwiUGl2b3RTcGVjaWZpY2F0aW9uIiwiX2NvbXBhcmlzb25zIiwiYm9vbGVhbiIsInN0cmluZyIsIm51bWJlciIsImlwdjQiLCJfYmlubmluZyIsIl9zb3J0RGlyZWN0aW9uIiwiX3N0YXRzRnVuY3Rpb25zIiwiZGF0YU1vZGVsT2JqZWN0IiwiY29sdW1ucyIsInJvd3MiLCJmaWx0ZXJzIiwiY2VsbHMiLCJhY2NlbGVyYXRpb25OYW1lc3BhY2UiLCJkYXRhTW9kZWwiLCJpc0FjY2VsZXJhdGVkIiwicGl2b3QiLCJzZXRBY2NlbGVyYXRpb25Kb2IiLCJhZGRGaWx0ZXIiLCJjb21wYXJpc29uVHlwZSIsImNvbXBhcmlzb25PcCIsImNvbXBhcmVUbyIsImhhc0ZpZWxkIiwiZmllbGRCeU5hbWUiLCJjb250YWlucyIsInJldCIsImpvaW4iLCJydWxlIiwiY29tcGFyYXRvciIsImFkZExpbWl0RmlsdGVyIiwic29ydEF0dHJpYnV0ZSIsInNvcnREaXJlY3Rpb24iLCJsaW1pdCIsInN0YXRzRnVuY3Rpb24iLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlT3duZXIiLCJsaW1pdEFtb3VudCIsInN0YXRzRm4iLCJsaW1pdFR5cGUiLCJhZGRSb3dTcGxpdCIsImxhYmVsIiwicm93IiwiZGlzcGxheSIsImFkZFJhbmdlUm93U3BsaXQiLCJmaWVsZCIsInJhbmdlcyIsInVwZGF0ZVJhbmdlcyIsInN0YXJ0IiwiZW5kIiwic3RlcCIsInNpemUiLCJtYXhOdW1iZXJPZiIsImFkZEJvb2xlYW5Sb3dTcGxpdCIsInRydWVEaXNwbGF5VmFsdWUiLCJmYWxzZURpc3BsYXlWYWx1ZSIsInRydWVMYWJlbCIsImZhbHNlTGFiZWwiLCJhZGRUaW1lc3RhbXBSb3dTcGxpdCIsImJpbm5pbmciLCJhZGRDb2x1bW5TcGxpdCIsImNvbCIsImFkZFJhbmdlQ29sdW1uU3BsaXQiLCJ1cGRhdGVkUmFuZ2VzIiwiYWRkQm9vbGVhbkNvbHVtblNwbGl0IiwiYWRkVGltZXN0YW1wQ29sdW1uU3BsaXQiLCJhZGRDZWxsVmFsdWUiLCJzcGFya2xpbmUiLCJ0b0pzb25PYmplY3QiLCJiYXNlQ2xhc3MiLCJwaXZvdF9qc29uIiwibWVzc2FnZXMiLCJ0ZXh0IiwiYXVnbWVudCIsIkRhdGFNb2RlbE9iamVjdCIsInBhcmVudERhdGFNb2RlbCIsIm9iamVjdE5hbWUiLCJwYXJlbnROYW1lIiwiZ3JvdXBCeUZpZWxkcyIsIm9iamVjdHNUb0dyb3VwIiwibWF4U3BhbiIsInRyYW5zYWN0aW9uTWF4VGltZVNwYW4iLCJtYXhQYXVzZSIsInRyYW5zYWN0aW9uTWF4UGF1c2UiLCJiYXNlU2VhcmNoIiwiY29uc3RyYWludHMiLCJqIiwiY2FsY3VsYXRpb25zIiwiayIsImlzQmFzZVNlYXJjaCIsImlzQmFzZVRyYW5zYWN0aW9uIiwiZmllbGROYW1lcyIsImNhbGN1bGF0ZWRGaWVsZHMiLCJhbGxGaWVsZHMiLCJjb21iaW5lZEZpZWxkcyIsImNmIiwiYWxsRmllbGROYW1lcyIsImNhbGN1bGF0aW9uSURzIiwiY2FsY3VsYXRpb24iLCJjYWxjdWxhdGVkRmllbGROYW1lcyIsImNyZWF0ZUxvY2FsQWNjZWxlcmF0aW9uSm9iIiwiZWFybGllc3RUaW1lIiwidW5kZWZpbmVkIiwiZWFybGllc3RfdGltZSIsInN0YXJ0U2VhcmNoIiwicXVlcnlTdWZmaXgiLCJwYXJlbnQiLCJvYmplY3RCeU5hbWUiLCJjcmVhdGVQaXZvdFNwZWNpZmljYXRpb24iLCJEYXRhTW9kZWwiLCJhY2NlbGVyYXRpb24iLCJlbmFibGVkIiwiY29uY2lzZSIsImRhdGFNb2RlbERlZmluaXRpb24iLCJkZXNjcmlwdGlvbiIsIm9iamVjdE5hbWVzIiwib2JqZWN0TmFtZUxpc3QiLCJvYmpzIiwib2JqZWN0cyIsImhhc09iamVjdCIsInVwZGF0ZWRQcm9wcyIsImFjY2NlbGVyYXRpb24iLCJjcm9uX3NjaGVkdWxlIiwiY3JvblNjaGVkdWxlIiwiZGF0YU1vZGVsTmFtZXNwYWNlIiwicmVwbGFjZSIsImVuZHBvaW50IiwiX2VuZHBvaW50IiwiX3BhZ2VzaXplIiwicGFnZXNpemUiLCJfb2Zmc2V0IiwibmV4dCIsIm9mZnNldCIsIm51bVJlc3VsdHMiXSwibWFwcGluZ3MiOiJvc3ZOQWVZO21IQWZaLEssQ0FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLENBQUMsVUFBVyxDQUNSLGFBRFEsd0JBR1IsR0FBSUEsQ0FBQUEsT0FBTywwQkFBT0MsT0FBTyxDQUFDLFdBQUQsQ0FBZCxDQUFYLENBQ0EsR0FBSUMsQ0FBQUEsSUFBSSwwQkFBVUQsT0FBTyxDQUFDLFFBQUQsQ0FBakIsQ0FBUixDQUNBLEdBQUlFLENBQUFBLEtBQUssMEJBQVNGLE9BQU8sQ0FBQyxTQUFELENBQWhCLENBQVQsQ0FDQSxHQUFJRyxDQUFBQSxLQUFLLDBCQUFTSCxPQUFPLENBQUMsU0FBRCxDQUFQLENBQW1CRyxLQUE1QixDQUFULENBQ0EsR0FBSUMsQ0FBQUEsS0FBSywwQkFBU0osT0FBTyxDQUFDLGdCQUFELENBQVAsQ0FBMEJJLEtBQW5DLENBQVQsQ0FDQSxHQUFJQyxDQUFBQSxLQUFLLDBCQUFTTCxPQUFPLENBQUMsU0FBRCxDQUFoQixDQUFULENBRUEsR0FBSU0sQ0FBQUEsSUFBSSwwQkFBRyw0QkFBQUMsT0FBTywrQkFBSSxJQUFKLENBQVYsQ0FBUixDQUNBLEdB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MkJBRURwRixJQUFJLENBQUM2WSxPQUFMLEVBQWdCRyxVQUFoQixDQUZDLDJCQUlEeFosUUFBUSxDQUFDLElBQUQsQ0FBTzJCLE9BQVAsQ0FBZ0I2WCxVQUFVLENBQUcsQ0FBN0IsQ0FBUixDQUNILENBQ0osQ0FWTSxDQUFQLENBV0gsQ0E3QnlDLENBQWIsQ0FBakMsQ0ErQkgsQ0EzcExEIiwic291cmNlc0NvbnRlbnQiOlsiLyohKi9cbi8vIENvcHlyaWdodCAyMDE0IFNwbHVuaywgSW5jLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik6IHlvdSBtYXlcbi8vIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluXG4vLyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUXG4vLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGVcbi8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIFxuICAgIHZhciBDb250ZXh0ICAgICA9IHJlcXVpcmUoJy4vY29udGV4dCcpO1xuICAgIHZhciBIdHRwICAgICAgICA9IHJlcXVpcmUoJy4vaHR0cCcpO1xuICAgIHZhciBBc3luYyAgICAgICA9IHJlcXVpcmUoJy4vYXN5bmMnKTtcbiAgICB2YXIgUGF0aHMgICAgICAgPSByZXF1aXJlKCcuL3BhdGhzJykuUGF0aHM7XG4gICAgdmFyIENsYXNzICAgICAgID0gcmVxdWlyZSgnLi9qcXVlcnkuY2xhc3MnKS5DbGFzcztcbiAgICB2YXIgdXRpbHMgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG4gICAgXG4gICAgdmFyIHJvb3QgPSBleHBvcnRzIHx8IHRoaXM7XG4gICAgdmFyIFNlcnZpY2UgPSBudWxsO1xuICAgIFxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvIFNwbHVuayBFbnRlcnByaXNlIGFuZCBTcGx1bmsgU3Rvcm0uXG4gICAgICogXG4gICAgICogVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgYW5kIGlzIHRoZXJlZm9yZSBTREstcHJpdmF0ZS5cbiAgICAgKiBcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMucHJpdmF0ZS5CYXNlU2VydmljZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLkNvbnRleHRcbiAgICAgKi9cbiAgICB2YXIgQmFzZVNlcnZpY2UgPSBDb250ZXh0LmV4dGVuZCh7XG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByb290IGFjY2VzcyBwb2ludCB0byBTcGx1bmsgZnVuY3Rpb25hbGl0eSB3aXRoIHR5cGVkIGFjY2VzcyB0byBcbiAgICAgKiBTcGx1bmsgcmVzb3VyY2VzIHN1Y2ggYXMgc2VhcmNoZXMsIGluZGV4ZXMsIGlucHV0cywgYW5kIG1vcmUuIFByb3ZpZGVzXG4gICAgICogbWV0aG9kcyB0byBhdXRoZW50aWNhdGUgYW5kIGNyZWF0ZSBzcGVjaWFsaXplZCBpbnN0YW5jZXMgb2YgdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLnByaXZhdGUuQmFzZVNlcnZpY2VcbiAgICAgKi9cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHJvb3QgPSBTZXJ2aWNlID0gQmFzZVNlcnZpY2UuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLkh0dHB9IGh0dHAgQW4gaW5zdGFuY2Ugb2YgYSBgc3BsdW5ranMuSHR0cGAgY2xhc3MuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbmFsIHBhcmFtZXRlcnM6IFxuICAgICAgICAgKiAgICAtIGBzY2hlbWVgIChfc3RyaW5nXyk6IFRoZSBzY2hlbWUgKFwiaHR0cFwiIG9yIFwiaHR0cHNcIikgZm9yIGFjY2Vzc2luZyBTcGx1bmsuXG4gICAgICAgICAqICAgIC0gYGhvc3RgIChfc3RyaW5nXyk6IFRoZSBob3N0IG5hbWUgKHRoZSBkZWZhdWx0IGlzIFwibG9jYWxob3N0XCIpLlxuICAgICAgICAgKiAgICAtIGBwb3J0YCAoX2ludGVnZXJfKTogVGhlIHBvcnQgbnVtYmVyICh0aGUgZGVmYXVsdCBpcyA4MDg5KS5cbiAgICAgICAgICogICAgLSBgdXNlcm5hbWVgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgYWNjb3VudCB1c2VybmFtZSwgd2hpY2ggaXMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIFNwbHVuayBpbnN0YW5jZS5cbiAgICAgICAgICogICAgLSBgcGFzc3dvcmRgIChfc3RyaW5nXyk6IFRoZSBwYXNzd29yZCwgd2hpY2ggaXMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIFNwbHVuayBpbnN0YW5jZS5cbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBvd25lciAodXNlcm5hbWUpIGNvbXBvbmVudCBvZiB0aGUgbmFtZXNwYWNlLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29tcG9uZW50IG9mIHRoZSBuYW1lc3BhY2UuXG4gICAgICAgICAqICAgIC0gYHNlc3Npb25LZXlgIChfc3RyaW5nXyk6IFRoZSBjdXJyZW50IHNlc3Npb24gdG9rZW4uXG4gICAgICAgICAqICAgIC0gYGF1dG9sb2dpbmAgKF9ib29sZWFuXyk6IGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2cgaW4gYWdhaW4gaWYgdGhlIHNlc3Npb24gdGVybWluYXRlcywgYGZhbHNlYCBpZiBub3QgKGB0cnVlYCBieSBkZWZhdWx0KS5cbiAgICAgICAgICogICAgLSBgdmVyc2lvbmAgKF9zdHJpbmdfKTogVGhlIHZlcnNpb24gc3RyaW5nIGZvciBTcGx1bmssIGZvciBleGFtcGxlIFwiNC4zLjJcIiAodGhlIGRlZmF1bHQgaXMgXCI1LjBcIikuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2V9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgIC8vIFdlIHBlcmZvcm0gdGhlIGJpbmRpbmdzIHNvIHRoYXQgZXZlcnkgZnVuY3Rpb24gd29ya3MgXG4gICAgICAgICAgICAvLyBwcm9wZXJseSB3aGVuIGl0IGlzIHBhc3NlZCBhcyBhIGNhbGxiYWNrLlxuICAgICAgICAgICAgdGhpcy5zcGVjaWFsaXplICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3BlY2lhbGl6ZSk7XG4gICAgICAgICAgICB0aGlzLmFwcHMgICAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5hcHBzKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbnMgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmNvbmZpZ3VyYXRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlcyAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmluZGV4ZXMpO1xuICAgICAgICAgICAgdGhpcy5zYXZlZFNlYXJjaGVzICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2F2ZWRTZWFyY2hlcyk7XG4gICAgICAgICAgICB0aGlzLmpvYnMgICAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5qb2JzKTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVzZXJzKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICAgIHRoaXMudmlld3MgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnZpZXdzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZWRBbGVydEdyb3VwcyAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZpcmVkQWxlcnRHcm91cHMpO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWxzICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGF0YU1vZGVscyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgYFNlcnZpY2VgIGluc3RhbmNlIGZvclxuICAgICAgICAgKiBhIHNwZWNpZmljIG5hbWVzcGFjZSBjb250ZXh0LiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc3ZjID0gLi4uO1xuICAgICAgICAgKiAgICAgIHZhciBuZXdTZXJ2aWNlID0gc3ZjLnNwZWNpYWxpemUoXCJteXVzZXJcIiwgXCJ1bml4XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3duZXIgVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwIFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlfSBUaGUgc3BlY2lhbGl6ZWQgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIHNwZWNpYWxpemU6IGZ1bmN0aW9uKG93bmVyLCBhcHApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmljZSh0aGlzLmh0dHAsIHtcbiAgICAgICAgICAgICAgICBzY2hlbWU6IHRoaXMuc2NoZW1lLFxuICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuaG9zdCwgICBcbiAgICAgICAgICAgICAgICBwb3J0OiB0aGlzLnBvcnQsICAgICAgIFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBvd25lcixcbiAgICAgICAgICAgICAgICBhcHA6IGFwcCwgXG4gICAgICAgICAgICAgICAgc2Vzc2lvbktleTogdGhpcy5zZXNzaW9uS2V5LFxuICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYEFwcGxpY2F0aW9uc2AgY29sbGVjdGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBcbiAgICAgICAgICogbGlzdCBpbnN0YWxsZWQgYXBwcyBhbmQgcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlbS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBMaXN0IGluc3RhbGxlZCBhcHBzXG4gICAgICAgICAqICAgICAgdmFyIGFwcHMgPSBzdmMuYXBwcygpO1xuICAgICAgICAgKiAgICAgIGFwcHMuZmV0Y2goZnVuY3Rpb24oZXJyKSB7IGNvbnNvbGUubG9nKGFwcHMubGlzdCgpKTsgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbn0gVGhlIGBBcHBsaWNhdGlvbnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBhcHBzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5BcHBsaWNhdGlvbnModGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYENvbmZpZ3VyYXRpb25zYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBcbiAgICAgICAgICogY3JlYXRlLCBsaXN0LCBhbmQgcmV0cmlldmUgY29uZmlndXJhdGlvbiAoLmNvbmYpIGZpbGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsIHByb3BlcnRpZXMgaW4gdGhlICdwcm9wcy5jb25mJyBmaWxlXG4gICAgICAgICAqICAgICAgdmFyIGZpbGVzID0gc3ZjLmNvbmZpZ3VyYXRpb25zKCk7XG4gICAgICAgICAqICAgICAgZmlsZXMuaXRlbShcInByb3BzXCIsIGZ1bmN0aW9uKGVyciwgcHJvcHNGaWxlKSB7XG4gICAgICAgICAqICAgICAgICAgIHByb3BzRmlsZS5mZXRjaChmdW5jdGlvbihlcnIsIHByb3BzKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwcm9wcy5wcm9wZXJ0aWVzKCkpOyBcbiAgICAgICAgICogICAgICAgICAgfSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zfSBUaGUgYENvbmZpZ3VyYXRpb25zYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgY29uZmlnc1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBjb25maWd1cmF0aW9uczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuQ29uZmlndXJhdGlvbnModGhpcywgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgSW5kZXhlc2AgY29sbGVjdGlvbiwgd2hpY2ggbGV0cyB5b3UgY3JlYXRlLCBcbiAgICAgICAgICogbGlzdCwgYW5kIHVwZGF0ZSBpbmRleGVzLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFuIF9pbnRlcm5hbCBpbmRleFxuICAgICAgICAgKiAgICAgIHZhciBpbmRleGVzID0gc3ZjLmluZGV4ZXMoKTtcbiAgICAgICAgICogICAgICBpbmRleGVzLmZldGNoKGZ1bmN0aW9uKGVyciwgaW5kZXhlcykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzLml0ZW0oXCJfaW50ZXJuYWxcIik7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiV2FzIGluZGV4IGZvdW5kOiBcIiArICEhaW5kZXgpO1xuICAgICAgICAgKiAgICAgICAgICAvLyBgaW5kZXhgIGlzIGFuIEluZGV4IG9iamVjdC5cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSW5kZXhlc30gVGhlIGBJbmRleGVzYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgZGF0YS9pbmRleGVzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc1xuICAgICAgICAgKi8gICAgICAgIFxuICAgICAgICBpbmRleGVzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHsgXG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuSW5kZXhlcyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBTYXZlZFNlYXJjaGVzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdVxuICAgICAgICAgKiBjcmVhdGUsIGxpc3QsIGFuZCB1cGRhdGUgc2F2ZWQgc2VhcmNoZXMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsICMgb2Ygc2F2ZWQgc2VhcmNoZXNcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2hlcyA9IHN2Yy5zYXZlZFNlYXJjaGVzKCk7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2hlcy5mZXRjaChmdW5jdGlvbihlcnIsIHNhdmVkU2VhcmNoZXMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCIjIE9mIFNhdmVkIFNlYXJjaGVzOiBcIiArIHNhdmVkU2VhcmNoZXMubGlzdCgpLmxlbmd0aCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXN9IFRoZSBgU2F2ZWRTZWFyY2hlc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi9cbiAgICAgICAgc2F2ZWRTZWFyY2hlczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuU2F2ZWRTZWFyY2hlcyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBTdG9yYWdlUGFzc3dvcmRzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdVxuICAgICAgICAgKiBjcmVhdGUsIGxpc3QsIGFuZCB1cGRhdGUgc3RvcmFnZSBwYXNzd29yZHMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsICMgb2Ygc3RvcmFnZSBwYXNzd29yZHNcbiAgICAgICAgICogICAgICB2YXIgc3RvcmFnZVBhc3N3b3JkcyA9IHN2Yy5zdG9yYWdlUGFzc3dvcmRzKCk7XG4gICAgICAgICAqICAgICAgc3RvcmFnZVBhc3N3b3Jkcy5mZXRjaChmdW5jdGlvbihlcnIsIHN0b3JhZ2VQYXNzd29yZHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCIjIG9mIFN0b3JhZ2UgUGFzc3dvcmRzOiBcIiArIHN0b3JhZ2VQYXNzd29yZHMubGlzdCgpLmxlbmd0aCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHN9IFRoZSBgU3RvcmFnZVBhc3N3b3Jkc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHN0b3JhZ2UvcGFzc3dvcmRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgc3RvcmFnZVBhc3N3b3JkczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuU3RvcmFnZVBhc3N3b3Jkcyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbmAgY29sbGVjdGlvbiwgd2hpY2ggbGV0cyB5b3VcbiAgICAgICAgICogbGlzdCBhbGVydCBncm91cHMuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgICAgIFxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsICMgb2YgZmlyZWQgYWxlcnQgZ3JvdXBzXG4gICAgICAgICAqICAgICAgdmFyIGZpcmVkQWxlcnRHcm91cHMgPSBzdmMuZmlyZWRBbGVydEdyb3VwcygpO1xuICAgICAgICAgKiAgICAgIGZpcmVkQWxlcnRHcm91cHMuZmV0Y2goZnVuY3Rpb24oZXJyLCBmaXJlZEFsZXJ0R3JvdXBzKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiIyBvZiBhbGVydCBncm91cHM6IFwiICsgZmlyZWRBbGVydEdyb3Vwcy5saXN0KCkubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbn0gVGhlIGBGaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBmaXJlZEFsZXJ0R3JvdXBzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBKb2JzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIGxpc3QsXG4gICAgICAgICAqIGFuZCByZXRyaWV2ZSBzZWFyY2ggam9icy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgam9iIElEc1xuICAgICAgICAgKiAgICAgIHZhciBqb2JzID0gc3ZjLmpvYnMoKTtcbiAgICAgICAgICogICAgICBqb2JzLmZldGNoKGZ1bmN0aW9uKGVyciwgam9icykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgbGlzdCA9IGpvYnMubGlzdCgpO1xuICAgICAgICAgKiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKb2IgXCIgKyAoaSsxKSArIFwiOiBcIiArIGxpc3RbaV0uc2lkKTtcbiAgICAgICAgICogICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Kb2JzfSBUaGUgYEpvYnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9ic1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIGpvYnM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkpvYnModGhpcywgbmFtZXNwYWNlKTsgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBEYXRhTW9kZWxzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIGxpc3QsXG4gICAgICAgICAqIGFuZCByZXRyaWV2ZSBkYXRhIG1vZGVscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGRhdGFtb2RlbC9tb2RlbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIGRhdGFNb2RlbHM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkRhdGFNb2RlbHModGhpcywgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFVzZXJzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIFxuICAgICAgICAgKiBsaXN0LCBhbmQgcmV0cmlldmUgdXNlcnMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsIHVzZXJuYW1lc1xuICAgICAgICAgKiAgICAgIHZhciB1c2VycyA9IHN2Yy51c2VycygpO1xuICAgICAgICAgKiAgICAgIHVzZXJzLmZldGNoKGZ1bmN0aW9uKGVyciwgdXNlcnMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIGxpc3QgPSB1c2Vycy5saXN0KCk7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVzZXIgXCIgKyAoaSsxKSArIFwiOiBcIiArIGxpc3RbaV0ucHJvcGVydGllcygpLm5hbWUpO1xuICAgICAgICAgKiAgICAgICAgICB9XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcnN9IFRoZSBgVXNlcnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhdXRob3JpemF0aW9uL3VzZXJzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuVXNlcnNcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Vc2Vycyh0aGlzKTsgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBWaWV3c2AgY29sbGVjdGlvbiwgd2hpY2ggbGV0cyB5b3UgY3JlYXRlLFxuICAgICAgICAgKiBsaXN0LCBhbmQgcmV0cmlldmUgdmlld3MgKGN1c3RvbSBVSXMgYnVpbHQgaW4gU3BsdW5rJ3MgYXBwIGZyYW1ld29yaykuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsIHZpZXdzXG4gICAgICAgICAqICAgICAgdmFyIHZpZXdzID0gc3ZjLnZpZXdzKCk7XG4gICAgICAgICAqICAgICAgdmlld3MuZmV0Y2goZnVuY3Rpb24oZXJyLCB2aWV3cykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgbGlzdCA9IHZpZXdzLmxpc3QoKTtcbiAgICAgICAgICogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmlldyBcIiArIChpKzEpICsgXCI6IFwiICsgbGlzdFtpXS5wcm9wZXJ0aWVzKCkubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld3N9IFRoZSBgVmlld3NgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBkYXRhL3VpL3ZpZXdzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuVmlld3NcbiAgICAgICAgICovXG4gICAgICAgIHZpZXdzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5WaWV3cyh0aGlzLCBuYW1lc3BhY2UpOyAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNlYXJjaCBqb2Igd2l0aCBhIGdpdmVuIHNlYXJjaCBxdWVyeSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycywgaW5jbHVkaW5nIGBleGVjX21vZGVgIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygc2VhcmNoOlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPW5vcm1hbGAgdG8gcmV0dXJuIGEgc2VhcmNoIGpvYiBJRCBpbW1lZGlhdGVseSAoZGVmYXVsdCkuXG4gICAgICAgICAqICAgICAgUG9sbCBmb3IgY29tcGxldGlvbiB0byBmaW5kIG91dCB3aGVuIHlvdSBjYW4gcmV0cmlldmUgc2VhcmNoIHJlc3VsdHMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPWJsb2NraW5nYCB0byByZXR1cm4gdGhlIHNlYXJjaCBqb2IgSUQgd2hlbiB0aGUgc2VhcmNoIGhhcyBmaW5pc2hlZC5cbiAgICAgICAgICogXG4gICAgICAgICAqIFRvIHJ1biBhIG9uZXNob3Qgc2VhcmNoLCB3aGljaCBkb2VzIG5vdCBjcmVhdGUgYSBqb2IgYnV0IHJhdGhlciByZXR1cm5zIHRoZSBzZWFyY2ggcmVzdWx0cywgdXNlIGBTZXJ2aWNlLm9uZXNob3RTZWFyY2hgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2Uuc2VhcmNoKFwic2VhcmNoIEVSUk9SXCIsIHtpZDogXCJteWpvYl8xMjNcIn0sIGZ1bmN0aW9uKGVyciwgbmV3Sm9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiOiBuZXdKb2Iuc2lkKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiIGh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIGpvYjogYChlcnIsIGNyZWF0ZWRKb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgc2VhcmNoOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBuYW1lc3BhY2UsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24obmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmFtZXNwYWNlO1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBqb2JzID0gbmV3IHJvb3QuSm9icyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGpvYnMuc2VhcmNoKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGEgYEpvYmAgYnkgaXRzIHNpZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNpZCBUaGUgc2VhcmNoIElEIGZvciBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgY3JlYXRlZCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0Sm9iOiBmdW5jdGlvbihzaWQsIG5hbWVzcGFjZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBqb2IgPSBuZXcgcm9vdC5Kb2IodGhpcywgc2lkLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGpvYi5mZXRjaCh7fSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBvbmVzaG90IHNlYXJjaCBmcm9tIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2Uub25lc2hvdFNlYXJjaChcInNlYXJjaCBFUlJPUlwiLCB7aWQ6IFwibXlqb2JfMTIzXCJ9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJSRVNVTFQgRklFTERTXCI6IHJlc3VsdHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBzZWFyY2g6XG4gICAgICAgICAqICAgIC0gYG91dHB1dF9tb2RlYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIHJlc3VsdHMgKFhNTCwgSlNPTiwgb3IgQ1NWKS5cbiAgICAgICAgICogICAgLSBgZWFybGllc3RfdGltZWAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIHRoZSBlYXJsaWVzdCB0aW1lIGluIHRoZSB0aW1lIHJhbmdlIHRvIHNlYXJjaC4gVGhlIHRpbWUgc3RyaW5nIGNhbiBiZSBhIFVUQyB0aW1lICh3aXRoIGZyYWN0aW9uYWwgc2Vjb25kcyksIGEgcmVsYXRpdmUgdGltZSBzcGVjaWZpZXIgKHRvIG5vdyksIG9yIGEgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgICAgICAgKiAgICAtIGBsYXRlc3RfdGltZWAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIHRoZSBsYXRlc3QgdGltZSBpbiB0aGUgdGltZSByYW5nZSB0byBzZWFyY2guIFRoZSB0aW1lIHN0cmluZyBjYW4gYmUgYSBVVEMgdGltZSAod2l0aCBmcmFjdGlvbmFsIHNlY29uZHMpLCBhIHJlbGF0aXZlIHRpbWUgc3BlY2lmaWVyICh0byBub3cpLCBvciBhIGZvcm1hdHRlZCB0aW1lIHN0cmluZy5cbiAgICAgICAgICogICAgLSBgcmZgIChfc3RyaW5nXyk6IFNwZWNpZmllcyBvbmUgb3IgbW9yZSBmaWVsZHMgdG8gYWRkIHRvIHRoZSBzZWFyY2guXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoOiBgKGVyciwgcmVzdWx0cylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBvbmVzaG90U2VhcmNoOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBuYW1lc3BhY2UsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24obmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmFtZXNwYWNlO1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBqb2JzID0gbmV3IHJvb3QuSm9icyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGpvYnMub25lc2hvdFNlYXJjaChxdWVyeSwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdXNlciB0aGF0IGlzIGN1cnJlbnRseSBsb2dnZWQgaW4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5jdXJyZW50VXNlcihmdW5jdGlvbihlcnIsIHVzZXIpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJSZWFsIG5hbWU6IFwiLCB1c2VyLnByb3BlcnRpZXMoKS5yZWFsbmFtZSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSB1c2VyIGluc3RhbmNlOiBgKGVyciwgdXNlcilgLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLmN1cnJlbnRVc2VyfSBUaGUgYFVzZXJgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgYXV0aG9yaXphdGlvbi9jdXJyZW50LWNvbnRleHRcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBjdXJyZW50VXNlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMuZ2V0KFBhdGhzLmN1cnJlbnRVc2VyLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcm5hbWUgPSByZXNwb25zZS5kYXRhLmVudHJ5WzBdLmNvbnRlbnQudXNlcm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c2VyID0gbmV3IHJvb3QuVXNlcih0aGF0LCB1c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHVzZXIuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxLndhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5zZXJ2ZXJJbmZvKGZ1bmN0aW9uKGVyciwgaW5mbykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNwbHVuayBWZXJzaW9uOiBcIiwgaW5mby5wcm9wZXJ0aWVzKCkudmVyc2lvbik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZXJ2ZXIgaW5mbzogYChlcnIsIGluZm8pYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlcnZlci9pbmZvXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgc2VydmVySW5mbzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHNlcnZlckluZm8gPSBuZXcgcm9vdC5TZXJ2ZXJJbmZvKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHNlcnZlckluZm8uZmV0Y2goY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBhIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLnBhcnNlKFwic2VhcmNoIGluZGV4PV9pbnRlcm5hbCB8IGhlYWQgMVwiLCBmdW5jdGlvbihlcnIsIHBhcnNlKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ29tbWFuZHM6IFwiLCBwYXJzZS5jb21tYW5kcyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5IHRvIHBhcnNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEFuIG9iamVjdCBvZiBvcHRpb25zIGZvciB0aGUgcGFyc2VyOlxuICAgICAgICAgKiAgICAtIGBlbmFibGVfbG9va3Vwc2AgKF9ib29sZWFuXyk6IElmIGB0cnVlYCwgcGVyZm9ybXMgcmV2ZXJzZSBsb29rdXBzIHRvIGV4cGFuZCB0aGUgc2VhcmNoIGV4cHJlc3Npb24uXG4gICAgICAgICAqICAgIC0gYG91dHB1dF9tb2RlYCAoX3N0cmluZ18pOiBUaGUgb3V0cHV0IGZvcm1hdCAoWE1MIG9yIEpTT04pLlxuICAgICAgICAgKiAgICAtIGBwYXJzZV9vbmx5YCAoX2Jvb2xlYW5fKTogSWYgYHRydWVgLCBkaXNhYmxlcyB0aGUgZXhwYW5zaW9uIG9mIHNlYXJjaCBkdWUgdG8gZXZhbHVhdGlvbiBvZiBzdWJzZWFyY2hlcywgdGltZSB0ZXJtIGV4cGFuc2lvbiwgbG9va3VwcywgdGFncywgZXZlbnR0eXBlcywgYW5kIHNvdXJjZXR5cGUgYWxpYXMuXG4gICAgICAgICAqICAgIC0gYHJlbG9hZF9tYWNyb3NgIChfYm9vbGVhbl8pOiBJZiBgdHJ1ZWAsIHJlbG9hZHMgbWFjcm8gZGVmaW5pdGlvbnMgZnJvbSBtYWNyb3MuY29uZi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHBhcnNlIGluZm86IGAoZXJyLCBwYXJzZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL3BhcnNlclxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXJhbXMucSA9IHF1ZXJ5O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoUGF0aHMucGFyc2VyLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm92aWRlcyBhdXRvLWNvbXBsZXRlIHN1Z2dlc3Rpb25zIGZvciBzZWFyY2ggcXVlcmllcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLnR5cGVhaGVhZChcImluZGV4PVwiLCAxMCwgZnVuY3Rpb24oZXJyLCBvcHRpb25zKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQXV0b2NvbXBsZXRpb24gb3B0aW9uczogXCIsIG9wdGlvbnMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4IFRoZSBxdWVyeSBmcmFnbWVudCB0byBhdXRvY29tcGxldGUuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIG9wdGlvbnMgdG8gcmV0dXJuIChvcHRpb25hbCkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBhdXRvY29tcGxldGlvbiBpbmZvOiBgKGVyciwgb3B0aW9ucylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL3R5cGVhaGVhZFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIHR5cGVhaGVhZDogZnVuY3Rpb24ocHJlZml4LCBjb3VudCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihjb3VudCkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNvdW50O1xuICAgICAgICAgICAgICAgIGNvdW50ID0gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgY291bnQ6IGNvdW50IHx8IDEwLFxuICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoUGF0aHMudHlwZWFoZWFkLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0cyA9IChyZXNwb25zZS5kYXRhIHx8IHt9KS5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzIHx8IFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2dzIGFuIGV2ZW50IHRvIFNwbHVuay5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmxvZyhcIkEgbmV3IGV2ZW50XCIsIHtpbmRleDogXCJfaW50ZXJuYWxcIiwgc291cmNldHlwZTogXCJteXNvdXJjZXR5cGVcIn0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3VibWl0dGVkIGV2ZW50OiBcIiwgcmVzdWx0KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBldmVudCBUaGUgdGV4dCBmb3IgdGhpcyBldmVudCwgb3IgYSBKU09OIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcGFyYW1ldGVycyBmb3IgaW5kZXhpbmc6IFxuICAgICAgICAgKiAgICAtIGBpbmRleGAgKF9zdHJpbmdfKTogVGhlIGluZGV4IHRvIHNlbmQgZXZlbnRzIGZyb20gdGhpcyBpbnB1dCB0by5cbiAgICAgICAgICogICAgLSBgaG9zdGAgKF9zdHJpbmdfKTogVGhlIHZhbHVlIHRvIHBvcHVsYXRlIGluIHRoZSBIb3N0IGZpZWxkIGZvciBldmVudHMgZnJvbSB0aGlzIGRhdGEgaW5wdXQuIFxuICAgICAgICAgKiAgICAtIGBob3N0X3JlZ2V4YCAoX3N0cmluZ18pOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGV4dHJhY3QgdGhlIGhvc3QgdmFsdWUgZnJvbSBlYWNoIGV2ZW50LiBcbiAgICAgICAgICogICAgLSBgc291cmNlYCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIFNvdXJjZSBmaWVsZCBmb3IgZXZlbnRzIGZyb20gdGhpcyBkYXRhIGlucHV0LlxuICAgICAgICAgKiAgICAtIGBzb3VyY2V0eXBlYCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIFNvdXJjZXR5cGUgZmllbGQgZm9yIGV2ZW50cyBmcm9tIHRoaXMgZGF0YSBpbnB1dC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHN1Ym1pdHRlZDogYChlcnIsIHJlc3VsdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgcmVjZWl2ZXJzL3NpbXBsZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIGxvZzogZnVuY3Rpb24oZXZlbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIGEgSlNPTiBvYmplY3QsIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcuXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy5wYXRocy5zdWJtaXRFdmVudDtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgIHZhciBoZWFkZXJzID0ge1wiQ29udGVudC1UeXBlXCI6IFwidGV4dC9wbGFpblwifTtcbiAgICAgICAgICAgIHZhciBib2R5ID0gZXZlbnQ7XG4gICAgICAgICAgICB2YXIgZ2V0ID0gcGFyYW1zO1xuICAgICAgICAgICAgdmFyIHBvc3QgPSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucmVxdWVzdChcbiAgICAgICAgICAgICAgICBwYXRoLCBcbiAgICAgICAgICAgICAgICBtZXRob2QsIFxuICAgICAgICAgICAgICAgIGdldCwgXG4gICAgICAgICAgICAgICAgcG9zdCwgXG4gICAgICAgICAgICAgICAgYm9keSwgXG4gICAgICAgICAgICAgICAgaGVhZGVycywgXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSBiYXNlIGRlZmluaXRpb24gZm9yIGEgU3BsdW5rIGVuZHBvaW50LCB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mXG4gICAgICogYSBzcGVjaWZpYyBzZXJ2aWNlIGFuZCBwYXRoLiBQcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBHRVQsIFBPU1QsIGFuZFxuICAgICAqIERFTEVURSBvcGVyYXRpb25zIHVzZWQgaW4gc3BsdW5ranMsIGF1dG9tYXRpY2FsbHkgcHJlcGFyaW5nIHRoZSBwYXRoIGNvcnJlY3RseVxuICAgICAqIGFuZCBhbGxvd2luZyBmb3IgcmVsYXRpdmUgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAqL1xuICAgIHJvb3QuRW5kcG9pbnQgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1YWxpZmllZFBhdGggQSBmdWxseS1xdWFsaWZpZWQgcmVsYXRpdmUgZW5kcG9pbnQgcGF0aCAoZm9yIGV4YW1wbGUsIFwiL3NlcnZpY2VzL3NlYXJjaC9qb2JzXCIpLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgcXVhbGlmaWVkUGF0aCkge1xuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFzc2VkIGluIGEgbnVsbCBTZXJ2aWNlLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFxdWFsaWZpZWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFzc2VkIGluIGFuIGVtcHR5IHBhdGguXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICAgICAgdGhpcy5xdWFsaWZpZWRQYXRoID0gcXVhbGlmaWVkUGF0aDtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLmdldCAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5nZXQpO1xuICAgICAgICAgICAgdGhpcy5nZXRfdjIgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZ2V0X3YyKTtcbiAgICAgICAgICAgIHRoaXMucG9zdCAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnBvc3QpO1xuICAgICAgICAgICAgdGhpcy5kZWwgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGVsKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGVyZm9ybXMgYSByZWxhdGl2ZSBHRVQgcmVxdWVzdCBvbiBhbiBlbmRwb2ludCdzIHBhdGgsXG4gICAgICAgICAqIGNvbWJpbmVkIHdpdGggdGhlIHBhcmFtZXRlcnMgYW5kIGEgcmVsYXRpdmUgcGF0aCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gV2lsbCBtYWtlIGEgcmVxdWVzdCB0byB7c2VydmljZS5wcmVmaXh9L3NlYXJjaC9qb2JzLzEyMzQ1Ni9yZXN1bHRzP29mZnNldD0xXG4gICAgICAgICAqICAgICAgdmFyIGVuZHBvaW50ID0gbmV3IHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnQoc2VydmljZSwgXCJzZWFyY2gvam9icy8xMjM0NVwiKTtcbiAgICAgICAgICogICAgICBlbmRwb2ludC5nZXQoXCJyZXN1bHRzXCIsIHtvZmZzZXQ6IDF9LCBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coXCJET05FXCIpKX0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVscGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gYXBwZW5kIHRvIHRoZSBlbmRwb2ludCBwYXRoLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBlbnRpdHktc3BlY2lmaWMgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGU6IGAoZXJyLCByZXNwb25zZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24ocmVscGF0aCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMucXVhbGlmaWVkUGF0aDtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGgsIHdlIHdpbGwgYXBwZW5kIGl0IHdpdGggYSBwcmVjZWRpbmdcbiAgICAgICAgICAgIC8vIHNsYXNoLlxuICAgICAgICAgICAgaWYgKHJlbHBhdGgpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBcIi9cIiArIHJlbHBhdGg7ICAgIFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldF92MjogZnVuY3Rpb24ocmVscGF0aCwgcGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0X3YyKFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIHJlbGF0aXZlIFBPU1QgcmVxdWVzdCBvbiBhbiBlbmRwb2ludCdzIHBhdGgsXG4gICAgICAgICAqIGNvbWJpbmVkIHdpdGggdGhlIHBhcmFtZXRlcnMgYW5kIGEgcmVsYXRpdmUgcGF0aCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gV2lsbCBtYWtlIGEgcmVxdWVzdCB0byB7c2VydmljZS5wcmVmaXh9L3NlYXJjaC9qb2JzLzEyMzQ1Ni9jb250cm9sXG4gICAgICAgICAqICAgICAgdmFyIGVuZHBvaW50ID0gbmV3IHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnQoc2VydmljZSwgXCJzZWFyY2gvam9icy8xMjM0NVwiKTtcbiAgICAgICAgICogICAgICBlbmRwb2ludC5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImNhbmNlbFwifSwgZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKFwiQ0FOQ0VMTEVEXCIpKX0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVscGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gYXBwZW5kIHRvIHRoZSBlbmRwb2ludCBwYXRoLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBlbnRpdHktc3BlY2lmaWMgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIGJvZHkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlOiBgKGVyciwgcmVzcG9uc2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBwb3N0OiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UucG9zdChcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIHJlbGF0aXZlIERFTEVURSByZXF1ZXN0IG9uIGFuIGVuZHBvaW50J3MgcGF0aCxcbiAgICAgICAgICogY29tYmluZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhbmQgYSByZWxhdGl2ZSBwYXRoIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBXaWxsIG1ha2UgYSByZXF1ZXN0IHRvIHtzZXJ2aWNlLnByZWZpeH0vc2VhcmNoL2pvYnMvMTIzNDU2XG4gICAgICAgICAqICAgICAgdmFyIGVuZHBvaW50ID0gbmV3IHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnQoc2VydmljZSwgXCJzZWFyY2gvam9icy8xMjM0NVwiKTtcbiAgICAgICAgICogICAgICBlbmRwb2ludC5kZWxldGUoXCJcIiwge30sIGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhcIkRFTEVURURcIikpfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWxwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGVuZHBvaW50IHBhdGguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZTogYChlcnIsIHJlc3BvbnNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAgICAgKi9cbiAgICAgICAgZGVsOiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsKFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGJhc2UgZGVmaW5pdGlvbiBmb3IgYSBTcGx1bmsgcmVzb3VyY2UgKGZvciBleGFtcGxlLCBhbiBlbnRpdHkgXG4gICAgICogc3VjaCBhcyBhbiBpbmRleCBvciBzZWFyY2ggam9iLCBvciBhIGNvbGxlY3Rpb24gb2YgZW50aXRpZXMpLiBQcm92aWRlcyBcbiAgICAgKiBiYXNpYyBtZXRob2RzIGZvciBoYW5kbGluZyBTcGx1bmsgcmVzb3VyY2VzLCBzdWNoIGFzIHZhbGlkYXRpb24gYW5kIFxuICAgICAqIGFjY2Vzc2luZyBwcm9wZXJ0aWVzLiBcbiAgICAgKlxuICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJlY2F1c2UgbW9zdCBtZXRob2RzIGFyZSBtZWFudCB0byBiZSBvdmVycmlkZGVuLlxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICovXG4gICAgcm9vdC5SZXNvdXJjZSA9IHJvb3QuRW5kcG9pbnQuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEEgcmVsYXRpdmUgZW5kcG9pbnQgcGF0aCAoZm9yIGV4YW1wbGUsIFwic2VhcmNoL2pvYnNcIikuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgcGF0aCwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB2YXIgZnVsbHBhdGggPSBzZXJ2aWNlLmZ1bGxwYXRoKHBhdGgsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIGZ1bGxwYXRoKTtcbiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLl9sb2FkICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLl9sb2FkKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2ggICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmV0Y2gpO1xuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wYXRoICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTVVTVCBCRSBPVkVSUklEREVOXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSByZXNvdXJjZSBhbmQgc3RvcmVzIHRoZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIF9sb2FkOiBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gcHJvcGVydGllcyB8fCB7fTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWZyZXNoZXMgdGhlIHJlc291cmNlIGJ5IGZldGNoaW5nIHRoZSBvYmplY3QgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAqIGFuZCBsb2FkaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJldHJpZXZlZDogYChlcnIsIHJlc291cmNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1VU1QgQkUgT1ZFUlJJRERFTlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgcHJvcGVydGllcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgcHJvcGVydGllcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBwcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBmdWxsIHN0YXRlIChwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSkgb2YgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY3VycmVudCBmdWxsIHN0YXRlIG9mIHRoaXMgcmVzb3VyY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGEgU3BsdW5rIGVudGl0eSwgd2hpY2ggaXMgYSB3ZWxsLWRlZmluZWQgY29uc3RydWN0XG4gICAgICogd2l0aCBjZXJ0YWluIG9wZXJhdGlvbnMgKHN1Y2ggYXMgXCJwcm9wZXJ0aWVzXCIsIFwidXBkYXRlXCIsIGFuZCBcImRlbGV0ZVwiKS4gXG4gICAgICogRW50aXRpZXMgaW5jbHVkZSBzZWFyY2ggam9icywgaW5kZXhlcywgaW5wdXRzLCBhcHBzLCBhbmQgbW9yZS4gXG4gICAgICpcbiAgICAgKiBQcm92aWRlcyBiYXNpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggU3BsdW5rIGVudGl0aWVzLCBzdWNoIGFzIGZldGNoaW5nIGFuZFxuICAgICAqIHVwZGF0aW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICovXG4gICAgcm9vdC5FbnRpdHkgPSByb290LlJlc291cmNlLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHN0YXRpYyBwcm9wZXJ0eSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBcbiAgICAgICAgICogdXBkYXRlIHRvIGdldCB0aGUgdXBkYXRlZCBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IFxuICAgICAgICAgKiBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnMgKGVjaG9lcykgdGhlIHVwZGF0ZWQgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaE9uVXBkYXRlOiBmYWxzZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRW50aXR5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggQSByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCJzZWFyY2gvam9ic1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRW50aXR5fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBwYXRoLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFdlIHBlcmZvcm0gdGhlIGJpbmRpbmdzIHNvIHRoYXQgZXZlcnkgZnVuY3Rpb24gd29ya3MgXG4gICAgICAgICAgICAvLyBwcm9wZXJseSB3aGVuIGl0IGlzIHBhc3NlZCBhcyBhIGNhbGxiYWNrLlxuICAgICAgICAgICAgdGhpcy5fbG9hZCAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuX2xvYWQpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaCAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmV0Y2gpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkcyAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5maWVsZHMpO1xuICAgICAgICAgICAgdGhpcy5saW5rcyAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMubGlua3MpO1xuICAgICAgICAgICAgdGhpcy5hY2wgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuYWNsKTtcbiAgICAgICAgICAgIHRoaXMuYXV0aG9yICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmF1dGhvcik7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZWQgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGVkKTtcbiAgICAgICAgICAgIHRoaXMucHVibGlzaGVkID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnB1Ymxpc2hlZCk7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZSAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5lbmFibGUpO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGlzYWJsZSk7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZCAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZWxvYWQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fZmllbGRzICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fYWNsICAgICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICA9IHt9O1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBlbnRpdHkgYW5kIHN0b3JlcyB0aGUgcHJvcGVydGllcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIF9sb2FkOiBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gdXRpbHMuaXNBcnJheShwcm9wZXJ0aWVzKSA/IHByb3BlcnRpZXNbMF0gOiBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIHRvXG4gICAgICAgICAgICAvLyBlbXB0eSB2YWx1ZXNcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB7fSxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICAgICAgICAgIGFjbDoge30sXG4gICAgICAgICAgICAgICAgbGlua3M6IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9zdXBlcihwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGFrZSBvdXQgdGhlIGVudGl0eS1zcGVjaWZpYyBjb250ZW50XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcy5jb250ZW50ICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl9maWVsZHMgICAgID0gcHJvcGVydGllcy5maWVsZHMgICAgfHwgdGhpcy5fZmllbGRzIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fYWNsICAgICAgICA9IHByb3BlcnRpZXMuYWNsICAgICAgIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICA9IHByb3BlcnRpZXMubGlua3MgICAgIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fYXV0aG9yICAgICA9IHByb3BlcnRpZXMuYXV0aG9yICAgIHx8IG51bGw7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVkICAgID0gcHJvcGVydGllcy51cGRhdGVkICAgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2hlZCAgPSBwcm9wZXJ0aWVzLnB1Ymxpc2hlZCB8fCBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGRzIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eSwgaW5kaWNhdGluZyB3aGljaCBcbiAgICAgICAgICogZmllbGRzIGFyZSB3aWxkY2FyZHMsIHJlcXVpcmVkLCBhbmQgb3B0aW9uYWwuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZpZWxkcyBpbmZvcm1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgZmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IChBQ0wpIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eSxcbiAgICAgICAgICogd2hpY2ggY29udGFpbnMgdGhlIHBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgdGhlIGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgQUNMLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBhY2w6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjbDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpbmtzIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eSwgd2hpY2ggaXMgdGhlIFVSSSBvZlxuICAgICAgICAgKiB0aGUgZW50aXR5IHJlbGF0aXZlIHRvIHRoZSBtYW5hZ2VtZW50IHBvcnQgb2YgYSBTcGx1bmsgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGxpbmtzIGluZm9ybWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGlua3M7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBhdXRob3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBhdXRob3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGF1dGhvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgdXBkYXRlZCB0aW1lIGZvciB0aGlzIGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgdXBkYXRlZCB0aW1lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgcHVibGlzaGVkIHRpbWUgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBwdWJsaXNoZWQgdGltZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgcHVibGlzaGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVmcmVzaGVzIHRoZSBlbnRpdHkgYnkgZmV0Y2hpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIFxuICAgICAgICAgKiBsb2FkaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvcHRpb25hbCBkaWN0aW9uYXJ5IG9mIGNvbGxlY3Rpb24gZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uIG9wdGlvbnM6XG4gICAgICAgICAqICAgIC0gYGNvdW50YCAoX2ludGVnZXJfKTogVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAgICAgICAgICogICAgLSBgb2Zmc2V0YCAoX2ludGVnZXJfKTogVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgaXRlbSB0byByZXR1cm4uXG4gICAgICAgICAqICAgIC0gYHNlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBxdWVyeSB0byBmaWx0ZXIgcmVzcG9uc2VzLlxuICAgICAgICAgKiAgICAtIGBzb3J0X2RpcmAgKF9zdHJpbmdfKTogVGhlIGRpcmVjdGlvbiB0byBzb3J0IHJldHVybmVkIGl0ZW1zOiDigJxhc2PigJ0gb3Ig4oCcZGVzY+KAnS5cbiAgICAgICAgICogICAgLSBgc29ydF9rZXlgIChfc3RyaW5nXyk6IFRoZSBmaWVsZCB0byB1c2UgZm9yIHNvcnRpbmcgKG9wdGlvbmFsKS5cbiAgICAgICAgICogICAgLSBgc29ydF9tb2RlYCAoX3N0cmluZ18pOiBUaGUgY29sbGF0aW5nIHNlcXVlbmNlIGZvciBzb3J0aW5nIHJldHVybmVkIGl0ZW1zOiDigJxhdXRv4oCdLCDigJxhbHBoYeKAnSwg4oCcYWxwaGFfY2FzZeKAnSwgb3Ig4oCcbnVt4oCdLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJldHJpZXZlZDogYChlcnIsIHJlc291cmNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcIlwiLCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuZGF0YSA/IHJlc3BvbnNlLmRhdGEuZW50cnkgOiBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogRGVsZXRlcyB0aGUgZW50aXR5IGZyb20gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkOiBgKGVycilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsKFwiXCIsIHt9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgZW50aXR5IG9uIHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyB0byB1cGRhdGUgdGhlIG9iamVjdCB3aXRoLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQ6IGAoZXJyLCBlbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb3BzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCAnbmFtZScgZmllbGQgaW4gJ3VwZGF0ZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJcIiwgcHJvcHMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVyciAmJiAhdGhhdC5mZXRjaE9uVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuZGF0YS5lbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFlcnIgJiYgdGhhdC5mZXRjaE9uVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxLndhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGVzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBkaXNhYmxlZDogYChlcnIsIGVudGl0eSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMucG9zdChcImRpc2FibGVcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBlbmFibGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnBvc3QoXCJlbmFibGVcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxvYWRzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyByZWxvYWRlZDogYChlcnIsIGVudGl0eSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHJlbG9hZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5wb3N0KFwiX3JlbG9hZFwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgYmFzZSBjbGFzcyBmb3IgYSBTcGx1bmsgY29sbGVjdGlvbiwgd2hpY2ggaXMgYSB3ZWxsLWRlZmluZWQgY29uc3RydWN0XG4gICAgICogdGhhdCBwcm92aWRlcyBiYXNpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggY29sbGVjdGlvbnMgb2YgZW50aXRpZXMsIHN1Y2ggYXMgXG4gICAgICogY3JlYXRpbmcgYW5kIGxpc3RpbmcgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAqL1xuICAgIHJvb3QuQ29sbGVjdGlvbiA9IHJvb3QuUmVzb3VyY2UuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc3RhdGljIHByb3BlcnR5IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIFxuICAgICAgICAgKiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgZmV0Y2hlZCBcbiAgICAgICAgICogYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJucyAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cblxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiBmYWxzZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEEgcmVsYXRpdmUgZW5kcG9pbnQgcGF0aCAoZm9yIGV4YW1wbGUsIFwic2VhcmNoL2pvYnNcIikuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb259IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25gIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi8gICAgIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBwYXRoLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFdlIHBlcmZvcm0gdGhlIGJpbmRpbmdzIHNvIHRoYXQgZXZlcnkgZnVuY3Rpb24gd29ya3MgXG4gICAgICAgICAgICAvLyBwcm9wZXJseSB3aGVuIGl0IGlzIHBhc3NlZCBhcyBhIGNhbGxiYWNrLlxuICAgICAgICAgICAgdGhpcy5fbG9hZCAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5fbG9hZCk7XG4gICAgICAgICAgICB0aGlzLmZldGNoICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZldGNoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY3JlYXRlKTtcbiAgICAgICAgICAgIHRoaXMubGlzdCAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMubGlzdCk7XG4gICAgICAgICAgICB0aGlzLml0ZW0gICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLml0ZW0pO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG4gICAgICAgICAgICB0aGlzLl9lbnRpdGllcyAgICAgICA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZW50aXRpZXNCeU5hbWUgPSB7fTsgICAgXG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5nICAgICAgICAgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2xpbmtzICAgICAgICAgID0ge307IFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBlbnRpdHkuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRW50aXR5YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTVVTVCBCRSBPVkVSUklEREVOXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBjb2xsZWN0aW9uIGFuZCBwcm9wZXJ0aWVzLCBhbmQgY3JlYXRlcyBhIG1hcCBvZiBlbnRpdHlcbiAgICAgICAgICogbmFtZXMgdG8gZW50aXR5IElEcyAoZm9yIHJldHJpZXZhbCBwdXJwb3NlcykuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfbG9hZDogZnVuY3Rpb24ocHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIocHJvcGVydGllcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGVudGl0aWVzQnlOYW1lID0ge307XG4gICAgICAgICAgICB2YXIgZW50aXR5UHJvcGVydHlMaXN0ID0gcHJvcGVydGllcy5lbnRyeSB8fCBbXTtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbnRpdHlQcm9wZXJ0eUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBlbnRpdHlQcm9wZXJ0eUxpc3RbaV07XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IHRoaXMuaW5zdGFudGlhdGVFbnRpdHkocHJvcHMpO1xuICAgICAgICAgICAgICAgIGVudGl0eS5fbG9hZChwcm9wcyk7XG4gICAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChlbnRpdGllc0J5TmFtZS5oYXNPd25Qcm9wZXJ0eShlbnRpdHkubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNCeU5hbWVbZW50aXR5Lm5hbWVdLnB1c2goZW50aXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzQnlOYW1lW2VudGl0eS5uYW1lXSA9IFtlbnRpdHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzICAgICAgID0gZW50aXRpZXM7XG4gICAgICAgICAgICB0aGlzLl9lbnRpdGllc0J5TmFtZSA9IGVudGl0aWVzQnlOYW1lO1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5nICAgICAgICAgPSBwcm9wZXJ0aWVzLnBhZ2luZyAgICB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX2xpbmtzICAgICAgICAgID0gcHJvcGVydGllcy5saW5rcyAgICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVkICAgICAgICA9IHByb3BlcnRpZXMudXBkYXRlZCAgIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBsaW5rcyBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb2xsZWN0aW9uLCB3aGljaCBpcyB0aGUgVVJJIG9mXG4gICAgICAgICAqIHRoZSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgbWFuYWdlbWVudCBwb3J0IG9mIGEgU3BsdW5rIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBsaW5rcyBpbmZvcm1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5rcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGF1dGhvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBhdXRob3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwYWdpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHVwZGF0ZWQgdGltZSBmb3IgdGhpcyBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1cGRhdGVkIHRpbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlZnJlc2hlcyB0aGUgcmVzb3VyY2UgYnkgZmV0Y2hpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIFxuICAgICAgICAgKiBsb2FkaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgY291bnRgIChfaW50ZWdlcl8pOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLlxuICAgICAgICAgKiAgICAtIGBvZmZzZXRgIChfaW50ZWdlcl8pOiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtIHRvIHJldHVybi5cbiAgICAgICAgICogICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHRvIGZpbHRlciByZXNwb25zZXMuXG4gICAgICAgICAqICAgIC0gYHNvcnRfZGlyYCAoX3N0cmluZ18pOiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgcmV0dXJuZWQgaXRlbXM6IOKAnGFzY+KAnSBvciDigJxkZXNj4oCdLlxuICAgICAgICAgKiAgICAtIGBzb3J0X2tleWAgKF9zdHJpbmdfKTogVGhlIGZpZWxkIHRvIHVzZSBmb3Igc29ydGluZyAob3B0aW9uYWwpLlxuICAgICAgICAgKiAgICAtIGBzb3J0X21vZGVgIChfc3RyaW5nXyk6IFRoZSBjb2xsYXRpbmcgc2VxdWVuY2UgZm9yIHNvcnRpbmcgcmV0dXJuZWQgaXRlbXM6IOKAnGF1dG/igJ0sIOKAnGFscGhh4oCdLCDigJxhbHBoYV9jYXNl4oCdLCBvciDigJxudW3igJ0uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmV0cmlldmVkOiBgKGVyciwgcmVzb3VyY2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGZldGNoOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoYXQuZ2V0KFwiXCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9sb2FkKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcblxuICAgICAgICBmZXRjaF92MjogYXN5bmMgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgdGhhdC5nZXRfdjIoXCJcIiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAvLyByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB0aGF0Ll9sb2FkKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHNwZWNpZmljIGVudGl0eSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHBzID0gc2VydmljZS5hcHBzKCk7XG4gICAgICAgICAqICAgICAgYXBwcy5mZXRjaChmdW5jdGlvbihlcnIsIGFwcHMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIGFwcCA9IGFwcHMuaXRlbShcInNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTZWFyY2ggQXBwIEZvdW5kOiBcIiArICEhYXBwKTtcbiAgICAgICAgICogICAgICAgICAgLy8gYGFwcGAgaXMgYW4gQXBwbGljYXRpb24gb2JqZWN0LlxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0byByZXRyaWV2ZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSB3aWxkY2FyZCB2YWx1ZSBcIi1cIiwgaXMgbm90IGFjY2VwdGFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGVudGl0eS5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSB3aWxkY2FyZCB2YWx1ZSBcIi1cIiBpcyB1bmFjY2VwdGFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGVudGl0eS5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybnMge3NwbHVua2pzLlNlcnZpY2UuRW50aXR5fSBUaGUgZW50aXR5LCBvciBgbnVsbGAgaWYgb25lIGlzIG5vdCBmb3VuZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW06IGZ1bmN0aW9uKGlkLCBuYW1lc3BhY2UpIHsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNFbXB0eShuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH0gICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHN1cGx5IGEgbm9uLWVtcHR5IG5hbWUuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmFtZXNwYWNlICYmIChuYW1lc3BhY2UuYXBwID09PSAnLScgfHwgbmFtZXNwYWNlLm93bmVyID09PSAnLScpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2hlbiBzZWFyY2hpbmcgZm9yIGFuIGVudGl0eSwgd2lsZGNhcmRzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgbmFtZXNwYWNlLiBQbGVhc2UgcmVmaW5lIHlvdXIgc2VhcmNoLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGZ1bGxQYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnRpdGllc0J5TmFtZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXRpZXMgPSB0aGlzLl9lbnRpdGllc0J5TmFtZVtpZF07ICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAxICYmICFuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgZW50aXR5IHdpdGggdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBuYW1lIGFuZCB0aGUgdXNlciBkaWQgbm90XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZnkgYSBuYW1lc3BhY2UsIHRoZW4gd2UganVzdFxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0aWVzWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDEgJiYgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHNwZWNpZmllZCBhIG5hbWVzcGFjZSwgdGhlbiB3ZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSByZXR1cm4gdGhlIGVudGl0eSBpZiBpdCBtYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdWxsIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZnVsbFBhdGggPSB0aGlzLnNlcnZpY2UuZnVsbHBhdGgoZW50aXRpZXNbMF0ucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXRpZXNbMF0ucXVhbGlmaWVkUGF0aCA9PT0gZnVsbFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdGllc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudGl0aWVzLmxlbmd0aCA+IDEgJiYgIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGVudGl0eSBhbmQgd2UgZGlkbid0XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZnkgYSBuYW1lc3BhY2UsIHRoZW4gd2UgcmV0dXJuIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHNheWluZyB0aGUgbWF0Y2ggaXMgYW1iaWd1b3VzXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFtYmlndW91cyBtYXRjaCBmb3IgbmFtZSAnXCIgKyBpZCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZW50aXR5LCBhbmQgd2UgZG8gaGF2ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIG5hbWVzcGFjZSwgc28gd2UgdHJ5IGFuZCBmaW5kIGl0XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbnRpdGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFBhdGggPSB0aGlzLnNlcnZpY2UuZnVsbHBhdGgoZW50aXRpZXNbaV0ucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5xdWFsaWZpZWRQYXRoID09PSBmdWxsUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gZW50aXR5IG9uIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgY29sbGVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWRcbiAgICAgICAgICogcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgYXBwcyA9IHNlcnZpY2UuYXBwcygpO1xuICAgICAgICAgKiAgICAgIGFwcHMuY3JlYXRlKHtuYW1lOiBcIk5ld1NlYXJjaEFwcFwifSwgZnVuY3Rpb24oZXJyLCBuZXdBcHApIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBlbnRpdHktc3BlY2lmaWMgcHJvcGVydGllcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZTogYChlcnIsIHJlc3BvbnNlKWAuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgYHNwbHVua2pzLlNlcnZpY2UuRW50aXR5YCBvYmplY3RzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiXCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHJlc3BvbnNlLmRhdGEuZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlscy5pc0FycmF5KHByb3BzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBwcm9wc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IHRoYXQuaW5zdGFudGlhdGVFbnRpdHkocHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHkuX2xvYWQocHJvcHMpOyBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LmZldGNoT25FbnRpdHlDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LmZldGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgZW50aXRpZXMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcHMgPSBzZXJ2aWNlLmFwcHMoKTtcbiAgICAgICAgICogICAgICBhcHBzLmZldGNoKGZ1bmN0aW9uKGVyciwgYXBwcykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgYXBwTGlzdCA9IGFwcHMubGlzdCgpO1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhhcHBMaXN0Lmxlbmd0aCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBsaXN0IG9mIGVudGl0aWVzOiBgKGVyciwgbGlzdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbGlzdDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmNsb25lKHRoaXMuX2VudGl0aWVzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBzYXZlZCBzZWFyY2gsIHdoaWNoIHlvdSBjYW4gdGhlbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlcy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5TYXZlZFNlYXJjaCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnNhdmVkU2VhcmNoZXMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IHNhdmVkIHNlYXJjaC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2h9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmFja25vd2xlZGdlICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5hY2tub3dsZWRnZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kaXNwYXRjaCk7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5oaXN0b3J5KTtcbiAgICAgICAgICAgIHRoaXMuc3VwcHJlc3NJbmZvID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnN1cHByZXNzSW5mbyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGNvdW50IG9mIHRyaWdnZXJlZCBhbGVydHMgZm9yIHRoaXMgc2F2ZWRTZWFyY2gsXG4gICAgICAgICAqIGRlZmF1bHRpbmcgdG8gMCB3aGVuIHVuZGVmaW5lZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICB2YXIgYWxlcnRDb3VudCA9IHNhdmVkU2VhcmNoLmFsZXJ0Q291bnQoKTtcbiAgICAgICAgICogXG4gICAgICAgICAqIEByZXR1cm4ge051bWJlcn0gVGhlIGNvdW50IG9mIHRyaWdnZXJlZCBhbGVydHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgYWxlcnRDb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5wcm9wZXJ0aWVzKCkudHJpZ2dlcmVkX2FsZXJ0X2NvdW50LCAxMCkgfHwgMDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWNrbm93bGVkZ2VzIHRoZSBzdXBwcmVzc2lvbiBvZiB0aGUgYWxlcnRzIGZyb20gYSBzYXZlZCBzZWFyY2ggYW5kXG4gICAgICAgICAqIHJlc3VtZXMgYWxlcnRpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIHNhdmVkU2VhcmNoID0gc2VydmljZS5zYXZlZFNlYXJjaGVzKCkuaXRlbShcIk15U2F2ZWRTZWFyY2hcIik7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2guYWNrbm93bGVkZ2UoZnVuY3Rpb24oZXJyLCBzZWFyY2gpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJBQ0tOT1dMRURHRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzYXZlZCBzZWFyY2ggaXMgYWNrbm93bGVkZ2VkOiBgKGVyciwgc2F2ZWRTZWFyY2gpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfS9hY2tub3dsZWRnZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIGFja25vd2xlZGdlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiYWNrbm93bGVkZ2VcIiwge30sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNwYXRjaGVzIGEgc2F2ZWQgc2VhcmNoLCB3aGljaCBjcmVhdGVzIGEgc2VhcmNoIGpvYiBhbmQgcmV0dXJucyBhIFxuICAgICAgICAgKiBgc3BsdW5ranMuU2VydmljZS5Kb2JgIGluc3RhbmNlIGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaC5kaXNwYXRjaCh7Zm9yY2VfZGlzcGF0Y2g6IGZhbHNlfSwgZnVuY3Rpb24oZXJyLCBqb2IsIHNhdmVkU2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSm9iIFNJRDogXCIsIGpvYi5zaWQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgZGlzcGF0Y2hpbmcgdGhpcyBzYXZlZCBzZWFyY2g6XG4gICAgICAgICAqICAgIC0gYGRpc3BhdGNoLm5vd2AgKF9zdHJpbmdfKTogVGhlIHRpbWUgdGhhdCBpcyB1c2VkIHRvIGRpc3BhdGNoIHRoZSBzZWFyY2ggYXMgdGhvdWdoIHRoZSBzcGVjaWZpZWQgdGltZSB3ZXJlIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICAgICAqICAgIC0gYGRpc3BhdGNoLipgIChfc3RyaW5nXyk6IE92ZXJ3cml0ZXMgdGhlIHZhbHVlIG9mIHRoZSBzZWFyY2ggZmllbGQgc3BlY2lmaWVkIGluICouXG4gICAgICAgICAqICAgIC0gYHRyaWdnZXJfYWN0aW9uc2AgKF9ib29sZWFuXyk6IEluZGljYXRlcyB3aGV0aGVyIHRvIHRyaWdnZXIgYWxlcnQgYWN0aW9ucy5cbiAgICAgICAgICogICAgLSBgZm9yY2VfZGlzcGF0Y2hgIChfYm9vbGVhbl8pOiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdGFydCBhIG5ldyBzZWFyY2ggaWYgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGlzIHNlYXJjaCBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzYXZlZCBzZWFyY2ggaXMgZGlzcGF0Y2hlZDogYChlcnIsIGpvYiwgc2F2ZWRTZWFyY2gpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfS9kaXNwYXRjaFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJkaXNwYXRjaFwiLCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBzaWQgPSByZXNwb25zZS5kYXRhLnNpZDtcbiAgICAgICAgICAgICAgICB2YXIgam9iID0gbmV3IHJvb3QuSm9iKHRoYXQuc2VydmljZSwgc2lkLCB0aGF0Lm5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgam9iLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogR2V0cyB0aGUgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwYCBmb3IgZmlyZWRBbGVydHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2F2ZWQgc2VhcmNoLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhbGVydHMgPSBzZXJ2aWNlLmZpcmVkQWxlcnRHcm91cHMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXB9IEFuIEFsZXJ0R3JvdXAgb2JqZWN0IHdpdGggdGhlXG4gICAgICAgICAqIHNhbWUgbmFtZSBhcyB0aGlzIFNhdmVkU2VhcmNoIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBmaXJlZEFsZXJ0R3JvdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkZpcmVkQWxlcnRHcm91cCh0aGlzLnNlcnZpY2UsIHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgam9iIGhpc3RvcnkgZm9yIGEgc2F2ZWQgc2VhcmNoLCB3aGljaCBpcyBhIGxpc3Qgb2YgXG4gICAgICAgICAqIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaCA9IHNlcnZpY2Uuc2F2ZWRTZWFyY2hlcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgIHNhdmVkU2VhcmNoLmhpc3Rvcnkoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgam9icywgc2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkpvYlwiLCBpLCBcIjpcIiwgam9ic1tpXS5zaWQpO1xuICAgICAgICAgKiAgICAgICAgICB9XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZm9yIHJldHJpZXZpbmcgaGlzdG9yeS4gRm9yIGEgZnVsbCBsaXN0LCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay84LjAuMi9SRVNUUkVGL1JFU1Rwcm9sb2cjUGFnaW5hdGlvbl9hbmRfZmlsdGVyaW5nX3BhcmFtZXRlcnNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5QYWdpbmF0aW9uIGFuZCBGaWx0ZXJpbmcgb3B0aW9uczwvYT4gaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBoaXN0b3J5IGlzIHJldHJpZXZlZDogYChlcnIsIGpvYiwgc2F2ZWRTZWFyY2gpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfS9oaXN0b3J5XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgaGlzdG9yeTogZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJoaXN0b3J5XCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIGpvYnMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnkgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpvYkRhdGEgPSByZXNwb25zZS5kYXRhLmVudHJ5W2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMoam9iRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqb2IgPSBuZXcgcm9vdC5Kb2IodGhhdC5zZXJ2aWNlLCBqb2JEYXRhLm5hbWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBqb2IuX2xvYWQoam9iRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBqb2JzLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgYSBzYXZlZCBzZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIHNhdmVkU2VhcmNoID0gc2VydmljZS5zYXZlZFNlYXJjaGVzKCkuaXRlbShcIk15U2F2ZWRTZWFyY2hcIik7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2guaGlzdG9yeShmdW5jdGlvbihlcnIsIHN1cHByZXNzaW9uU3RhdGUsIHNlYXJjaCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNUQVRFOiBcIiwgc3VwcHJlc3Npb25TdGF0ZSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBpcyByZXRyaWV2ZWQ6IGAoZXJyLCBzdXBwcmVzc2lvblN0YXRlLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L3N1cHByZXNzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgc3VwcHJlc3NJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJzdXBwcmVzc1wiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UuZGF0YS5lbnRyeS5jb250ZW50LCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIHNhdmVkIHNlYXJjaCBvbiB0aGUgc2VydmVyLiBcbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoZSBzZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQsIGV2ZW4gd2hlbiBpdCBpc24ndCBiZWluZyBtb2RpZmllZC5cbiAgICAgICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgaXQsIHRoaXMgbWV0aG9kIHdpbGwgZmV0Y2ggdGhlIHNlYXJjaCBzdHJpbmcgZnJvbVxuICAgICAgICAgKiB0aGUgc2VydmVyIG9yIGZyb20gdGhlIGxvY2FsIGNhY2hlLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB0aGUgc2F2ZWQgc2VhcmNoIHdpdGguIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzYXZlZHNlYXJjaHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNhdmVkIHNlYXJjaCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyB1cGRhdGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGUgPSB0aGlzLl9zdXBlcjtcbiAgICAgICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5mZXRjaChmdW5jdGlvbihlcnIsIHNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IHNlYXJjaC5wcm9wZXJ0aWVzKCkuc2VhcmNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLmNhbGwoc2VhcmNoLCBwYXJhbXMsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBzYXZlZCBzZWFyY2hlcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgc2F2ZWQgXG4gICAgICogc2VhcmNoZXMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgc2F2ZWQgc2VhcmNoLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovXG4gICAgcm9vdC5TYXZlZFNlYXJjaGVzID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuc2F2ZWRTZWFyY2hlcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSBzYXZlZCBzZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBzYXZlZCBzZWFyY2guIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzYXZlZHNlYXJjaHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNhdmVkIHNlYXJjaCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlNhdmVkU2VhcmNoKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc2AuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXNcbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIHN0b3JhZ2UgcGFzc3dvcmQsIHdoaWNoIHlvdSBjYW4gdGhlbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzdG9yYWdlL3Bhc3N3b3Jkcy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuU3RvcmFnZVBhc3N3b3JkID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5zdG9yYWdlUGFzc3dvcmRzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IHN0b3JhZ2UgcGFzc3dvcmQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBzdG9yYWdlIHBhc3N3b3Jkcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgc3RvcmFnZSBcbiAgICAgKiBwYXNzd29yZHMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgc3RvcmFnZSBwYXNzd29yZC5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzdG9yYWdlL3Bhc3N3b3Jkc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICByb290LlN0b3JhZ2VQYXNzd29yZHMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgXG4gICAgICAgICAqIGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJuc1xuICAgICAgICAgKiAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25FbnRpdHlDcmVhdGlvbjogdHJ1ZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnN0b3JhZ2VQYXNzd29yZHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgc3RvcmFnZSBwYXNzd29yZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHN0b3JhZ2UgcGFzc3dvcmQuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsXG4gICAgICAgICAqIHNlZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUYWNjZXNzI1BPU1Rfc3RvcmFnZS4yRnBhc3N3b3Jkc1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgKiBQT1NUIHN0b3JhZ2UvcGFzc3dvcmRzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5TdG9yYWdlUGFzc3dvcmQodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRzYC4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi8gICAgIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZmlyZWQgYWxlcnQuIFxuICAgICAqIFlvdSBjYW4gcmV0cmlldmUgc2V2ZXJhbCBvZiB0aGUgZmlyZWQgYWxlcnQncyBwcm9wZXJ0aWVzIGJ5XG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gbmFtZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhbGVydHMvZmlyZWRfYWxlcnRzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuRmlyZWRBbGVydCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuZmlyZWRBbGVydHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyBhY3Rpb25zIChzdWNoIGFzIG5vdGlmeWluZyBieSBlbWFpbCwgcnVubmluZyBhIFxuICAgICAgICAgKiBzY3JpcHQsIGFkZGluZyB0byBSU1MsIHRyYWNraW5nIGluIEFsZXJ0IE1hbmFnZXIsIGFuZCBlbmFibGluZyBcbiAgICAgICAgICogc3VtbWFyeSBpbmRleGluZykuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gb2YgYWN0aW9ucywgYW4gZW1wdHkge0FycmF5fSBpZiBubyBhY3Rpb25zXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBhY3Rpb25zOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS5hY3Rpb25zIHx8IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyB0eXBlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBhbGVydCdzIHR5cGUuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBhbGVydFR5cGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLmFsZXJ0X3R5cGUgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBhIHNldCBvZiBldmVudHMgKGRpZ2VzdCkgb3IgYSBzaW5nbGVcbiAgICAgICAgICogZXZlbnQgKHBlciByZXN1bHQpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gU3BsdW5rIDQuMyBhbmQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIHJlc3VsdCBpcyBhIGRpZ2VzdCwgZmFsc2UgaWYgcGVyIHJlc3VsdFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgaXNEaWdlc3RNb2RlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdGhpcyBwcm9wZXJ0eSB0byBhIEJvb2xlYW5cbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMucHJvcGVydGllcygpLmRpZ2VzdF9tb2RlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlZCBleHBpcmF0aW9uIHRpbWUgZm9yIHRoaXMgYWxlcnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBTcGx1bmsgNC4zIGFuZCBsYXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgZXhwaXJhdGlvblRpbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLmV4cGlyYXRpb25fdGltZV9yZW5kZXJlZCB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBzYXZlZCBzZWFyY2ggZm9yIHRoaXMgYWxlcnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHNhdmVkIHNlYXJjaCBuYW1lLCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHNhdmVkU2VhcmNoTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuc2F2ZWRzZWFyY2hfbmFtZSB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyBzZXZlcml0eSBvbiBhIHNjYWxlIG9mIDEgdG8gMTAsIHdpdGggMSBiZWluZyB0aGVcbiAgICAgICAgICogaGlnaGVzdCBzZXZlcml0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSB0aGlzIGFsZXJ0J3Mgc2V2ZXJpdHksIC0xIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHNldmVyaXR5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnByb3BlcnRpZXMoKS5zZXZlcml0eSwgMTApIHx8IC0xO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyBzZWFyY2ggSUQgKFNJRCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhpcyBhbGVydCdzIFNJRCwgb3Ige251bGx9IGlmIG5vdCBhdmFpbGFibGUuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBzaWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLnNpZCB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRoaXMgYWxlcnQgd2FzIHRyaWdnZXJlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSBUaGlzIGFsZXJ0J3MgdHJpZ2dlciB0aW1lLCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHRyaWdnZXJUaW1lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyX3RpbWUgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGlzIGFsZXJ0J3MgcmVuZGVyZWQgdHJpZ2dlciB0aW1lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gU3BsdW5rIDQuMyBhbmQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhpcyBhbGVydCdzIHJlbmRlcmVkIHRyaWdnZXIgdGltZSwgb3Ige251bGx9IGlmIG5vdCBhdmFpbGFibGUuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICB0cmlnZ2VyVGltZVJlbmRlcmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyX3RpbWVfcmVuZGVyZWQgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGluIFNwbHVuayA0LjMgYW5kIGxhdGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgdHJpZ2dlcmVkIGFsZXJ0cywgb3IgLTEgaWYgbm90IHNwZWNpZmllZC5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHRyaWdnZXJlZEFsZXJ0Q291bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMucHJvcGVydGllcygpLnRyaWdnZXJlZF9hbGVydHMsIDEwKSB8fCAtMTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBmb3IgdGhlIG5ldyBhbGVydCBncm91cC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBhbGVydCBncm91cCwgd2hpY2ggeW91IGNhbiB0aGVuIHZpZXcgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFsZXJ0cy9maXJlZF9hbGVydHMve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkZpcmVkQWxlcnRHcm91cCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5maXJlZEFsZXJ0cyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGB0cmlnZ2VyZWRfYWxlcnRfY291bnRgIHByb3BlcnR5LCB0aGUgY291bnRcbiAgICAgICAgICogb2YgdHJpZ2dlcmVkIGFsZXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSB0aGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0c1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICAgICAqL1xuICAgICAgICBjb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5wcm9wZXJ0aWVzKCkudHJpZ2dlcmVkX2FsZXJ0X2NvdW50LCAxMCkgfHwgMDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBmaXJlZCBpbnN0YW5jZXMgb2YgdGhpcyBhbGVydCwgd2hpY2ggaXNcbiAgICAgICAgICogYSBsaXN0IG9mIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRgIGluc3RhbmNlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgYWxlcnRHcm91cCA9IHNlcnZpY2UuZmlyZWRBbGVydEdyb3VwcygpLml0ZW0oXCJNeUFsZXJ0XCIpO1xuICAgICAgICAgKiAgICAgIGFsZXJ0R3JvdXAubGlzdChmdW5jdGlvbihlcnIsIGZpcmVkQWxlcnRzLCBhbGVydCkge1xuICAgICAgICAgKiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZmlyZWRBbGVydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlyZWQgYWxlcnRcIiwgaSwgXCI6XCIsIGZpcmVkQWxlcnRzW2ldLnNpZCk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGZpcmVkIGFsZXJ0cyBhcmUgcmV0cmlldmVkOiBgKGVyciwgZmlyZWRBbGVydHMsIGFsZXJ0R3JvdXApYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cFxuICAgICAgICAgKi9cbiAgICAgICAgbGlzdDogZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJcIiwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgZmlyZWRBbGVydHMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnkgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXJlZEFsZXJ0RGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnlbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhmaXJlZEFsZXJ0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXJlZEFsZXJ0ID0gbmV3IHJvb3QuRmlyZWRBbGVydCh0aGF0LnNlcnZpY2UsIGZpcmVkQWxlcnREYXRhLm5hbWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGZpcmVkQWxlcnQuX2xvYWQoZmlyZWRBbGVydERhdGEpO1xuICAgICAgICAgICAgICAgICAgICBmaXJlZEFsZXJ0cy5wdXNoKGZpcmVkQWxlcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaXJlZEFsZXJ0cywgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IGFsZXJ0IGdyb3VwLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXB9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3QgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMubGlzdCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGZpcmVkIGFsZXJ0cyBmb3IgYSBzYXZlZCBzZWFyY2guIFlvdSBjYW5cbiAgICAgKiBjcmVhdGUgYW5kIGxpc3Qgc2F2ZWQgc2VhcmNoZXMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3JcbiAgICAgKiBnZXQgYSBzcGVjaWZpYyBhbGVydCBncm91cC4gXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhbGVydHMvZmlyZWRfYWxlcnRzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqL1xuICAgIHJvb3QuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbiA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmZpcmVkQWxlcnRzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBhbGVydCBncm91cC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgYWxlcnQgZ3JvdXAuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkZpcmVkQWxlcnRHcm91cCh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1cHByZXNzIHJlbW92aW5nIGFsZXJ0cyB2aWEgdGhlIGZpcmVkIGFsZXJ0cyBlbmRwb2ludC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUbyByZW1vdmUgYW4gYWxlcnQsIHJlbW92ZSB0aGUgc2F2ZWQgc2VhcmNoIHdpdGggdGhlIHNhbWUgbmFtZS5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25gLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdGVFbnRpdHkgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuaW5zdGFudGlhdGVFbnRpdHkpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBTcGx1bmsgYXBwIHRoYXQgeW91IGNhbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkFwcGxpY2F0aW9uID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiB1cGRhdGUgdG8gZ2V0IHRoZSB1cGRhdGVkIFxuICAgICAgICAgKiBpdGVtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25VcGRhdGU6IHRydWUsXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5hcHBzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgU3BsdW5rIGFwcC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25gIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIHt9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zZXR1cEluZm8gID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnNldHVwSW5mbyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluZm8gPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudXBkYXRlSW5mbyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgYSBTcGx1bmsgYXBwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHAgPSBzZXJ2aWNlLmFwcHMoKS5pdGVtKFwiYXBwXCIpO1xuICAgICAgICAgKiAgICAgIGFwcC5zZXR1cChmdW5jdGlvbihlcnIsIGluZm8sIHNlYXJjaCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNFVFVQIElORk86IFwiLCBpbmZvKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gc2V0dXAgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkOiBgKGVyciwgaW5mbywgYXBwKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsL3tuYW1lfS9zZXR1cFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHNldHVwSW5mbzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwic2V0dXBcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YS5lbnRyeS5jb250ZW50LCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYW55IGluZm9ybWF0aW9uIGZvciBhbiB1cGRhdGUgdG8gYSBsb2NhbGx5LWluc3RhbGxlZCBTcGx1bmsgYXBwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHAgPSBzZXJ2aWNlLmFwcHMoKS5pdGVtKFwiTXlBcHBcIik7XG4gICAgICAgICAqICAgICAgYXBwLnVwZGF0ZUluZm8oZnVuY3Rpb24oZXJyLCBpbmZvLCBhcHApIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJVUERBVEUgSU5GTzogXCIsIGluZm8pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB1cGRhdGUgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkOiBgKGVyciwgaW5mbywgYXBwKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsL3tuYW1lfS91cGRhdGVcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJ1cGRhdGVcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YS5lbnRyeS5jb250ZW50LCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIFNwbHVuayBhcHBzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBhcHBsaWNhdGlvbnMgXG4gICAgICogdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgYXBwLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWxcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuQXBwbGljYXRpb25zID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gZW50aXR5IGhhcyBiZWVuIGNyZWF0ZWQuIEJ5IFxuICAgICAgICAgKiBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnNcbiAgICAgICAgICogKGVjaG9lcykgdGhlIG5ldyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25FbnRpdHlDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5hcHBzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBhcHAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBhcHAuIEZvciBkZXRhaWxzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RhcHBzI1BPU1RfYXBwcy4yRmxvY2FsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UE9TVCBhcHBzL2xvY2FsPC9hPiBlbmRwb2ludCBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25gIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5BcHBsaWNhdGlvbih0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzZXJ2ZXIvaW5mb1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlNlcnZlckluZm9cbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuU2VydmVySW5mbyA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuaW5mbztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvXG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gXCJzZXJ2ZXItaW5mb1wiO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIHt9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBTcGx1bmsgdXNlciwgd2hpY2ggeW91IGNhbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhdXRoZW50aWNhdGlvbi91c2Vycy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Vc2VyXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LlVzZXIgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnVzZXJzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuVXNlcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBTcGx1bmsgdXNlcm5hbWUuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVXNlcmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2VyXG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCB7fSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiB1c2Vycy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3QgdXNlcnMgdXNpbmcgXG4gICAgICogdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgdXNlci5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhdXRoZW50aWNhdGlvbi91c2Vyc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LlVzZXJzID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gZW50aXR5IGhhcyBiZWVuIGNyZWF0ZWQuIEJ5IFxuICAgICAgICAgKiBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnNcbiAgICAgICAgICogKGVjaG9lcykgdGhlIG5ldyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMudXNlcnM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgdXNlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIG5ldyB1c2VyLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjgjdXNlcmF1dGhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Vc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlVzZXJ9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuVXNlcnNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlVzZXIodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCB7fSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzYC4gXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Vc2Vyc2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgdXNlci4gXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIGEgc3BlY2lhbCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUo4I3VzZXJhdXRocGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+VXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBlbnRpdHk6IGAoZXJyLCBjcmVhdGVkRW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBlbmRwb2ludCByZXF1aXJlcyB1cyB0byB1c2UgdGhlIHBhc3NlZC1pbiBuYW1lXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtuYW1lOiBwYXJhbXMubmFtZX07XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhhdC5pbnN0YW50aWF0ZUVudGl0eShwcm9wcyk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5LmZldGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydGVkLCBzbyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIFNwbHVuayB2aWV3LCB3aGljaCB5b3UgY2FuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGEvdWkvdmlld3Mve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuVmlld1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5WaWV3ID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3XG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy52aWV3cyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlldy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVmlld2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3XG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiB2aWV3cy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgdmlld3MgdXNpbmcgXG4gICAgICogdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgdmlldy5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhL3VpL3ZpZXdzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuVmlld3NcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuVmlld3MgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMudmlld3M7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgdmlldy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHZpZXcuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNQT1NUX3NjaGVkdWxlZC4yRnZpZXdzLjJGLjdCbmFtZS43RFwiIHRhcmdldD1cIl9ibGFua1wiPlBPU1Qgc2NoZWR1bGVkL3ZpZXdzL3tuYW1lfTwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVmlld2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlZpZXcodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5WaWV3c2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5WaWV3c2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBpbmRleCwgd2hpY2ggeW91IGNhbiB1cGRhdGUgYW5kIHN1Ym1pdCBldmVudHMgdG8uXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgZGF0YS9pbmRleGVzL25hbWVcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5JbmRleFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5JbmRleCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmluZGV4ZXMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5JbmRleGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbmRleC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSW5kZXh9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4XG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc3VibWl0RXZlbnQgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3VibWl0RXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1Ym1pdHMgYW4gZXZlbnQgdG8gdGhpcyBpbmRleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgaW5kZXggPSBzZXJ2aWNlLmluZGV4ZXMoKS5pdGVtKFwiX2ludGVybmFsXCIpO1xuICAgICAgICAgKiAgICAgIGluZGV4LnN1Ym1pdEV2ZW50KFwiQSBuZXcgZXZlbnRcIiwge3NvdXJjZXR5cGU6IFwibXlzb3VyY2V0eXBlXCJ9LCBmdW5jdGlvbihlcnIsIHJlc3VsdCwgaW5kZXgpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTdWJtaXR0ZWQgZXZlbnQ6IFwiLCByZXN1bHQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgVGhlIHRleHQgZm9yIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHBhcmFtZXRlcnMgZm9yIGluZGV4aW5nOiBcbiAgICAgICAgICogICAgLSBgaG9zdGAgKF9zdHJpbmdfKTogVGhlIHZhbHVlIHRvIHBvcHVsYXRlIGluIHRoZSBob3N0IGZpZWxkIGZvciBldmVudHMgZnJvbSB0aGlzIGRhdGEgaW5wdXQuIFxuICAgICAgICAgKiAgICAtIGBob3N0X3JlZ2V4YCAoX3N0cmluZ18pOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGV4dHJhY3QgdGhlIGhvc3QgdmFsdWUgZnJvbSBlYWNoIGV2ZW50LiBcbiAgICAgICAgICogICAgLSBgc291cmNlYCAoX3N0cmluZ18pOiBUaGUgc291cmNlIHZhbHVlIHRvIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGZvciB0aGlzIGlucHV0J3MgZXZlbnRzLlxuICAgICAgICAgKiAgICAtIGBzb3VyY2V0eXBlYCAoX3N0cmluZ18pOiBUaGUgc291cmNldHlwZSB0byBhcHBseSB0byBldmVudHMgZnJvbSB0aGlzIGlucHV0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgc3VibWl0dGVkOiBgKGVyciwgcmVzdWx0LCBpbmRleClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgcmVjZWl2ZXJzL3NpbXBsZT9pbmRleD17bmFtZX1cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBzdWJtaXRFdmVudDogZnVuY3Rpb24oZXZlbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIHRoZSBpbmRleCBuYW1lXG4gICAgICAgICAgICBwYXJhbXNbXCJpbmRleFwiXSA9IHRoaXMubmFtZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5sb2coZXZlbnQsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCwgdGhhdCk7IFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlLnZlcnNpb25Db21wYXJlKFwiNS4wXCIpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluZGV4ZXMgY2Fubm90IGJlIHJlbW92ZWQgaW4gU3BsdW5rIDQueFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAgICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgaW5kZXhlcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3QgaW5kZXhlcyB1c2luZyBcbiAgICAgKiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBpbmRleC5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LkluZGV4ZXMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5pbmRleGVzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBpbmRleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IGluZGV4LiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjMjaW5kZXhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5JbmRleCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5JbmRleH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkluZGV4KHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gaW5kZXggd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgaW5kZXhlcyA9IHNlcnZpY2UuaW5kZXhlcygpO1xuICAgICAgICAgKiAgICAgIGluZGV4ZXMuY3JlYXRlKFwiTmV3SW5kZXhcIiwge2Fzc3VyZVVURjg6IHRydWV9LCBmdW5jdGlvbihlcnIsIG5ld0luZGV4KSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQSBuYW1lIGZvciB0aGlzIGluZGV4LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjMjaW5kZXhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5JbmRleCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBpbmRleDogYChlcnIsIGNyZWF0ZWRJbmRleClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgZGF0YS9pbmRleGVzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKG5hbWUsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbGVkIHVzIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUgb2YgKHBhcmFtcywgY2FsbGJhY2spLFxuICAgICAgICAgICAgLy8gbGV0cyBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChuYW1lKSAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gbmFtZTtcbiAgICAgICAgICAgICAgICBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtc1tcIm5hbWVcIl0gPSBuYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgc3RhbnphLCB3aGljaCB5b3UgY2FuIHVwZGF0ZSBhbmQgcmVtb3ZlLCBmcm9tIGEgXG4gICAgICogY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGNvbmZpZ3MvY29uZi17ZmlsZX0ve25hbWV9YFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuQ29uZmlndXJhdGlvblN0YW56YSA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YVxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZSA9PT0gXCJkZWZhdWx0XCIgPyBcIl9uZXdcIiA6IHRoaXMubmFtZTtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5jb25maWd1cmF0aW9ucyArIFwiL2NvbmYtXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5maWxlKSArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uU3RhbnphYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGUgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIG5ldyBzdGFuemEuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemF9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YVxuICAgICAgICAgKi8gXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIGZpbGUsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHN0YW56YXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkgZmlsZS4gWW91IGNhblxuICAgICAqIGNyZWF0ZSBhbmQgbGlzdCBzdGFuemFzIHVzaW5nIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIFxuICAgICAqIHN0YW56YS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBjb25maWdzL2NvbmYte2ZpbGV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuQ29uZmlndXJhdGlvbkZpbGUgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHsgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmNvbmZpZ3VyYXRpb25zICsgXCIvY29uZi1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgc3RhbnphIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKiBZb3UgY2Fubm90IGRpcmVjdGx5IHVwZGF0ZSB0aGUgYENvbmZpZ3VyYXRpb25TdGFuemFgIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB2aWV3aW5nIGBjb25maWdzL2NvbmYte2ZpbGV9L19uZXdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemF9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgICAgICovXG4gICAgICAgIGdldERlZmF1bHRTdGFuemE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkNvbmZpZ3VyYXRpb25TdGFuemEodGhpcy5zZXJ2aWNlLCB0aGlzLm5hbWUsIFwiZGVmYXVsdFwiLCB0aGlzLm5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhIHN0YW56YSBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBrZXktdmFsdWUgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBzdGFuemEuIFxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemF9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Db25maWd1cmF0aW9uU3RhbnphKHRoaXMuc2VydmljZSwgdGhpcy5uYW1lLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHN0YW56YSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgZmlsZSA9IHNlcnZpY2UuY29uZmlndXJhdGlvbnMoKS5pdGVtKFwicHJvcHNcIik7XG4gICAgICAgICAqICAgICAgZmlsZS5jcmVhdGUoXCJteV9zdGFuemFcIiwgZnVuY3Rpb24oZXJyLCBuZXdTdGFuemEpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhbnphTmFtZSBBIG5hbWUgZm9yIHRoaXMgc3RhbnphLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIEEgZGljdGlvbmFyeSBvZiBrZXktdmFsdWUgcGFpcnMgdG8gcHV0IGluIHRoaXMgc3RhbnphLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgY3JlYXRlZCBzdGFuemE6IGAoZXJyLCBjcmVhdGVkU3RhbnphKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBjb25maWdzL2NvbmYte2ZpbGV9XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihzdGFuemFOYW1lLCB2YWx1ZXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3Qoc3RhbnphTmFtZSkgJiYgdXRpbHMuaXNGdW5jdGlvbih2YWx1ZXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IHN0YW56YU5hbWU7XG4gICAgICAgICAgICAgICAgc3RhbnphTmFtZSA9IHZhbHVlcy5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbih2YWx1ZXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMgfHwge307XG4gICAgICAgICAgICB2YWx1ZXNbXCJuYW1lXCJdID0gc3RhbnphTmFtZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHZhbHVlcywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgY29uZmlndXJhdGlvbiBmaWxlcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3QgXG4gICAgICogY29uZmlndXJhdGlvbiBmaWxlcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBmaWxlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHByb3BlcnRpZXNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5Db25maWd1cmF0aW9ucyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIGVudGl0eSBoYXMgYmVlbiBjcmVhdGVkLiBCeSBcbiAgICAgICAgICogZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgZmV0Y2hlZCBiZWNhdXNlIHRoZSBlbmRwb2ludCByZXR1cm5zXG4gICAgICAgICAqIChlY2hvZXMpIHRoZSBuZXcgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25FbnRpdHlDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnByb3BlcnRpZXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuQ29uZmlndXJhdGlvbkZpbGUodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCB0aGlzLm5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlLm93bmVyID09PSBcIi1cIiB8fCBuYW1lc3BhY2UuYXBwID09PSBcIi1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb25zIHJlcXVpcmVzIGEgbm9uLXdpbGRjYXJkIG93bmVyL2FwcFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGNvbmZpZ3VyYXRpb25zID0gc2VydmljZS5jb25maWd1cmF0aW9ucygpO1xuICAgICAgICAgKiAgICAgIGNvbmZpZ3VyYXRpb25zLmNyZWF0ZShcIm15cHJvcHNcIiwgZnVuY3Rpb24oZXJyLCBuZXdGaWxlKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIEEgbmFtZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlOiBgKGVyciwgY3JlYXRlZEZpbGUpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHByb3BlcnRpZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKGZpbGVuYW1lLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsZWQgdXMgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZSBvZiAocGFyYW1zLCBjYWxsYmFjayksXG4gICAgICAgICAgICAvLyBsZXRzIG1ha2UgaXQgd29ya1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbXCJfX2NvbmZcIl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcIlwiLCB7X19jb25mOiBmaWxlbmFtZX0sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gbmV3IHJvb3QuQ29uZmlndXJhdGlvbkZpbGUodGhhdC5zZXJ2aWNlLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eS5mZXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIGRvZXNGaWxlRXhpc3Q6IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgICAgIC8vIDEuIEZldGNoIGZpbGVzIGxpc3RcbiAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldF92MihcIlwiLCAge19fY29uZjogZmlsZW5hbWV9KTtcblxuICAgICAgICAgICAgICAgIC8vIDIuIEZpbHRlciB0aGUgZmlsZXNcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMgPSByZXNwb25zZT8uYm9keT8uZW50cnk/LmZpbHRlcihmID0+IGYubmFtZSA9PT0gZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNvZGU6XCJGSUxFX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgRmlsZSB3aXRoIHRoZSBuYW1lICcke2ZpbGVuYW1lfScgZG9lcyBub3QgZXhpc3QuYH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gMy4gQ3JlYXRlIGEgbG9jYWwgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlndXJhdGlvbkZpbGUgPSBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSh0aGF0LnNlcnZpY2UsIGZpbGVuYW1lKTtcblxuICAgICAgICAgICAgICAgIC8vIDQuIExvYWQgdGhlIGZpbGUgY29udGVudFxuICAgICAgICAgICAgICAgIHZhciBmZXRjaGVkRmlsZSA9IGF3YWl0IGNvbmZpZ3VyYXRpb25GaWxlLmZldGNoX3YyKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge2ZpbGU6IGZldGNoZWRGaWxlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3JDb2RlOlwiU1lTVEVNX0VSUk9SXCIsIGVycm9yTWVzc2FnZTogZXJyb3J9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGRvZXNTdGFuemFFeGlzdDogYXN5bmMgZnVuY3Rpb24oZmlsZSwgc3RhbnphKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDEuIGNoZWNrIGlmIHRoZSBzdGFuemEgZXhpc3RzXG4gICAgICAgICAgICAgICAgdmFyIGZldGNoZWRTdGFuemEgPSBmaWxlLml0ZW0oc3RhbnphKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZighZmV0Y2hlZFN0YW56YSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjb2RlOlwiU1RBTlpBX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgU3RhbnphIHdpdGggdGhlIG5hbWUgJyR7c3RhbnphfScgZG9lcyBub3QgZXhpc3QuYH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3N0YW56YTogZmV0Y2hlZFN0YW56YX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvckNvZGU6XCJTWVNURU1fRVJST1JcIiwgZXJyb3JNZXNzYWdlOiBlcnJvcn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlX3YyOiBhc3luYyBmdW5jdGlvbiAoY29uZmlncywgc3ZjLCBmaWxlbmFtZSwgc3RhbnphLCBrZXlWYWx1ZU1hcCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzXG4gICAgICAgICAgICB2YXIgZG9lc0ZpbGVFeGlzdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5kb2VzRmlsZUV4aXN0KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIHZhciBjb25maWdGaWxlID0gZG9lc0ZpbGVFeGlzdFJlc3BvbnNlLmZpbGU7XG5cbiAgICAgICAgICAgIC8vIDIuIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBmaWxlXG4gICAgICAgICAgICBpZighY29uZmlnRmlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRvZXNGaWxlRXhpc3RSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuLi5cIik7XG5cbiAgICAgICAgICAgICAgICB0aGF0LmNyZWF0ZSggeyBfX2NvbmY6IGZpbGVuYW1lIH0sIFxuICAgICAgICAgICAgICAgICAgICAoZXJyLCBuZXdGaWxlKSA9PiBjb25zb2xlLmxvZyhgQ29uZmlndXJhdGlvbiBGaWxlIGNyZWF0ZWQ6ICR7ZmlsZW5hbWV9YCkgKTtcblxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSggdGhhdC5zZXJ2aWNlLCBmaWxlbmFtZSApO1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBhd2FpdCBjb25maWdGaWxlLmZldGNoX3YyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBzdGFuemEgZXhpc3RzXG4gICAgICAgICAgICB2YXIgZG9lc1N0YW56YUV4aXN0UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRvZXNTdGFuemFFeGlzdChjb25maWdGaWxlLCBzdGFuemEpO1xuICAgICAgICAgICAgdmFyIGNvbmZpZ1N0YW56YSA9IGRvZXNTdGFuemFFeGlzdFJlc3BvbnNlLnN0YW56YTtcblxuICAgICAgICAgICAgLy8gMy4gSWYgdGhlIHN0YW56YSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBuZXcgc3RhbnphIHdpdGggZ2l2ZW4ga2V5VmFsdWVNYXBcbiAgICAgICAgICAgIGlmKCFjb25maWdTdGFuemEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkb2VzU3RhbnphRXhpc3RSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIHN0YW56YS4uLlwiKTtcblxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUuY3JlYXRlKHN0YW56YSwga2V5VmFsdWVNYXAsIGZ1bmN0aW9uIChlcnIsIG5ld1N0YW56YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlndXJhdGlvbiBTdGFuemEgY3JlYXRlZDogJHtzdGFuemF9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA0LiBJZiB0aGUgc3RhbnphIGV4aXN0cywgdXBkYXRlIGl0IHdpdGggdGhlIGtleVZhbHVlTWFwXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25maWdTdGFuemEudXBkYXRlKGtleVZhbHVlTWFwLCAoZXJyLCB1cGRhdGVkU3RhbnphKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIFN0YW56YSB1cGRhdGVkOiAke3N0YW56YX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBzZWFyY2ggam9iLiBZb3UgY2FuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnNcbiAgICAgKiBvbiB0aGlzIGpvYiwgc3VjaCBhcyByZWFkaW5nIGl0cyBzdGF0dXMsIGNhbmNlbGluZyBpdCwgYW5kIGdldHRpbmcgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5Kb2IgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuam9icyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzaWQgVGhlIHNlYXJjaCBJRCBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Kb2J9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBzaWQsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gc2lkO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB0aGlzLnNpZCA9IHNpZDtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLmNhbmNlbCAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmNhbmNlbCk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQcmV2aWV3ID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmRpc2FibGVQcmV2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUHJldmlldyAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZW5hYmxlUHJldmlldyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cyAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmV2ZW50cyk7XG4gICAgICAgICAgICB0aGlzLmZpbmFsaXplICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZpbmFsaXplKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2UgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucGF1c2UpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3ICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wcmV2aWV3KTtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cyAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVzdWx0cyk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaGxvZyAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnNlYXJjaGxvZyk7XG4gICAgICAgICAgICB0aGlzLnNldFByaW9yaXR5ICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnNldFByaW9yaXR5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0VFRMICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2V0VFRMKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeSAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3VtbWFyeSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnRpbWVsaW5lKTtcbiAgICAgICAgICAgIHRoaXMudG91Y2ggICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudG91Y2gpO1xuICAgICAgICAgICAgdGhpcy51bnBhdXNlICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51bnBhdXNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FuY2VscyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IuY2FuY2VsKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNBTkNFTExFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNlYXJjaCBpcyBkb25lOiBgKGVycilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImNhbmNlbFwifSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyBwcmV2aWV3IGdlbmVyYXRpb24gZm9yIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5kaXNhYmxlUHJldmlldyhmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBSRVZJRVcgRElTQUJMRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoaXMgc2VhcmNoIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBkaXNhYmxlUHJldmlldzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJkaXNhYmxlcHJldmlld1wifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHByZXZpZXcgZ2VuZXJhdGlvbiBmb3IgYSBzZWFyY2ggam9iLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5kaXNhYmxlUHJldmlldyhmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBSRVZJRVcgRU5BQkxFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhpcyBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGVuYWJsZVByZXZpZXc6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiZW5hYmxlcHJldmlld1wifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBldmVudHMgb2YgYSBzZWFyY2ggam9iIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5ldmVudHMoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgZXZlbnRzLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZHM6IFwiLCBldmVudHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBldmVudHMuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRmV2ZW50c1wiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9ldmVudHM8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnRzIGFyZSByZXRyaWV2ZWQ6IGAoZXJyLCBldmVudHMsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vZXZlbnRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGV2ZW50czogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zLm91dHB1dF9tb2RlID0gcGFyYW1zLm91dHB1dF9tb2RlIHx8IFwianNvbl9yb3dzXCI7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJldmVudHNcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbmFsaXplcyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IuZmluYWxpemUoZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgRklOQUxJWkVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImZpbmFsaXplXCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoaXMgc2VhcmNoIGpvYidzIGV2ZW50cyBvciByZXN1bHRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBPbmUgb2Yge1wiZXZlbnRzXCIsIFwicHJldmlld1wiLCBcInJlc3VsdHNcIn0uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbmFsIHBhcmFtZXRlcnM6XG4gICAgICAgICAqICAgIC0gYHBhZ2VzaXplYCAoX2ludGVnZXJfKTogVGhlIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4gb24gZWFjaCByZXF1ZXN0LiBEZWZhdWx0cyB0byBhcyBtYW55IGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhdG9yIG9iamVjdCB3aXRoIGEgYG5leHQoY2FsbGJhY2spYCBtZXRob2QsIHdoZXJlIGBjYWxsYmFja2AgaXMgb2YgdGhlIGZvcm0gYChlcnIsIHJlc3VsdHMsIGhhc01vcmVSZXN1bHRzKWAuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vcmVzdWx0c1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBpdGVyYXRvcjogZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuUGFnaW5hdGVkRW5kcG9pbnRJdGVyYXRvcih0aGlzW3R5cGVdLCBwYXJhbXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXVzZXMgYSBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnBhdXNlKGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFBBVVNFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBwYXVzZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJwYXVzZVwifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEdldHMgdGhlIHByZXZpZXcgcmVzdWx0cyBmb3IgYSBzZWFyY2ggam9iIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5wcmV2aWV3KHtjb3VudDogMTB9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkczogXCIsIHJlc3VsdHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBwcmV2aWV3IHJlc3VsdHMuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRnJlc3VsdHNfcHJldmlld1wiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzX3ByZXZpZXc8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcHJldmlldyByZXN1bHRzIGFyZSByZXRyaWV2ZWQgOiBgKGVyciwgcmVzdWx0cywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzX3ByZXZpZXdcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgcHJldmlldzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zLm91dHB1dF9tb2RlID0gcGFyYW1zLm91dHB1dF9tb2RlIHx8IFwianNvbl9yb3dzXCI7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJyZXN1bHRzX3ByZXZpZXdcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHJlc3VsdHMgZm9yIGEgc2VhcmNoIGpvYiB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBUaGUgY2FsbGJhY2sgY2FuIGdldCBgdW5kZWZpbmVkYCBmb3IgaXRzIGByZXN1bHRzYCBwYXJhbWV0ZXIgaWYgdGhlXG4gICAgICAgICAqIGpvYiBpcyBub3QgeWV0IGRvbmUuIFRvIGF2b2lkIHRoaXMsIHVzZSB0aGUgYEpvYi50cmFjaygpYCBtZXRob2QgdG9cbiAgICAgICAgICogd2FpdCB1bnRpbCB0aGUgam9iIGlzIGNvbXBsZXRlIHByaW9yIHRvIGZldGNoaW5nIHRoZSByZXN1bHRzIHdpdGhcbiAgICAgICAgICogdGhpcyBtZXRob2QuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnJlc3VsdHMoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cywgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmllbGRzOiBcIiwgcmVzdWx0cy5yZXN1bHRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBzZWFyY2ggcmVzdWx0cy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI0dFVF9zZWFyY2guMkZqb2JzLjJGLjdCc2VhcmNoX2lkLjdELjJGcmVzdWx0c1wiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzPC9hPiBlbmRwb2ludCBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlc3VsdHMgYXJlIHJldHJpZXZlZDogYChlcnIsIHJlc3VsdHMsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vcmVzdWx0c1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICByZXN1bHRzOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0X21vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwicmVzdWx0c1wiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgc2VhcmNoIGxvZyBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnNlYXJjaGxvZyhmdW5jdGlvbihlcnIsIHNlYXJjaGxvZywgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKHNlYXJjaGxvZyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggbG9nIGFuZCBqb2I6IGAoZXJyLCBzZWFyY2hsb2csIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vc2VhcmNoLmxvZ1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBzZWFyY2hsb2c6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInNlYXJjaC5sb2dcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgcHJpb3JpdHkgZm9yIHRoaXMgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5zZXRQcmlvcml0eSg2LCBmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkpPQiBQUklPUklUWSBTRVRcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgcHJpb3JpdHkgKGFuIGludGVnZXIgYmV0d2VlbiAxLTEwKS4gQSBoaWdoZXIgdmFsdWUgbWVhbnMgYSBoaWdoZXIgcHJpb3JpdHkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHNldFByaW9yaXR5OiBmdW5jdGlvbih2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJzZXRwcmlvcml0eVwiLCBwcmlvcml0eTogdmFsdWV9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHRpbWUgdG8gbGl2ZSAoVFRMKSBmb3IgdGhlIHNlYXJjaCBqb2IsIHdoaWNoIGlzIHRoZSB0aW1lIGJlZm9yZVxuICAgICAgICAgKiB0aGUgc2VhcmNoIGpvYiBleHBpcmVzIGFmdGVyIGl0IGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgYXZhaWxhYmxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnNldFRUTCgxMDAwLCBmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkpPQiBUVEwgU0VUXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgVGhlIHRpbWUgdG8gbGl2ZSwgaW4gc2Vjb25kcy4gXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHNldFRUTDogZnVuY3Rpb24odmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwic2V0dHRsXCIsIHR0bDogdmFsdWV9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHN1bW1hcnkgZm9yIHRoaXMgc2VhcmNoIGpvYiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnN1bW1hcnkoe3RvcF9jb3VudDogNX0sIGZ1bmN0aW9uKGVyciwgc3VtbWFyeSwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3VtbWFyeTogXCIsIHN1bW1hcnkpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSBzdW1tYXJ5LiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RzZWFyY2gjR0VUX3NlYXJjaC4yRmpvYnMuMkYuN0JzZWFyY2hfaWQuN0QuMkZzdW1tYXJ5XCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3N1bW1hcnk8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgc3VtbWFyeSBhbmQgc2VhcmNoIGpvYjogYChlcnIsIHN1bW1hcnksIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vc3VtbW1hcnlcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgc3VtbWFyeTogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJzdW1tYXJ5XCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB0aW1lbGluZSBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnRpbWVsaW5lKHt0aW1lX2Zvcm1hdDogXCIlY1wifSwgZnVuY3Rpb24oZXJyLCBqb2IsIHRpbWVsaW5lKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGltZWxpbmU6IFwiLCB0aW1lbGluZSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIHRpbWVsaW5lLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RzZWFyY2gjR0VUX3NlYXJjaC4yRmpvYnMuMkYuN0JzZWFyY2hfaWQuN0QuMkZ0aW1lbGluZVwiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS90aW1lbGluZSA8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgdGltZWxpbmUgYW5kIHNlYXJjaCBqb2I6IGAoZXJyLCB0aW1lbGluZSwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS90aW1lbGluZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICB0aW1lbGluZTogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJ0aW1lbGluZVwiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVG91Y2hlcyBhIHNlYXJjaCBqb2IsIHdoaWNoIG1lYW5zIGV4dGVuZGluZyB0aGUgZXhwaXJhdGlvbiB0aW1lIG9mIFxuICAgICAgICAgKiB0aGUgc2VhcmNoIHRvIG5vdyBwbHVzIHRoZSB0aW1lIHRvIGxpdmUgKFRUTCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IudG91Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFRPVUNIRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHRvdWNoOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInRvdWNoXCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnRzIHBvbGxpbmcgdGhlIHN0YXR1cyBvZiB0aGlzIHNlYXJjaCBqb2IsIGFuZCBmaXJlcyBjYWxsYmFja3NcbiAgICAgICAgICogdXBvbiBlYWNoIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVyczpcbiAgICAgICAgICogICAgLSBgcGVyaW9kYCAoX2ludGVnZXJfKTogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggcG9sbC4gRGVmYXVsdHMgdG8gNTAwLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2FsbGJhY2tzIEEgZGljdGlvbmFyeSBvZiBvcHRpb25hbCBjYWxsYmFja3M6XG4gICAgICAgICAqICAgIC0gYHJlYWR5YDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgd2hlbiB0aGUgam9iJ3MgcHJvcGVydGllcyBmaXJzdCBiZWNvbWUgYXZhaWxhYmxlLlxuICAgICAgICAgKiAgICAtIGBwcm9ncmVzc2A6IEEgZnVuY3Rpb24gYChqb2IpYCBpbnZva2VkIHdoZW5ldmVyIG5ldyBqb2IgcHJvcGVydGllcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiAgICAtIGBkb25lYDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgaWYgdGhlIGpvYiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LiBObyBmdXJ0aGVyIHBvbGxpbmcgaXMgZG9uZS5cbiAgICAgICAgICogICAgLSBgZmFpbGVkYDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgaWYgdGhlIGpvYiBmYWlscyBleGVjdXRpbmcgb24gdGhlIHNlcnZlci4gTm8gZnVydGhlciBwb2xsaW5nIGlzIGRvbmUuXG4gICAgICAgICAqICAgIC0gYGVycm9yYDogQSBmdW5jdGlvbiBgKGVycilgIGludm9rZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBvbGxpbmcuIE5vIGZ1cnRoZXIgcG9sbGluZyBpcyBkb25lLlxuICAgICAgICAgKiBPciwgaWYgYSBmdW5jdGlvbiBgKGpvYilgLCBlcXVpdmFsZW50IHRvIHBhc3NpbmcgaXQgYXMgYSBgZG9uZWAgY2FsbGJhY2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHRyYWNrOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHZhciBwZXJpb2QgPSBvcHRpb25zLnBlcmlvZCB8fCA1MDA7IC8vIG1zXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKGNhbGxiYWNrcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmU6IGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBub0NhbGxiYWNrc0FmdGVyUmVhZHkgPSAoXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5wcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICFjYWxsYmFja3MuZG9uZSAmJlxuICAgICAgICAgICAgICAgICFjYWxsYmFja3MuZmFpbGVkICYmXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5lcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2tzLnJlYWR5ID0gY2FsbGJhY2tzLnJlYWR5IHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBjYWxsYmFja3MucHJvZ3Jlc3MgPSBjYWxsYmFja3MucHJvZ3Jlc3MgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5kb25lID0gY2FsbGJhY2tzLmRvbmUgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5mYWlsZWQgPSBjYWxsYmFja3MuZmFpbGVkIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBjYWxsYmFja3MuZXJyb3IgPSBjYWxsYmFja3MuZXJyb3IgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9yIHVzZSBieSB0ZXN0cyBvbmx5XG4gICAgICAgICAgICBjYWxsYmFja3MuX3ByZXJlYWR5ID0gY2FsbGJhY2tzLl9wcmVyZWFkeSB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgY2FsbGJhY2tzLl9zdG9wcGVkQWZ0ZXJSZWFkeSA9IGNhbGxiYWNrcy5fc3RvcHBlZEFmdGVyUmVhZHkgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGVtaXR0ZWRSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGRvbmVMb29waW5nID0gZmFsc2U7XG4gICAgICAgICAgICBBc3luYy53aGlsc3QoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiAhZG9uZUxvb3Bpbmc7IH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24obmV4dEl0ZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmZldGNoKGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZXJhdGlvbihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BhdGNoU3RhdGUgPSBqb2IucHJvcGVydGllcygpLmRpc3BhdGNoU3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm90UmVhZHkgPSBkaXNwYXRjaFN0YXRlID09PSBcIlFVRVVFRFwiIHx8IGRpc3BhdGNoU3RhdGUgPT09IFwiUEFSU0lOR1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLl9wcmVyZWFkeShqb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbWl0dGVkUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnJlYWR5KGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWRSZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IERvbid0IGtlZXAgcG9sbGluZyB0aGUgam9iIGlmIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZXIgb25seSBjYXJlcyBhYm91dCB0aGUgYHJlYWR5YCBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vQ2FsbGJhY2tzQWZ0ZXJSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLl9zdG9wcGVkQWZ0ZXJSZWFkeShqb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTG9vcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnByb2dyZXNzKGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0gam9iLnByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hTdGF0ZSA9PT0gXCJET05FXCIgJiYgcHJvcHMuaXNEb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5kb25lKGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTG9vcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwYXRjaFN0YXRlID09PSBcIkZBSUxFRFwiICYmIHByb3BzLmlzRmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mYWlsZWQoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZXJhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBBc3luYy5zbGVlcChwZXJpb2QsIG5leHRJdGVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlc3VtZXMgYSBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnVucGF1c2UoZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFVOUEFVU0VEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgc2VhcmNoIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICB1bnBhdXNlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInVucGF1c2VcIn0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2Ygc2VhcmNoIGpvYnMuIFlvdSBjYW4gY3JlYXRlIGFuZCBsaXN0IHNlYXJjaCBcbiAgICAgKiBqb2JzIHVzaW5nIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIHNlYXJjaCBqb2IuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LkpvYnMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5qb2JzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIG5ldyBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSm9iYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIHNpZCA9IHByb3BzLmNvbnRlbnQuc2lkO1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Kb2IodGhpcy5zZXJ2aWNlLCBzaWQsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Kb2JzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Kb2JzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY3JlYXRlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNlYXJjaCBqb2Igd2l0aCBhIGdpdmVuIHNlYXJjaCBxdWVyeSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycywgaW5jbHVkaW5nIGBleGVjX21vZGVgIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygc2VhcmNoOlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPW5vcm1hbGAgdG8gcmV0dXJuIGEgc2VhcmNoIGpvYiBJRCBpbW1lZGlhdGVseSAoZGVmYXVsdCkuXG4gICAgICAgICAqICAgICAgUG9sbCBmb3IgY29tcGxldGlvbiB0byBmaW5kIG91dCB3aGVuIHlvdSBjYW4gcmV0cmlldmUgc2VhcmNoIHJlc3VsdHMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPWJsb2NraW5nYCB0byByZXR1cm4gdGhlIHNlYXJjaCBqb2IgSUQgd2hlbiB0aGUgc2VhcmNoIGhhcyBmaW5pc2hlZC5cbiAgICAgICAgICogXG4gICAgICAgICAqIFRvIHJ1biBhIG9uZXNob3Qgc2VhcmNoLCB3aGljaCBkb2VzIG5vdCBjcmVhdGUgYSBqb2IgYnV0IHJhdGhlciByZXR1cm5zIHRoZSBzZWFyY2ggcmVzdWx0cywgdXNlIGBTZXJ2aWNlLkpvYnMub25lc2hvdFNlYXJjaGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIGpvYjogYChlcnIsIGNyZWF0ZWRKb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QocXVlcnkpICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHBhcmFtcy5zZWFyY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSBxdWVyeTsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgocGFyYW1zLmV4ZWNfbW9kZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpID09PSBcIm9uZXNob3RcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSB1c2Ugc3BsdW5ranMuU2VydmljZS5Kb2JzLm9uZXNob3RTZWFyY2ggZm9yIGV4ZWNfbW9kZT1vbmVzaG90XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhcIk11c3QgcHJvdmlkZSBhIHF1ZXJ5IHRvIGNyZWF0ZSBhIHNlYXJjaCBqb2JcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3QoXCJcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpvYiA9IG5ldyByb290LkpvYih0aGF0LnNlcnZpY2UsIHJlc3BvbnNlLmRhdGEuc2lkLCB0aGF0Lm5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGpvYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2VhcmNoIGpvYiB3aXRoIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYGV4ZWNfbW9kZWAgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBzZWFyY2g6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9bm9ybWFsYCB0byByZXR1cm4gYSBzZWFyY2ggam9iIElEIGltbWVkaWF0ZWx5IChkZWZhdWx0KS5cbiAgICAgICAgICogICAgICBQb2xsIGZvciBjb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4geW91IGNhbiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0cy4gXG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9YmxvY2tpbmdgIHRvIHJldHVybiB0aGUgc2VhcmNoIGpvYiBJRCB3aGVuIHRoZSBzZWFyY2ggaGFzIGZpbmlzaGVkLlxuICAgICAgICAgKiBcbiAgICAgICAgICogVG8gcnVuIGEgb25lc2hvdCBzZWFyY2gsIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBidXQgcmF0aGVyIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHRzLCB1c2UgYFNlcnZpY2UuSm9icy5vbmVzaG90U2VhcmNoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9icyA9IHNlcnZpY2Uuam9icygpO1xuICAgICAgICAgKiAgICAgIGpvYnMuc2VhcmNoKFwic2VhcmNoIEVSUk9SXCIsIHtpZDogXCJteWpvYl8xMjNcIn0sIGZ1bmN0aW9uKGVyciwgbmV3Sm9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiOiBuZXdKb2Iuc2lkKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBzZWFyY2ggam9iLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogICAgICAgICoqTm90ZToqKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBleGVjX21vZGU9b25lc2hvdGAgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBwcm9wZXJ0aWVzIGRpY3Rpb25hcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBuZXcgc2VhcmNoIGpvYjogYChlcnIsIGNyZWF0ZWRKb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUocXVlcnksIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG9uZXNob3Qgc2VhcmNoIGZyb20gYSBnaXZlbiBzZWFyY2ggcXVlcnkgYW5kIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYnMgPSBzZXJ2aWNlLmpvYnMoKTtcbiAgICAgICAgICogICAgICBqb2JzLm9uZXNob3RTZWFyY2goXCJzZWFyY2ggRVJST1JcIiwge2lkOiBcIm15am9iXzEyM1wifSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiUkVTVUxUIEZJRUxEU1wiOiByZXN1bHRzLmZpZWxkcyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LiBcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaDpcbiAgICAgICAgICogICAgLSBgb3V0cHV0X21vZGVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgcmVzdWx0cyAoWE1MLCBKU09OLCBvciBDU1YpLlxuICAgICAgICAgKiAgICAtIGBlYXJsaWVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGVhcmxpZXN0IHRpbWUgaW4gdGhlIHRpbWUgcmFuZ2UgdG8gc2VhcmNoLiBUaGUgdGltZSBzdHJpbmcgY2FuIGJlIGEgVVRDIHRpbWUgKHdpdGggZnJhY3Rpb25hbCBzZWNvbmRzKSwgYSByZWxhdGl2ZSB0aW1lIHNwZWNpZmllciAodG8gbm93KSwgb3IgYSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXG4gICAgICAgICAqICAgIC0gYGxhdGVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGxhdGVzdCB0aW1lIGluIHRoZSB0aW1lIHJhbmdlIHRvIHNlYXJjaC4gVGhlIHRpbWUgc3RyaW5nIGNhbiBiZSBhIFVUQyB0aW1lICh3aXRoIGZyYWN0aW9uYWwgc2Vjb25kcyksIGEgcmVsYXRpdmUgdGltZSBzcGVjaWZpZXIgKHRvIG5vdyksIG9yIGEgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgICAgICAgKiAgICAtIGByZmAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpZWxkcyB0byBhZGQgdG8gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaDogYChlcnIsIHJlc3VsdHMpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBvbmVzaG90U2VhcmNoOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsZWQgdXMgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZSBvZiAocGFyYW1zLCBjYWxsYmFjayksXG4gICAgICAgICAgICAvLyBsZXRzIG1ha2UgaXQgd29ya1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KHF1ZXJ5KSAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcXVlcnk7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBwYXJhbXMuc2VhcmNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gcXVlcnk7IFxuICAgICAgICAgICAgcGFyYW1zLmV4ZWNfbW9kZSA9IFwib25lc2hvdFwiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhcIk11c3QgcHJvdmlkZSBhIHF1ZXJ5IHRvIGNyZWF0ZSBhIHNlYXJjaCBqb2JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvdXRwdXRNb2RlID0gcGFyYW1zLm91dHB1dF9tb2RlIHx8IFwianNvbl9yb3dzXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIHZhciBwb3N0ID0gcGFyYW1zO1xuICAgICAgICAgICAgdmFyIGdldCA9IHtvdXRwdXRfbW9kZTogb3V0cHV0TW9kZX07XG4gICAgICAgICAgICB2YXIgYm9keSA9IG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnNlcnZpY2UucmVxdWVzdChcbiAgICAgICAgICAgICAgICBwYXRoLCBcbiAgICAgICAgICAgICAgICBtZXRob2QsIFxuICAgICAgICAgICAgICAgIGdldCwgXG4gICAgICAgICAgICAgICAgcG9zdCwgXG4gICAgICAgICAgICAgICAgYm9keSwgXG4gICAgICAgICAgICAgICAgaGVhZGVycywgXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZmllbGQgb2YgYSBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIGZvciBgRGF0YU1vZGVsQ2FsY3VsYXRpb25gXG4gICAgICogYW5kIGBEYXRhTW9kZWxPYmplY3RgLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZmllbGROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiAgQSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkLlxuICAgICAqICAgIC0gYHR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgZmllbGQuXG4gICAgICogICAgLSBgbXVsdGl2YWx1ZWRgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgbXVsdGl2YWx1ZWQuXG4gICAgICogICAgLSBgcmVxdWlyZWRgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuXG4gICAgICogICAgLSBgaGlkZGVuYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBkYXRhIG1vZGVsIFVJLlxuICAgICAqICAgIC0gYGVkaXRhYmxlYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQuXG4gICAgICogICAgLSBgY29tbWVudGAgKF9zdHJpbmdfKTogQSBjb21tZW50IGZvciB0aGlzIGZpZWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAqICAgIC0gYGZpZWxkU2VhcmNoYCAoX3N0cmluZ18pOiBBIHNlYXJjaCBxdWVyeSBmcmFnbWVudCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIHN0cmluZ3Mgb2YgdGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWxcbiAgICAgKiAgICAgICAgICBvbiB3aGljaCB0aGlzIGZpZWxkIGlzIGRlZmluZWQuXG4gICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBvbiB3aGljaCB0aGlzIGZpZWxkIGlzIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB0eXBlcyBmb3IgYSBkYXRhIG1vZGVsIGZpZWxkOlxuICAgICAqICAgIC0gYHN0cmluZ2BcbiAgICAgKiAgICAtIGBib29sZWFuYFxuICAgICAqICAgIC0gYG51bWJlcmBcbiAgICAgKiAgICAtIGB0aW1lc3RhbXBgXG4gICAgICogICAgLSBgb2JqZWN0Q291bnRgXG4gICAgICogICAgLSBgY2hpbGRDb3VudGBcbiAgICAgKiAgICAtIGBpcHY0YFxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbEZpZWxkID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgX3R5cGVzOiBbIFwic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwidGltZXN0YW1wXCIsIFwib2JqZWN0Q291bnRcIiwgXCJjaGlsZENvdW50XCIsIFwiaXB2NFwiLCBcImJvb2xlYW5cIl0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGRhdGEgbW9kZWwgZmllbGQuXG4gICAgICAgICAqIFNESyB1c2VycyBhcmUgbm90IGV4cGVjdGVkIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHRvIHNldDpcbiAgICAgICAgICogICAgIC0gYGZpZWxkTmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgICAgICogICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQuXG4gICAgICAgICAqICAgICAtIGB0eXBlYCAoX3N0cmluZ18pOiBUaGUgdHlwZSBvZiB0aGlzIGZpZWxkLCBzZWUgdmFsaWQgdHlwZXMgaW4gY2xhc3MgZG9jcy5cbiAgICAgICAgICogICAgIC0gYG11bHRpdmFsdWVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgbXVsdGl2YWx1ZWQuXG4gICAgICAgICAqICAgICAtIGByZXF1aXJlZGAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyByZXF1aXJlZCBvbiBldmVudHMgaW4gdGhlIG9iamVjdFxuICAgICAgICAgKiAgICAgLSBgaGlkZGVuYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBkYXRhIG1vZGVsIFVJLlxuICAgICAgICAgKiAgICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZC5cbiAgICAgICAgICogICAgIC0gYGNvbW1lbnRgIChfc3RyaW5nXyk6IEEgY29tbWVudCBmb3IgdGhpcyBmaWVsZCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzbid0IG9uZS5cbiAgICAgICAgICogICAgIC0gYGZpZWxkU2VhcmNoYCAoX3N0cmluZ18pOiBBIHNlYXJjaCBxdWVyeSBmcmFnbWVudCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgICAgICogICAgIC0gYGxpbmVhZ2VgIChfc3RyaW5nXyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBvbiB3aGljaCB0aGlzIGZpZWxkXG4gICAgICAgICAqICAgICAgICAgIGlzIGRlZmluZWQsIGl0ZW1zIGFyZSBkZWxpbWl0ZWQgYnkgYSBkb3QuIFRoaXMgaXMgY29udmVydGVkIGludG8gYW4gYXJyYXkgb2ZcbiAgICAgICAgICogICAgICAgICAgc3RyaW5ncyB1cG9uIGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIHByb3BzLm93bmVyID0gcHJvcHMub3duZXIgfHwgXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5uYW1lICAgICAgICAgICA9IHByb3BzLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgICAgPSBwcm9wcy5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHRoaXMudHlwZSAgICAgICAgICAgPSBwcm9wcy50eXBlO1xuICAgICAgICAgICAgdGhpcy5tdWx0aXZhbHVlZCAgICA9IHByb3BzLm11bHRpdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVkICAgICAgID0gcHJvcHMucmVxdWlyZWQ7XG4gICAgICAgICAgICB0aGlzLmhpZGRlbiAgICAgICAgID0gcHJvcHMuaGlkZGVuO1xuICAgICAgICAgICAgdGhpcy5lZGl0YWJsZSAgICAgICA9IHByb3BzLmVkaXRhYmxlO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50ICAgICAgICA9IHByb3BzLmNvbW1lbnQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmllbGRTZWFyY2ggICAgPSBwcm9wcy5maWVsZFNlYXJjaDtcbiAgICAgICAgICAgIHRoaXMubGluZWFnZSAgICAgICAgPSBwcm9wcy5vd25lci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB0aGlzLm93bmVyICAgICAgICAgID0gdGhpcy5saW5lYWdlW3RoaXMubGluZWFnZS5sZW5ndGggLSAxXTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgc3RyaW5nP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIHN0cmluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBudW1iZXI/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgbnVtYmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGlzTnVtYmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm51bWJlclwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIHRpbWVzdGFtcD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgZmllbGQgaXMgb2YgdHlwZSB0aW1lc3RhbXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNUaW1lc3RhbXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwidGltZXN0YW1wXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgb2JqZWN0IGNvdW50P1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIG9iamVjdCBjb3VudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc09iamVjdGNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm9iamVjdENvdW50XCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgY2hpbGQgY291bnQ/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgY2hpbGQgY291bnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNDaGlsZGNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcImNoaWxkQ291bnRcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBpcHY0P1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIGlwdjQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNJUHY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcImlwdjRcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBib29sZWFuP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIGJvb2xlYW4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcImJvb2xlYW5cIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbnN0cmFpbnQgb24gYSBgRGF0YU1vZGVsT2JqZWN0YCBvciBhIGBEYXRhTW9kZWxGaWVsZGAuXG4gICAgICpcbiAgICAgKiBIYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKiAgICAtIGBxdWVyeWAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBxdWVyeSBkZWZpbmluZyB0aGlzIGRhdGEgbW9kZWwgY29uc3RyYWludC5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IFRoZSBsaW5lYWdlIG9mIHRoaXMgZGF0YSBtb2RlbCBjb25zdHJhaW50LlxuICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCBvYmplY3QgdGhhdCBvd25zXG4gICAgICogICAgICAgICAgdGhpcyBkYXRhIG1vZGVsIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDb25zdHJhaW50XG4gICAgICovXG4gICAgcm9vdC5EYXRhTW9kZWxDb25zdHJhaW50ID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGRhdGEgbW9kZWwgY29uc3RyYWludC5cbiAgICAgICAgICogU0RLIHVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHNlYXJjaCBxdWVyeSB0aGlzIGNvbnN0cmFpbnQgc3BlY2lmaWVzLlxuICAgICAgICAgKiAgICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCB0aGF0IG93bnMgdGhpc1xuICAgICAgICAgKiAgICAgICAgICBjb25zdHJhaW50LCBpdGVtcyBhcmUgZGVsaW1pdGVkIGJ5IGEgZG90LiBUaGlzIGlzIGNvbnZlcnRlZCBpbnRvXG4gICAgICAgICAqICAgICAgICAgIGFuIGFycmF5IG9mIHN0cmluZ3MgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDb25zdHJhaW50XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIHByb3BzLm93bmVyID0gcHJvcHMub3duZXIgfHwgXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5xdWVyeSAgID0gcHJvcHMuc2VhcmNoO1xuICAgICAgICAgICAgdGhpcy5saW5lYWdlID0gcHJvcHMub3duZXIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgdGhpcy5vd25lciAgID0gdGhpcy5saW5lYWdlW3RoaXMubGluZWFnZS5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHNwZWNpZnlpbmcgYSBjYWxjdWxhdGlvbiBvbiBhIGBEYXRhTW9kZWxPYmplY3RgLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgaWRgIChfc3RyaW5nXyk6IFRoZSBJRCBmb3IgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLlxuICAgICAqICAgIC0gYHR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbi5cbiAgICAgKiAgICAtIGBjb21tZW50YCAoX3N0cmluZ198X251bGxfKTogVGhlIGNvbW1lbnQgZm9yIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiwgb3IgYG51bGxgLlxuICAgICAqICAgIC0gYGVkaXRhYmxlYCAoX2Jvb2xlYW5fKTogVHJ1ZSBpZiB0aGlzIGNhbGN1bGF0aW9uIGNhbiBiZSBlZGl0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBvbiB3aGljaCB0aGlzIGNhbGN1bGF0aW9uXG4gICAgICogICAgICAgICAgaXMgZGVmaW5lZCBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgZGF0YSBtb2RlbCB0aGF0IHRoaXMgY2FsY3VsYXRpb24gYmVsb25ncyB0by5cbiAgICAgKiAgICAtIGBvdXRwdXRGaWVsZHNgIChfYXJyYXlfKTogVGhlIGZpZWxkcyBvdXRwdXQgYnkgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBSZXggYW5kIEV2YWwgdHlwZXMgaGF2ZSBhbiBhZGRpdGlvbmFsIHByb3BlcnR5OlxuICAgICAqICAgIC0gYGV4cHJlc3Npb25gIChfc3RyaW5nXyk6IFRoZSBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBSZXggYW5kIEdlb0lQIHR5cGVzIGhhdmUgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eTpcbiAgICAgKiAgICAtIGBpbnB1dEZpZWxkYCAoX3N0cmluZ18pOiBUaGUgZmllbGQgdG8gdXNlIGZvciBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBMb29rdXAgdHlwZSBoYXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGxvb2t1cE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBsb29rdXAgdG8gcGVyZm9ybS5cbiAgICAgKiAgICAtIGBpbnB1dEZpZWxkTWFwcGluZ3NgIChfb2JqZWN0Xyk6IFRoZSBtYXBwaW5ncyBmcm9tIGZpZWxkcyBpbiB0aGUgZXZlbnRzIHRvIGZpZWxkcyBpbiB0aGUgbG9va3VwLlxuICAgICAqXG4gICAgICogVmFsaWQgdHlwZXMgb2YgY2FsY3VsYXRpb25zIGFyZTpcbiAgICAgKiAgICAtIGBMb29rdXBgXG4gICAgICogICAgLSBgRXZhbGBcbiAgICAgKiAgICAtIGBHZW9JUGBcbiAgICAgKiAgICAtIGBSZXhgXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsQ2FsY3VsYXRpb24gPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICBfdHlwZXM6IFtcIkxvb2t1cFwiLCBcIkV2YWxcIiwgXCJHZW9JUFwiLCBcIlJleFwiXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbi5cbiAgICAgICAgICogU0RLIHVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAgLSBgY2FsY3VsYXRpb25JRGAgKF9zdHJpbmdfKTogVGhlIElEIG9mIHRoaXMgY2FsY3VsYXRpb24uXG4gICAgICAgICAqICAgICAtIGBjYWxjdWxhdGlvblR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgY2FsY3VsYXRpb24sIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogICAgIC0gYGVkaXRhYmxlYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGNhbGN1bGF0aW9uIGNhbiBiZSBlZGl0ZWQuXG4gICAgICAgICAqICAgICAtIGBjb21tZW50YCAoX3N0cmluZ18pOiBBIGNvbW1lbnQgZm9yIHRoaXMgY2FsY3VsYXRpb24sIG9yIGBudWxsYCBpZiB0aGVyZSBpc24ndCBvbmUuXG4gICAgICAgICAqICAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgY2FsY3VsYXRpb25cbiAgICAgICAgICogICAgICAgICAgaXMgZGVmaW5lZCwgaXRlbXMgYXJlIGRlbGltaXRlZCBieSBhIGRvdC4gVGhpcyBpcyBjb252ZXJ0ZWQgaW50byBhbiBhcnJheSBvZlxuICAgICAgICAgKiAgICAgICAgICBzdHJpbmdzIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgICAgKiAgICAgLSBgb3V0cHV0RmllbGRzYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIHRoZSBmaWVsZHMgdGhpcyBjYWxjdWxhdGlvbiBnZW5lcmF0ZXMuXG4gICAgICAgICAqICAgICAtIGBleHByZXNzaW9uYCAoX3N0cmluZ18pOiBUaGUgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoaXMgY2FsY3VsYXRpb247IGV4Y2x1c2l2ZSB0byBgRXZhbGAgYW5kIGBSZXhgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBpbnB1dEZpZWxkYCAoX3N0cmluZ18pOiBUaGUgZmllbGQgdG8gdXNlIGZvciBjYWxjdWxhdGlvbjsgZXhjbHVzaXZlIHRvIGBHZW9JUGAgYW5kIGBSZXhgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBsb29rdXBOYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgbG9va3VwIHRvIHBlcmZvcm07IGV4Y2x1c2l2ZSB0byBgTG9va3VwYCBjYWxjdWxhdGlvbnMgKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgaW5wdXRGaWVsZE1hcHBpbmdzYCAoX2FycmF5Xyk6IE9uZSBlbGVtZW50IGFycmF5IGNvbnRhaW5pbmcgYW4gb2JqZWN0IHdpdGggdGhlIG1hcHBpbmdzIGZyb20gZmllbGRzIGluIHRoZSBldmVudHMgdG8gZmllbGRzXG4gICAgICAgICAqICAgICAgICAgaW4gdGhlIGxvb2t1cDsgZXhjbHVzaXZlIHRvIGBMb29rdXBgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgfHwge307XG4gICAgICAgICAgICBwcm9wcy5vd25lciA9IHByb3BzLm93bmVyIHx8IFwiXCI7XG5cbiAgICAgICAgICAgIHRoaXMuaWQgICAgICAgICAgICAgPSBwcm9wcy5jYWxjdWxhdGlvbklEO1xuICAgICAgICAgICAgdGhpcy50eXBlICAgICAgICAgICA9IHByb3BzLmNhbGN1bGF0aW9uVHlwZTtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCAgICAgICAgPSBwcm9wcy5jb21tZW50IHx8IG51bGw7XG4gICAgICAgICAgICB0aGlzLmVkaXRhYmxlICAgICAgID0gcHJvcHMuZWRpdGFibGU7XG4gICAgICAgICAgICB0aGlzLmxpbmVhZ2UgICAgICAgID0gcHJvcHMub3duZXIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgdGhpcy5vd25lciAgICAgICAgICA9IHRoaXMubGluZWFnZVt0aGlzLmxpbmVhZ2UubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgIHRoaXMub3V0cHV0RmllbGRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLm91dHB1dEZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0RmllbGRzW3Byb3BzLm91dHB1dEZpZWxkc1tpXS5maWVsZE5hbWVdID0gbmV3IHJvb3QuRGF0YU1vZGVsRmllbGQocHJvcHMub3V0cHV0RmllbGRzW2ldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFwiRXZhbFwiID09PSB0aGlzLnR5cGUgfHwgXCJSZXhcIiA9PT0gdGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gcHJvcHMuZXhwcmVzc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcIkdlb0lQXCIgPT09IHRoaXMudHlwZSB8fCBcIlJleFwiID09PSB0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RmllbGQgPSBwcm9wcy5pbnB1dEZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiTG9va3VwXCIgPT09IHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9va3VwTmFtZSA9IHByb3BzLmxvb2t1cE5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEZpZWxkTWFwcGluZ3MgPSBwcm9wcy5sb29rdXBJbnB1dHNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiBvdXRwdXQgZmllbGQgbmFtZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIG9mIG91dHB1dCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRGaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm91dHB1dEZpZWxkcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBlZGl0YWJsZT9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgZWRpdGFibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaXNFZGl0YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmVkaXRhYmxlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gb2YgdHlwZSBsb29rdXA/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGlzIG9mIHR5cGUgbG9va3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzTG9va3VwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkxvb2t1cFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBvZiB0eXBlIGV2YWw/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGlzIG9mIHR5cGUgZXZhbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc0V2YWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiRXZhbFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIG9mIHR5cGUgUmV4P1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBpcyBvZiB0eXBlIFJleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc1JleDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJSZXhcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gb2YgdHlwZSBHZW9JUD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgb2YgdHlwZSBHZW9JUC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc0dlb0lQOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkdlb0lQXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFBpdm90IHJlcHJlc2VudHMgZGF0YSBhYm91dCBhIHBpdm90IHJlcG9ydCByZXR1cm5lZCBieSB0aGUgU3BsdW5rIFNlcnZlci5cbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYHNlcnZpY2VgIChfc3BsdW5ranMuU2VydmljZV8pOiBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgKiAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggc3RyaW5nIGZvciBydW5uaW5nIHRoZSBwaXZvdCByZXBvcnQuXG4gICAgICogICAgLSBgZHJpbGxkb3duU2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIGZvciBydW5uaW5nIHRoaXMgcGl2b3QgcmVwb3J0IHVzaW5nIGRyaWxsZG93bi5cbiAgICAgKiAgICAtIGBvcGVuSW5TZWFyY2hgIChfc3RyaW5nXyk6IEVxdWl2YWxlbnQgdG8gc2VhcmNoIHBhcmFtZXRlciwgYnV0IGxpc3RlZCBtb3JlIHNpbXBseS5cbiAgICAgKiAgICAtIGBwcmV0dHlRdWVyeWAgKF9zdHJpbmdfKTogRXF1aXZhbGVudCB0byBgb3BlbkluU2VhcmNoYC5cbiAgICAgKiAgICAtIGBwaXZvdFNlYXJjaGAgKF9zdHJpbmdfKTogQSBwaXZvdCBzZWFyY2ggY29tbWFuZCBiYXNlZCBvbiB0aGUgbmFtZWQgZGF0YSBtb2RlbC5cbiAgICAgKiAgICAtIGB0c3RhdHNTZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggZm9yIHJ1bm5pbmcgdGhpcyBwaXZvdCByZXBvcnQgdXNpbmcgdHN0YXRzLlxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RcbiAgICAgKi9cbiAgICByb290LlBpdm90ID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIHBpdm90LlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHRvIHNldDpcbiAgICAgICAgICogICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHN0cmluZyBmb3IgcnVubmluZyB0aGUgcGl2b3QgcmVwb3J0LlxuICAgICAgICAgKiAgICAtIGBkcmlsbGRvd25fc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIGZvciBydW5uaW5nIHRoaXMgcGl2b3QgcmVwb3J0IHVzaW5nIGRyaWxsZG93bi5cbiAgICAgICAgICogICAgLSBgb3Blbl9pbl9zZWFyY2hgIChfc3RyaW5nXyk6IEVxdWl2YWxlbnQgdG8gc2VhcmNoIHBhcmFtZXRlciwgYnV0IGxpc3RlZCBtb3JlIHNpbXBseS5cbiAgICAgICAgICogICAgLSBgcGl2b3Rfc2VhcmNoYCAoX3N0cmluZ18pOiBBIHBpdm90IHNlYXJjaCBjb21tYW5kIGJhc2VkIG9uIHRoZSBuYW1lZCBkYXRhIG1vZGVsLlxuICAgICAgICAgKiAgICAtIGB0c3RhdHNfc2VhcmNoYCAoX3N0cmluZ198X251bGxfKTogVGhlIHNlYXJjaCBmb3IgcnVubmluZyB0aGlzIHBpdm90IHJlcG9ydCB1c2luZyB0c3RhdHMsIG51bGwgaWYgYWNjZWxlcmF0aW9uIGlzIGRpc2FibGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2ggPSBwcm9wcy5zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLmRyaWxsZG93blNlYXJjaCA9IHByb3BzLmRyaWxsZG93bl9zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLnByZXR0eVF1ZXJ5ID0gdGhpcy5vcGVuSW5TZWFyY2ggPSBwcm9wcy5vcGVuX2luX3NlYXJjaDtcbiAgICAgICAgICAgIHRoaXMucGl2b3RTZWFyY2ggPSBwcm9wcy5waXZvdF9zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLnRzdGF0c1NlYXJjaCA9IHByb3BzLnRzdGF0c19zZWFyY2ggfHwgbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5ydW4gPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucnVuKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnRzIGEgc2VhcmNoIGpvYiBydW5uaW5nIHRoaXMgcGl2b3QsIGFjY2VsZXJhdGVkIGlmIHBvc3NpYmxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJncyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IgKG9wdGlvbmFsKS4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqICAgICAgICAqKk5vdGU6KiogVGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBgZXhlY19tb2RlPW9uZXNob3RgIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcHJvcGVydGllcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBkb25lIGNyZWF0aW5nIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFxuICAgICAgICAgKi9cbiAgICAgICAgcnVuOiBmdW5jdGlvbihhcmdzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYXJncztcbiAgICAgICAgICAgICAgICBhcmdzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFyZ3MgfHwgT2JqZWN0LmtleXMoYXJncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0c3RhdHMgaXMgdW5kZWZpbmVkLCB1c2UgcGl2b3RTZWFyY2ggKHRyeSB0byBydW4gYW4gYWNjZWxlcmF0ZWQgc2VhcmNoIGlmIHBvc3NpYmxlKVxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNlYXJjaCh0aGlzLnRzdGF0c1NlYXJjaCB8fCB0aGlzLnBpdm90U2VhcmNoLCBhcmdzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFBpdm90U3BlY2lmaWNhdGlvbiByZXByZXNlbnRzIGEgcGl2b3QgdG8gYmUgZG9uZSBvbiBhIHBhcnRpY3VsYXIgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICogVGhlIHVzZXIgY3JlYXRlcyBhIFBpdm90U3BlY2lmaWNhdGlvbiBvbiBzb21lIGRhdGEgbW9kZWwgb2JqZWN0LCBhZGRzIGZpbHRlcnMsIHJvdyBzcGxpdHMsXG4gICAgICogY29sdW1uIHNwbGl0cywgYW5kIGNlbGwgdmFsdWVzLCB0aGVuIGNhbGxzIHRoZSBwaXZvdCBtZXRob2QgdG8gcXVlcnkgc3BsdW5rZCBhbmRcbiAgICAgKiBnZXQgYSBzZXQgb2YgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHNwZWNpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBDYWxsIHRoZSBgcGl2b3RgIG1ldGhvZCB0byBxdWVyeSBTcGx1bmsgZm9yIFNQTCBxdWVyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwaXZvdC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYSBmbHVlbnQgQVBJLCBlYWNoIGZ1bmN0aW9uIGV4Y2VwdCBgaW5pdGAsIGB0b0pzb25PYmplY3RgICYgYHBpdm90YFxuICAgICAqIHJldHVybiB0aGUgbW9kaWZpZWQgYHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICAgIHNlcnZpY2UuZGF0YU1vZGVscygpLmZldGNoKGZ1bmN0aW9uKGVyciwgZGF0YU1vZGVscykge1xuICAgICAqICAgICAgICAgdmFyIHNlYXJjaGVzID0gZGF0YU1vZGVscy5pdGVtKFwiaW50ZXJuYWxfYXVkaXRfbG9nc1wiKS5vYmplY3RCeU5hbWUoXCJzZWFyY2hlc1wiKTtcbiAgICAgKiAgICAgICAgIHZhciBwaXZvdFNwZWNpZmljYXRpb24gPSBzZWFyY2hlcy5jcmVhdGVQaXZvdFNwZWNpZmljYXRpb24oKTtcbiAgICAgKiAgICAgICAgIHBpdm90U3BlY2lmaWNhdGlvblxuICAgICAqICAgICAgICAgICAgIC5hZGRSb3dTcGxpdChcInVzZXJcIiwgXCJFeGVjdXRpbmcgdXNlclwiKVxuICAgICAqICAgICAgICAgICAgIC5hZGRSYW5nZUNvbHVtblNwbGl0KFwiZXhlY190aW1lXCIsIHtsaW1pdDogNH0pXG4gICAgICogICAgICAgICAgICAgLmFkZENlbGxWYWx1ZShcInNlYXJjaFwiLCBcIlNlYXJjaCBRdWVyeVwiLCBcInZhbHVlc1wiKVxuICAgICAqICAgICAgICAgICAgIC5waXZvdChmdW5jdGlvbihlcnIsIHBpdm90KSB7XG4gICAgICogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR290IGEgUGl2b3Qgb2JqZWN0IGZyb20gdGhlIFNwbHVuayBzZXJ2ZXIhXCIpO1xuICAgICAqICAgICAgICAgICAgIH0pO1xuICAgICAqICAgICB9KTtcbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGRhdGFNb2RlbE9iamVjdGAgKF9zcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdF8pOiBUaGUgYERhdGFNb2RlbE9iamVjdGAgZnJvbSB3aGljaFxuICAgICAqICAgICAgICB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gIHdhcyBjcmVhdGVkLlxuICAgICAqICAgIC0gYGNvbHVtbnNgIChfYXJyYXlfKTogVGhlIGNvbHVtbiBzcGxpdHMgb24gdGhpcyBgUGl2b3RTcGVjaWZpY2F0aW9uYC5cbiAgICAgKiAgICAtIGByb3dzYCAoX2FycmF5Xyk6IFRoZSByb3cgc3BsaXRzIG9uIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICogICAgLSBgZmlsdGVyc2AgKF9hcnJheV8pOiBUaGUgZmlsdGVycyBvbiB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAqICAgIC0gYGNlbGxzYCAoX2FycmF5Xyk6IFRoZSBjZWxsIGFnZ3JlZ2F0aW9ucyBmb3IgdGhpc2BQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAqICAgIC0gYGFjY2VsZXJhdGlvbk5hbWVzcGFjZWAgKF9zdHJpbmdffF9udWxsXyk6IFRoZSBuYW1lIG9mIHRoZSBgRGF0YU1vZGVsYCB0aGF0IG93bnMgdGhlIGBEYXRhTW9kZWxPYmplY3RgXG4gICAgICogICAgICAgIG9uIHdoaWNoIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAgd2FzIGNyZWF0ZWQgaWYgdGhlIGBEYXRhTW9kZWxgIGlzIGFjY2VsZXJhdGVkLiBBbHRlcm5hdGl2ZWx5LFxuICAgICAqICAgICAgICB5b3UgY2FuIHNldCB0aGlzIHByb3BlcnR5IG1hbnVhbGx5IHRvIHRoZSBzaWQgb2YgYW4gYWNjZWxlcmF0aW9uIGpvYiBpbiB0aGUgZm9ybWF0IGBzaWQ9PHNpZD5gLlxuICAgICAqXG4gICAgICogVmFsaWQgY29tcGFyaXNvbiB0eXBlcyBhcmU6XG4gICAgICogICAgLSBgYm9vbGVhbmBcbiAgICAgKiAgICAtIGBzdHJpbmdgXG4gICAgICogICAgLSBgbnVtYmVyYFxuICAgICAqICAgIC0gYGlwdjRgXG4gICAgICpcbiAgICAgKiBWYWxpZCBib29sZWFuIGNvbXBhcmlzb25zIGFyZTpcbiAgICAgKiAgICAtIGA9YFxuICAgICAqICAgIC0gYGlzYFxuICAgICAqICAgIC0gYGlzTnVsbGBcbiAgICAgKiAgICAtIGBpc05vdE51bGxgXG4gICAgICpcbiAgICAgKiBWYWxpZCBzdHJpbmcgY29tcGFyaXNvbnMgYXJlOlxuICAgICAqICAgIC0gYD1gXG4gICAgICogICAgLSBgaXNgXG4gICAgICogICAgLSBgaXNOdWxsYFxuICAgICAqICAgIC0gYGlzTm90TnVsbGBcbiAgICAgKiAgICAtIGBjb250YWluc2BcbiAgICAgKiAgICAtIGBkb2VzTm90Q29udGFpbmBcbiAgICAgKiAgICAtIGBzdGFydHNXaXRoYFxuICAgICAqICAgIC0gYGVuZHNXaXRoYFxuICAgICAqICAgIC0gYHJlZ2V4YFxuICAgICAqXG4gICAgICogVmFsaWQgbnVtYmVyIGNvbXBhcmlzb25zIGFyZTpcbiAgICAgKiAgICAtIGA9YFxuICAgICAqICAgIC0gYCE9YFxuICAgICAqICAgIC0gYDxgXG4gICAgICogICAgLSBgPmBcbiAgICAgKiAgICAtIGA8PWBcbiAgICAgKiAgICAtIGA+PWBcbiAgICAgKiAgICAtIGBpc2BcbiAgICAgKiAgICAtIGBpc051bGxgXG4gICAgICogICAgLSBgaXNOb3ROdWxsYFxuICAgICAqXG4gICAgICogVmFsaWQgaXB2NCBjb21wYXJpc29ucyBhcmU6XG4gICAgICogICAgLSBgaXNgXG4gICAgICogICAgLSBgaXNOdWxsYFxuICAgICAqICAgIC0gYGlzTm90TnVsbGBcbiAgICAgKiAgICAtIGBjb250YWluc2BcbiAgICAgKiAgICAtIGBkb2VzTm90Q29udGFpbmBcbiAgICAgKiAgICAtIGBzdGFydHNXaXRoYFxuICAgICAqXG4gICAgICogVmFsaWQgYmlubmluZyB2YWx1ZXMgYXJlOlxuICAgICAqICAgIC0gYGF1dG9gXG4gICAgICogICAgLSBgeWVhcmBcbiAgICAgKiAgICAtIGBtb250aGBcbiAgICAgKiAgICAtIGBkYXlgXG4gICAgICogICAgLSBgaG91cmBcbiAgICAgKiAgICAtIGBtaW51dGVgXG4gICAgICogICAgLSBgc2Vjb25kYFxuICAgICAqXG4gICAgICogVmFsaWQgc29ydCBkaXJlY3Rpb25zIGFyZTpcbiAgICAgKiAgICAtIGBBU0NFTkRJTkdgXG4gICAgICogICAgLSBgREVDRU5ESU5HYFxuICAgICAqICAgIC0gYERFRkFVTFRgXG4gICAgICpcbiAgICAgKiBWYWxpZCBzdGF0cyBmdW5jdGlvbnMgYXJlOlxuICAgICAqICAgIC0gYGxpc3RgXG4gICAgICogICAgLSBgdmFsdWVzYFxuICAgICAqICAgIC0gYGZpcnN0YFxuICAgICAqICAgIC0gYGxhc3RgXG4gICAgICogICAgLSBgY291bnRgXG4gICAgICogICAgLSBgZGNgXG4gICAgICogICAgLSBgc3VtYFxuICAgICAqICAgIC0gYGF2ZXJhZ2VgXG4gICAgICogICAgLSBgbWF4YFxuICAgICAqICAgIC0gYG1pbmBcbiAgICAgKiAgICAtIGBzdGRldmBcbiAgICAgKiAgICAtIGBkdXJhdGlvbmBcbiAgICAgKiAgICAtIGBlYXJsaWVzdGBcbiAgICAgKiAgICAtIGBsYXRlc3RgXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgKi9cbiAgICByb290LlBpdm90U3BlY2lmaWNhdGlvbiA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIF9jb21wYXJpc29uczoge1xuICAgICAgICAgICAgYm9vbGVhbjogW1wiPVwiLCBcImlzXCIsIFwiaXNOdWxsXCIsIFwiaXNOb3ROdWxsXCJdLFxuICAgICAgICAgICAgc3RyaW5nOiBbXCI9XCIsIFwiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIiwgXCJjb250YWluc1wiLCBcImRvZXNOb3RDb250YWluXCIsIFwic3RhcnRzV2l0aFwiLCBcImVuZHNXaXRoXCIsIFwicmVnZXhcIl0sXG4gICAgICAgICAgICBudW1iZXI6IFtcIj1cIiwgXCIhPVwiLCBcIjxcIiwgXCI+XCIsIFwiPD1cIiwgXCI+PVwiLCBcImlzXCIsIFwiaXNOdWxsXCIsIFwiaXNOb3ROdWxsXCJdLFxuICAgICAgICAgICAgaXB2NDogW1wiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIiwgXCJjb250YWluc1wiLCBcImRvZXNOb3RDb250YWluXCIsIFwic3RhcnRzV2l0aFwiXVxuICAgICAgICB9LFxuICAgICAgICBfYmlubmluZzogW1wiYXV0b1wiLCBcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIl0sXG4gICAgICAgIF9zb3J0RGlyZWN0aW9uOiBbXCJBU0NFTkRJTkdcIiwgXCJERVNDRU5ESU5HXCIsIFwiREVGQVVMVFwiXSxcbiAgICAgICAgX3N0YXRzRnVuY3Rpb25zOiBbXCJsaXN0XCIsIFwidmFsdWVzXCIsIFwiZmlyc3RcIiwgXCJsYXN0XCIsIFwiY291bnRcIiwgXCJkY1wiLCBcInN1bVwiLCBcImF2ZXJhZ2VcIiwgXCJtYXhcIiwgXCJtaW5cIiwgXCJzdGRldlwiLCBcImR1cmF0aW9uXCIsIFwiZWFybGllc3RcIiwgXCJsYXRlc3RcIl0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsfSBwYXJlbnREYXRhTW9kZWwgVGhlIGBEYXRhTW9kZWxgIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihkYXRhTW9kZWxPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsT2JqZWN0ID0gZGF0YU1vZGVsT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jZWxscyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmFjY2VsZXJhdGlvbk5hbWVzcGFjZSA9IGRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwuaXNBY2NlbGVyYXRlZCgpID8gXG4gICAgICAgICAgICAgICAgZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5uYW1lIDogbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5ydW4gICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5ydW4pO1xuICAgICAgICAgICAgdGhpcy5waXZvdCA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5waXZvdCk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IHRoZSBhY2NlbGVyYXRpb24gY2FjaGUgZm9yIHRoaXMgcGl2b3Qgc3BlY2lmaWNhdGlvbiB0byBhIGpvYixcbiAgICAgICAgICogdXN1YWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlTG9jYWxBY2NlbGVyYXRpb25Kb2Igb24gYSBEYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICogaW5zdGFuY2UsIGFzIHRoZSBhY2NlbGVyYXRpb24gY2FjaGUgZm9yIHRoaXMgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8c3BsdW5ranMuU2VydmljZS5Kb2J9IHNpZCBUaGUgc2lkIG9mIGFuIGFjY2VsZXJhdGlvbiBqb2IsXG4gICAgICAgICAqICAgICBvciwgYSBgc3BsdW5ranMuU2VydmljZS5Kb2JgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgc2V0QWNjZWxlcmF0aW9uSm9iOiBmdW5jdGlvbihzaWQpIHtcbiAgICAgICAgICAgIC8vIElmIGEgc2VhcmNoIG9iamVjdCBpcyBwYXNzZWQgaW4sIGdldCBpdHMgc2lkXG4gICAgICAgICAgICBpZiAoc2lkICYmIHNpZCBpbnN0YW5jZW9mIFNlcnZpY2UuSm9iKSB7XG4gICAgICAgICAgICAgICAgc2lkID0gc2lkLnNpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFzaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaWQgdG8gdXNlIGZvciBhY2NlbGVyYXRpb24gbXVzdCBub3QgYmUgbnVsbC5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uTmFtZXNwYWNlID0gXCJzaWQ9XCIgKyBzaWQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgZmlsdGVyIG9uIGEgYm9vbGVhbiB2YWx1ZWQgZmllbGQuIFRoZSBmaWx0ZXIgd2lsbCBiZSBhIGNvbnN0cmFpbnQgb2YgdGhlIGZvcm1cbiAgICAgICAgICogYGZpZWxkIGBjb21wYXJpc29uYCBjb21wYXJlVG9gLCBmb3IgZXhhbXBsZTogYGlzX3JlbW90ZSA9IGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBmaWx0ZXIgb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbXBhcmlzb25UeXBlIFRoZSB0eXBlIG9mIGNvbXBhcmlzb24sIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbXBhcmlzb25PcCBUaGUgY29tcGFyaXNvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIGNvbXBhcmlzb25zLCBiYXNlZCBvbiB0eXBlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcGFyZVRvIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBmaWVsZCB0by5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZEZpbHRlcjogZnVuY3Rpb24oZmllbGROYW1lLCBjb21wYXJpc29uVHlwZSwgY29tcGFyaXNvbk9wLCBjb21wYXJlVG8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhZGQgZmlsdGVyIG9uIGEgbm9uZXhpc3RlbnQgZmllbGQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbXBhcmlzb25UeXBlICE9PSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IGFkZCBcIiArIGNvbXBhcmlzb25UeXBlICsgIFxuICAgICAgICAgICAgICAgICAgICBcIiBmaWx0ZXIgb24gXCIgKyBmaWVsZE5hbWUgKyBcbiAgICAgICAgICAgICAgICAgICAgXCIgYmVjYXVzZSBpdCBpcyBvZiB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKS50eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnModGhpcy5fY29tcGFyaXNvbnNbY29tcGFyaXNvblR5cGVdLCBjb21wYXJpc29uT3ApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCBhZGQgXCIgKyBjb21wYXJpc29uVHlwZSArIFxuICAgICAgICAgICAgICAgICAgICBcIiBmaWx0ZXIgYmVjYXVzZSBcIiArIGNvbXBhcmlzb25PcCArXG4gICAgICAgICAgICAgICAgICAgIFwiIGlzIG5vdCBhIHZhbGlkIGNvbXBhcmlzb24gb3BlcmF0b3JcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSkubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBjb21wYXJpc29uVHlwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFRoZXNlIGZpZWxkcyBhcmUgdHlwZSBkZXBlbmRlbnRcbiAgICAgICAgICAgIGlmICh1dGlscy5jb250YWlucyhbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwiaXB2NFwiLCBcIm51bWJlclwiXSwgcmV0LnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0LnJ1bGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3I6IGNvbXBhcmlzb25PcCxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyZVRvOiBjb21wYXJlVG9cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLnB1c2gocmV0KTtcbiAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBsaW1pdCBvbiB0aGUgZXZlbnRzIHNob3duIGluIGEgcGl2b3QgYnkgc29ydGluZyB0aGVtIGFjY29yZGluZyB0byBzb21lIGZpZWxkLCB0aGVuIHRha2luZ1xuICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIG51bWJlciBmcm9tIHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvcnRBdHRyaWJ1dGUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHVzZSBmb3Igc29ydGluZy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvcnREaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBzb3J0IGV2ZW50cywgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGltaXQgVGhlIG51bWJlciBvZiB2YWx1ZXMgZnJvbSB0aGUgc29ydGVkIGxpc3QgdG8gYWxsb3cgdGhyb3VnaCB0aGlzIGZpbHRlci5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRzRnVuY3Rpb24gVGhlIHN0YXRzIGZ1bmN0aW9uIHRvIHVzZSBmb3IgYWdncmVnYXRpb24gYmVmb3JlIHNvcnRpbmcsIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZExpbWl0RmlsdGVyOiBmdW5jdGlvbihmaWVsZE5hbWUsIHNvcnRBdHRyaWJ1dGUsIHNvcnREaXJlY3Rpb24sIGxpbWl0LCBzdGF0c0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGxpbWl0IGZpbHRlciBvbiBhIG5vbmV4aXN0ZW50IGZpZWxkLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoIXV0aWxzLmNvbnRhaW5zKFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcIm9iamVjdENvdW50XCJdLCBmLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBsaW1pdCBmaWx0ZXIgb24gXCIgKyBmaWVsZE5hbWUgKyBcIiBiZWNhdXNlIGl0IGlzIG9mIHR5cGUgXCIgKyBmLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gZi50eXBlICYmICF1dGlscy5jb250YWlucyhbXCJjb3VudFwiLCBcImRjXCJdLCBzdGF0c0Z1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIGZvciBmaWVsZHMgb2YgdHlwZSBzdHJpbmcgbXVzdCBiZSBDT1VOVCBvciBESVNUSU5DVF9DT1VOVDsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT09IGYudHlwZSAmJiAhdXRpbHMuY29udGFpbnMoW1wiY291bnRcIiwgXCJkY1wiLCBcImF2ZXJhZ2VcIiwgXCJzdW1cIl0sIHN0YXRzRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gZm9yIGZpZWxkcyBvZiB0eXBlIG51bWJlciBtdXN0IGJlIG9uZSBvZiBDT1VOVCwgRElTVElOQ1RfQ09VTlQsIFNVTSwgb3IgQVZFUkFHRTsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFwib2JqZWN0Q291bnRcIiA9PT0gZi50eXBlICYmICF1dGlscy5jb250YWlucyhbXCJjb3VudFwiXSwgc3RhdHNGdW5jdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBmb3IgZmllbGRzIG9mIHR5cGUgb2JqZWN0IGNvdW50IG11c3QgYmUgQ09VTlQ7IGZvdW5kIFwiICsgc3RhdHNGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogc29ydEF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVPd25lcjogdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoc29ydEF0dHJpYnV0ZSkubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGxpbWl0QW1vdW50OiBsaW1pdCxcbiAgICAgICAgICAgICAgICBzdGF0c0ZuOiBzdGF0c0Z1bmN0aW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQXNzdW1lZCBcImhpZ2hlc3RcIiBpcyBwcmVmZXJyZWQgZm9yIHdoZW4gc29ydERpcmVjdGlvbiBpcyBcIkRFRkFVTFRcIlxuICAgICAgICAgICAgZmlsdGVyLmxpbWl0VHlwZSA9IFwiQVNDRU5ESU5HXCIgPT09IHNvcnREaXJlY3Rpb24gPyBcImxvd2VzdFwiIDogXCJoaWdoZXN0XCI7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChmaWx0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgcm93IHNwbGl0IG9uIGEgbnVtZXJpYyBvciBzdHJpbmcgdmFsdWVkIGZpZWxkLCBzcGxpdHRpbmcgb24gZWFjaCBkaXN0aW5jdCB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIHJvd3MuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRSb3dTcGxpdDogZnVuY3Rpb24oZmllbGROYW1lLCBsYWJlbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnMoW1wibnVtYmVyXCIsIFwic3RyaW5nXCJdLCBmLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgbnVtYmVyIG9yIHN0cmluZy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByb3cgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBsYWJlbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHJvdy5kaXNwbGF5ID0gXCJhbGxcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yb3dzLnB1c2gocm93KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIHJvdyBzcGxpdCBvbiBhIG51bWVyaWMgZmllbGQsIHNwbGl0dGluZyBpbnRvIG51bWVyaWMgcmFuZ2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIHNwbGl0IGdlbmVyYXRlcyBiaW5zIHdpdGggZWRnZXMgZXF1aXZhbGVudCB0byB0aGVcbiAgICAgICAgICogY2xhc3NpYyBsb29wICdmb3IgaSBpbiA8c3RhcnQ+IHRvIDxlbmQ+IGJ5IDxzdGVwPicgYnV0IHdpdGggYSBtYXhpbXVtXG4gICAgICAgICAqIG51bWJlciBvZiBiaW5zIDxsaW1pdD4uIFRoaXMgZGlzcGF0Y2hlcyB0byB0aGUgc3RhdHMgYW5kIHh5c2VyaWVzIHNlYXJjaCBjb21tYW5kcy5cbiAgICAgICAgICogU2VlIHRoZWlyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIHJvd3MuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgc3RhcnRgIChfaW50ZWdlcl8pOiBUaGUgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByYW5nZSwgb3IgbnVsbCB0byB0YWtlIHRoZSBsb3dlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgZW5kYCAoX2ludGVnZXJfKTogVGhlIHZhbHVlIGZvciB0aGUgZW5kIG9mIHRoZSBsYXN0IHJhbmdlLCBvciBudWxsIHRvIHRha2UgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgc3RlcGAgKF9pbnRlZ2VyXyk6IFRoZSB0aGUgd2lkdGggb2YgZWFjaCByYW5nZSwgb3IgbnVsbCB0byBoYXZlIFNwbHVuayBjYWxjdWxhdGUgaXQuXG4gICAgICAgICAqICAgIC0gYGxpbWl0YCAoX2ludGVnZXJfKTogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJhbmdlcyB0byBzcGxpdCBpbnRvLCBvciBudWxsIGZvciBubyBsaW1pdC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFJhbmdlUm93U3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBsYWJlbCwgcmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCBmaWVsZCBcIiArIGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIG51bWJlci5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdXBkYXRlUmFuZ2VzID0ge307XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5zdGFydCkgJiYgcmFuZ2VzLnN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLnN0YXJ0ID0gcmFuZ2VzLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuZW5kKSAmJiByYW5nZXMuZW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLmVuZCA9IHJhbmdlcy5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5zdGVwKSAmJiByYW5nZXMuc3RlcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVJhbmdlcy5zaXplID0gcmFuZ2VzLnN0ZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5saW1pdCkgJiYgcmFuZ2VzLmxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLm1heE51bWJlck9mID0gcmFuZ2VzLmxpbWl0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwicmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgcmFuZ2VzOiB1cGRhdGVSYW5nZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgcm93IHNwbGl0IG9uIGEgYm9vbGVhbiB2YWx1ZWQgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIHJvd3MuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0cnVlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIHRydWUgdmFsdWVkIHJvdyBsYWJlbC5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZhbHNlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIGZhbHNlIHZhbHVlZCByb3cgbGFiZWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRCb29sZWFuUm93U3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBsYWJlbCwgdHJ1ZURpc3BsYXlWYWx1ZSwgZmFsc2VEaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIGJvb2xlYW4uXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHRydWVMYWJlbDogdHJ1ZURpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgICAgICBmYWxzZUxhYmVsOiBmYWxzZURpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSByb3cgc3BsaXQgb24gYSB0aW1lc3RhbXAgdmFsdWVkIGZpZWxkLCBiaW5uZWQgYnkgdGhlIHNwZWNpZmllZCBidWNrZXQgc2l6ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGJpbm5pbmcgVGhlIHNpemUgb2YgYmlucyB0byB1c2UsIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFRpbWVzdGFtcFJvd1NwbGl0OiBmdW5jdGlvbihmaWVsZCwgbGFiZWwsIGJpbm5pbmcpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJ0aW1lc3RhbXBcIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgdGltZXN0YW1wLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnModGhpcy5fYmlubmluZywgYmlubmluZykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJpbm5pbmcgXCIgKyBiaW5uaW5nICsgXCIgZm91bmQuIFZhbGlkIHZhbHVlcyBhcmU6IFwiICsgdGhpcy5fYmlubmluZy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHBlcmlvZDogYmlubmluZ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAgICAgICAgICAgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIGNvbHVtbiBzcGxpdCBvbiBhIHN0cmluZyBvciBudW1iZXIgdmFsdWVkIGZpZWxkLCBwcm9kdWNpbmcgYSBjb2x1bW4gZm9yXG4gICAgICAgICAqIGVhY2ggZGlzdGluY3QgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnMoW1wibnVtYmVyXCIsIFwic3RyaW5nXCJdLCBmLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgbnVtYmVyIG9yIHN0cmluZy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjb2wgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY29sLmRpc3BsYXkgPSBcImFsbFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2wpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgbnVtZXJpYyBmaWVsZCwgc3BsaXR0aW5nIHRoZSB2YWx1ZXMgaW50byByYW5nZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvcHRpb25hbCBkaWN0aW9uYXJ5IG9mIGNvbGxlY3Rpb24gZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uIG9wdGlvbnM6XG4gICAgICAgICAqICAgIC0gYHN0YXJ0YCAoX2ludGVnZXJfKTogVGhlIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgcmFuZ2UsIG9yIG51bGwgdG8gdGFrZSB0aGUgbG93ZXN0IHZhbHVlIGluIHRoZSBldmVudHMuXG4gICAgICAgICAqICAgIC0gYGVuZGAgKF9pbnRlZ2VyXyk6IFRoZSB2YWx1ZSBmb3IgdGhlIGVuZCBvZiB0aGUgbGFzdCByYW5nZSwgb3IgbnVsbCB0byB0YWtlIHRoZSBoaWdoZXN0IHZhbHVlIGluIHRoZSBldmVudHMuXG4gICAgICAgICAqICAgIC0gYHN0ZXBgIChfaW50ZWdlcl8pOiBUaGUgdGhlIHdpZHRoIG9mIGVhY2ggcmFuZ2UsIG9yIG51bGwgdG8gaGF2ZSBTcGx1bmsgY2FsY3VsYXRlIGl0LlxuICAgICAgICAgKiAgICAtIGBsaW1pdGAgKF9pbnRlZ2VyXyk6IFRoZSBtYXhpbXVtIG51bWJlciBvZiByYW5nZXMgdG8gc3BsaXQgaW50bywgb3IgbnVsbCBmb3Igbm8gbGltaXQuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRSYW5nZUNvbHVtblNwbGl0OiBmdW5jdGlvbihmaWVsZE5hbWUsIHJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiICE9PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCBudW1iZXIuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiBTcGx1bmsgNi4wLjEuMSwgZGF0YSBtb2RlbHMgaW5jb3JyZWN0bHkgZXhwZWN0IHN0cmluZ3MgZm9yIHRoZXNlIGZpZWxkc1xuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBudW1iZXJzLiBJbiA2LjEsIHRoaXMgaXMgZml4ZWQgYW5kIGJvdGggYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgdmFyIHVwZGF0ZWRSYW5nZXMgPSB7fTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLnN0YXJ0KSAmJiByYW5nZXMuc3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLnN0YXJ0ID0gcmFuZ2VzLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuZW5kKSAmJiByYW5nZXMuZW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFJhbmdlcy5lbmQgPSByYW5nZXMuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuc3RlcCkgJiYgcmFuZ2VzLnN0ZXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLnNpemUgPSByYW5nZXMuc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLmxpbWl0KSAmJiByYW5nZXMubGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLm1heE51bWJlck9mID0gcmFuZ2VzLmxpbWl0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwicmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgcmFuZ2VzOiB1cGRhdGVkUmFuZ2VzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgYm9vbGVhbiB2YWx1ZWQgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0cnVlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIHRydWUgdmFsdWVkIGNvbHVtbiBsYWJlbC5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZhbHNlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIGZhbHNlIHZhbHVlZCBjb2x1bW4gbGFiZWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRCb29sZWFuQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSwgdHJ1ZURpc3BsYXlWYWx1ZSwgZmFsc2VEaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCBmaWVsZCBcIiArIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIGJvb2xlYW4uXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIHRydWVMYWJlbDogdHJ1ZURpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgICAgICBmYWxzZUxhYmVsOiBmYWxzZURpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIGNvbHVtbiBzcGxpdCBvbiBhIHRpbWVzdGFtcCB2YWx1ZWQgZmllbGQsIGJpbm5lZCBieSB0aGUgc3BlY2lmaWVkIGJ1Y2tldCBzaXplLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmlubmluZyBUaGUgc2l6ZSBvZiBiaW5zIHRvIHVzZSwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkVGltZXN0YW1wQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBiaW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCBmaWVsZCBcIiArIGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKFwidGltZXN0YW1wXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIHRpbWVzdGFtcC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmNvbnRhaW5zKHRoaXMuX2Jpbm5pbmcsIGJpbm5pbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiaW5uaW5nIFwiICsgYmlubmluZyArIFwiIGZvdW5kLiBWYWxpZCB2YWx1ZXMgYXJlOiBcIiArIHRoaXMuX2Jpbm5pbmcuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIHBlcmlvZDogYmlubmluZ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAgICAgICAgICAgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhbiBhZ2dyZWdhdGUgdG8gZWFjaCBjZWxsIG9mIHRoZSBwaXZvdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBhZ2dyZWdhdGUuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdHNGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gdXNlIGZvciBhZ2dyZWdhdGlvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHN0YXRzIGZ1bmN0aW9ucy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZENlbGxWYWx1ZTogZnVuY3Rpb24oZmllbGROYW1lLCBsYWJlbCwgc3RhdHNGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKHV0aWxzLmNvbnRhaW5zKFtcInN0cmluZ1wiLCBcImlwdjRcIl0sIGYudHlwZSkgJiZcbiAgICAgICAgICAgICAgICAhdXRpbHMuY29udGFpbnMoW1xuICAgICAgICAgICAgICAgICAgICBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJmaXJzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxhc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRjXCJdLCBzdGF0c0Z1bmN0aW9uKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIG9uIHN0cmluZyBhbmQgSVB2NCBmaWVsZHMgbXVzdCBiZSBvbmUgb2Y6XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBsaXN0LCBkaXN0aW5jdF92YWx1ZXMsIGZpcnN0LCBsYXN0LCBjb3VudCwgb3IgZGlzdGluY3RfY291bnQ7IGZvdW5kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHNGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChcIm51bWJlclwiID09PSBmLnR5cGUgJiYgXG4gICAgICAgICAgICAgICAgIXV0aWxzLmNvbnRhaW5zKFtcbiAgICAgICAgICAgICAgICAgICAgXCJzdW1cIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImF2ZXJhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdGRldlwiLFxuICAgICAgICAgICAgICAgICAgICBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICBdLCBzdGF0c0Z1bmN0aW9uKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIG9uIG51bWJlciBmaWVsZCBtdXN0IGJlIG11c3QgYmUgb25lIG9mOlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgc3VtLCBjb3VudCwgYXZlcmFnZSwgbWF4LCBtaW4sIHN0ZGV2LCBsaXN0LCBvciBkaXN0aW5jdF92YWx1ZXM7IGZvdW5kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHNGdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoXCJ0aW1lc3RhbXBcIiA9PT0gZi50eXBlICYmXG4gICAgICAgICAgICAgICAgIXV0aWxzLmNvbnRhaW5zKFtcbiAgICAgICAgICAgICAgICAgICAgXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImVhcmxpZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIF0sIHN0YXRzRnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gb24gdGltZXN0YW1wIGZpZWxkIG11c3QgYmUgb25lIG9mOlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgZHVyYXRpb24sIGVhcmxpZXN0LCBsYXRlc3QsIGxpc3QsIG9yIGRpc3RpbmN0IHZhbHVlczsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1dGlscy5jb250YWlucyhbXCJvYmplY3RDb3VudFwiLCBcImNoaWxkQ291bnRcIl0sIGYudHlwZSkgJiZcbiAgICAgICAgICAgICAgICBcImNvdW50XCIgIT09IHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBvbiBjaGlsZGNvdW50IGFuZCBvYmplY3Rjb3VudCBmaWVsZHMgbXVzdCBiZSBjb3VudDsgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImZvdW5kIFwiICsgc3RhdHNGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChcImJvb2xlYW5cIiA9PT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBib29sZWFuIHZhbHVlZCBmaWVsZHMgYXMgY2VsbCB2YWx1ZXMuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLmxpbmVhZ2Uuam9pbihcIi5cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICBzcGFya2xpbmU6IGZhbHNlLCAvLyBOb3QgcHJvcGVybHkgaW1wbGVtZW50ZWQgaW4gY29yZSB5ZXQuXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZWFkeSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBKU09OIHJlYWR5IG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHRvSnNvbk9iamVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFNb2RlbDogdGhpcy5kYXRhTW9kZWxPYmplY3QuZGF0YU1vZGVsLm5hbWUsXG4gICAgICAgICAgICAgICAgYmFzZUNsYXNzOiB0aGlzLmRhdGFNb2RlbE9iamVjdC5uYW1lLFxuICAgICAgICAgICAgICAgIHJvd3M6IHRoaXMucm93cyxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgY2VsbHM6IHRoaXMuY2VsbHMsXG4gICAgICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyeSBTcGx1bmsgZm9yIFNQTCBxdWVyaWVzIGNvcnJlc3BvbmRpbmcgdG8gYSBwaXZvdCByZXBvcnRcbiAgICAgICAgICogZm9yIHRoaXMgZGF0YSBtb2RlbCwgZGVmaW5lZCBieSB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UuZGF0YU1vZGVscygpLmZldGNoKGZ1bmN0aW9uKGVyciwgZGF0YU1vZGVscykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgc2VhcmNoZXMgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAgICAgKiAgICAgICAgICB2YXIgcGl2b3RTcGVjID0gc2VhcmNoZXMuY3JlYXRlUGl2b3RTcGVjaWZpY2F0aW9uKCk7XG4gICAgICAgICAqICAgICAgICAgIC8vIFVzZSBvZiB0aGUgZmx1ZW50IEFQSVxuICAgICAgICAgKiAgICAgICAgICBwaXZvdFNwZWMuYWRkUm93U3BsaXQoXCJ1c2VyXCIsIFwiRXhlY3V0aW5nIHVzZXJcIilcbiAgICAgICAgICogICAgICAgICAgICAgIC5hZGRSYW5nZUNvbHVtblNwbGl0KFwiZXhlY190aW1lXCIsIHtzdGFydDogMCwgZW5kOiAxMiwgc3RlcDogNSwgbGltaXQ6IDR9KVxuICAgICAgICAgKiAgICAgICAgICAgICAgLmFkZENlbGxWYWx1ZShcInNlYXJjaFwiLCBcIlNlYXJjaCBRdWVyeVwiLCBcInZhbHVlc1wiKVxuICAgICAgICAgKiAgICAgICAgICAgICAgLnBpdm90KGZ1bmN0aW9uKHBpdm90RXJyLCBwaXZvdCkge1xuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGl2b3Qgc2VhcmNoIGlzOlwiLCBwaXZvdC5zZWFyY2gpO1xuICAgICAgICAgKiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUgZ2V0dGluZyB0aGUgcGl2b3Q6IGAoZXJyLCBwaXZvdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwaXZvdDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBzdmMgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwuc2VydmljZTtcblxuICAgICAgICAgICAgdmFyIGFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgcGl2b3RfanNvbjogSlNPTi5zdHJpbmdpZnkodGhpcy50b0pzb25PYmplY3QoKSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQodGhpcy5hY2NlbGVyYXRpb25OYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgYXJncy5uYW1lc3BhY2UgPSB0aGlzLmFjY2VsZXJhdGlvbk5hbWVzcGFjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHN2Yy5nZXQoUGF0aHMucGl2b3QgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwubmFtZSksIGFyZ3MsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihlcnIuZGF0YS5tZXNzYWdlc1swXS50ZXh0KSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZW50cnkgJiYgcmVzcG9uc2UuZGF0YS5lbnRyeVswXSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBuZXcgcm9vdC5QaXZvdChzdmMsIHJlc3BvbnNlLmRhdGEuZW50cnlbMF0uY29udGVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiRGlkbid0IGdldCBhIFBpdm90IHJlcG9ydCBiYWNrIGZyb20gU3BsdW5rXCIpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB3cmFwIHVwIHRoZSBgUGl2b3RTcGVjaWZpY2F0aW9uLnBpdm90KClgIGFuZFxuICAgICAgICAgKiBgUGl2b3QucnVuKClgIGZ1bmN0aW9uIGNhbGxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBRdWVyeSBTcGx1bmsgZm9yIFNQTCBxdWVyaWVzIGNvcnJlc3BvbmRpbmcgdG8gYSBwaXZvdCByZXBvcnRcbiAgICAgICAgICogZm9yIHRoaXMgZGF0YSBtb2RlbCwgZGVmaW5lZCBieSB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gOyB0aGVuLFxuICAgICAgICAgKiBzdGFydHMgYSBzZWFyY2ggam9iIHJ1bm5pbmcgdGhpcyBwaXZvdCwgYWNjZWxlcmF0ZWQgaWYgcG9zc2libGUuXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZmV0Y2hFcnIsIGRhdGFNb2RlbHMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIHNlYXJjaGVzID0gZGF0YU1vZGVscy5pdGVtKFwiaW50ZXJuYWxfYXVkaXRfbG9nc1wiKS5vYmplY3RCeU5hbWUoXCJzZWFyY2hlc1wiKTtcbiAgICAgICAgICogICAgICAgICAgdmFyIHBpdm90U3BlYyA9IHNlYXJjaGVzLmNyZWF0ZVBpdm90U3BlY2lmaWNhdGlvbigpO1xuICAgICAgICAgKiAgICAgICAgICAvLyBVc2Ugb2YgdGhlIGZsdWVudCBBUElcbiAgICAgICAgICogICAgICAgICAgcGl2b3RTcGVjLmFkZFJvd1NwbGl0KFwidXNlclwiLCBcIkV4ZWN1dGluZyB1c2VyXCIpXG4gICAgICAgICAqICAgICAgICAgICAgICAuYWRkUmFuZ2VDb2x1bW5TcGxpdChcImV4ZWNfdGltZVwiLCB7c3RhcnQ6IDAsIGVuZDogMTIsIHN0ZXA6IDUsIGxpbWl0OiA0fSlcbiAgICAgICAgICogICAgICAgICAgICAgIC5hZGRDZWxsVmFsdWUoXCJzZWFyY2hcIiwgXCJTZWFyY2ggUXVlcnlcIiwgXCJ2YWx1ZXNcIilcbiAgICAgICAgICogICAgICAgICAgICAgIC5ydW4oZnVuY3Rpb24oZXJyLCBqb2IsIHBpdm90KSB7XG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKb2IgU0lEIGlzOlwiLCBqb2Iuc2lkKTtcbiAgICAgICAgICogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlBpdm90IHNlYXJjaCBpczpcIiwgcGl2b3Quc2VhcmNoKTtcbiAgICAgICAgICogICAgICAgICAgICAgIH0pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJncyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IgKG9wdGlvbmFsKS4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqICAgICAgICAqKk5vdGU6KiogVGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBgZXhlY19tb2RlPW9uZXNob3RgIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcHJvcGVydGllcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBkb25lIGdldHRpbmcgdGhlIHBpdm90OiBgKGVyciwgam9iLCBwaXZvdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBydW46IGZ1bmN0aW9uKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhcmdzO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuXG4gICAgICAgICAgICB0aGlzLnBpdm90KGZ1bmN0aW9uKGVyciwgcGl2b3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwaXZvdC5ydW4oYXJncywgQXN5bmMuYXVnbWVudChjYWxsYmFjaywgcGl2b3QpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBvbmUgb2YgdGhlIHN0cnVjdHVyZWQgdmlld3MgaW4gYSBgRGF0YU1vZGVsYC5cbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGRhdGFNb2RlbGAgKF9zcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbF8pOiBUaGUgYERhdGFNb2RlbGAgdG8gd2hpY2ggdGhpcyBgRGF0YU1vZGVsT2JqZWN0YCBiZWxvbmdzLlxuICAgICAqICAgIC0gYG5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoaXMgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICogICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IFRoZSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoaXMgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICogICAgLSBgcGFyZW50TmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBgRGF0YU1vZGVsT2JqZWN0YCB0byB0aGlzIG9uZS5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIHN0cmluZ3Mgb2YgdGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWxcbiAgICAgKiAgICAgICAgICBvbiB3aGljaCB0aGlzIGZpZWxkIGlzIGRlZmluZWQuXG4gICAgICogICAgLSBgZmllbGRzYCAoX29iamVjdF8pOiBBIGRpY3Rpb25hcnkgb2YgYERhdGFNb2RlbEZpZWxkYCBvYmplY3RzLCBhY2Nlc3NpYmxlIGJ5IG5hbWUuXG4gICAgICogICAgLSBgY29uc3RyYWludHNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgYERhdGFNb2RlbENvbnN0cmFpbnRgIG9iamVjdHMuXG4gICAgICogICAgLSBgY2FsY3VsYXRpb25zYCAoX29iamVjdF8pOiBBIGRpY3Rpb25hcnkgb2YgYERhdGFNb2RlbENhbGN1bGF0aW9uYCBvYmplY3RzLCBhY2Nlc3NpYmxlIGJ5IElELlxuICAgICAqXG4gICAgICogQmFzZVNlYXJjaCBoYXMgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eTpcbiAgICAgKiAgICAtIGBiYXNlU2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHdyYXBwZWQgYnkgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEJhc2VUcmFuc2FjdGlvbiBoYXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGdyb3VwQnlGaWVsZHNgIChfc3RyaW5nXyk6IFRoZSBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ3JvdXAgZXZlbnRzIGludG8gdHJhbnNhY3Rpb25zLlxuICAgICAqICAgIC0gYG9iamVjdHNUb0dyb3VwYCAoX2FycmF5Xyk6IE5hbWVzIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgdW5pb25lZFxuICAgICAqICAgICAgICBhbmQgc3BsaXQgaW50byB0cmFuc2FjdGlvbnMuXG4gICAgICogICAgLSBgbWF4U3BhbmAgKF9zdHJpbmdfKTogVGhlIG1heGltdW0gdGltZSBzcGFuIG9mIGEgdHJhbnNhY3Rpb24uXG4gICAgICogICAgLSBgbWF4UGF1c2VgIChfc3RyaW5nXyk6IFRoZSBtYXhpbXVtIHBhdXNlIHRpbWUgb2YgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsT2JqZWN0ID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byBzZXQ6XG4gICAgICAgICAqICAgICAtIGBvYmplY3ROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBmb3IgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICogICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqICAgICAtIGBwYXJlbnROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCB0aGF0IG93bnMgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICogICAgIC0gYGxpbmVhZ2VgIChfc3RyaW5nXyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LFxuICAgICAgICAgKiAgICAgICAgICBpdGVtcyBhcmUgZGVsaW1pdGVkIGJ5IGEgZG90LiBUaGlzIGlzIGNvbnZlcnRlZCBpbnRvIGFuIGFycmF5IG9mXG4gICAgICAgICAqICAgICAgICAgIHN0cmluZ3MgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAqICAgICAtIGBmaWVsZHNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBmaWVsZHMuXG4gICAgICAgICAqICAgICAtIGBjb25zdHJhaW50c2AgKF9hcnJheV8pOiBBbiBhcnJheSBvZiBkYXRhIG1vZGVsIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiAgICAgLSBgY2FsY3VsYXRpb25zYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIGRhdGEgbW9kZWwgY2FsY3VsYXRpb25zLlxuICAgICAgICAgKiAgICAgLSBgYmFzZVNlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBxdWVyeSB3cmFwcGVkIGJ5IHRoaXMgZGF0YSBtb2RlbCBvYmplY3Q7IGV4Y2x1c2l2ZSB0byBCYXNlU2VhcmNoIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYGdyb3VwQnlGaWVsZHNgIChfYXJyYXlfKTogVGhlIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBncm91cCBldmVudHMgaW50byB0cmFuc2FjdGlvbnM7IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgb2JqZWN0c1RvR3JvdXBgIChfYXJyYXlfKTogTmFtZXMgb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSB1bmlvbmVkXG4gICAgICAgICAqICAgICAgICAgYW5kIHNwbGl0IGludG8gdHJhbnNhY3Rpb25zOyBleGNsdXNpdmUgdG8gQmFzZVRyYW5zYWN0aW9uIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYG1heFNwYW5gIChfc3RyaW5nXyk6IFRoZSBtYXhpbXVtIHRpbWUgc3BhbiBvZiBhIHRyYW5zYWN0aW9uOyBleGNsdXNpdmUgdG8gQmFzZVRyYW5zYWN0aW9uIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYG1heFBhdXNlYCAoX3N0cmluZ18pOiBUaGUgbWF4aW11bSBwYXVzZSB0aW1lIG9mIGEgdHJhbnNhY3Rpb247IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsfSBwYXJlbnREYXRhTW9kZWwgVGhlIGBEYXRhTW9kZWxgIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcywgcGFyZW50RGF0YU1vZGVsKSB7XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgICAgICAgICAgcHJvcHMub3duZXIgPSBwcm9wcy5vd25lciB8fCBcIlwiO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbCAgICAgICAgICAgICAgPSBwYXJlbnREYXRhTW9kZWw7XG4gICAgICAgICAgICB0aGlzLm5hbWUgICAgICAgICAgICAgICAgICAgPSBwcm9wcy5vYmplY3ROYW1lO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSAgICAgICAgICAgID0gcHJvcHMuZGlzcGxheU5hbWU7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5hbWUgICAgICAgICAgICAgPSBwcm9wcy5wYXJlbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5saW5lYWdlICAgICAgICAgICAgICAgID0gcHJvcHMubGluZWFnZS5zcGxpdChcIi5cIik7XG5cbiAgICAgICAgICAgIC8vIFByb3BlcnRpZXMgZXhjbHVzaXZlIHRvIEJhc2VUcmFuc2FjdGlvblxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwiZ3JvdXBCeUZpZWxkc1wiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBCeUZpZWxkcyA9IHByb3BzLmdyb3VwQnlGaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJvYmplY3RzVG9Hcm91cFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0c1RvR3JvdXAgPSBwcm9wcy5vYmplY3RzVG9Hcm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShcInRyYW5zYWN0aW9uTWF4VGltZVNwYW5cIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1heFNwYW4gPSBwcm9wcy50cmFuc2FjdGlvbk1heFRpbWVTcGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwidHJhbnNhY3Rpb25NYXhQYXVzZVwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UGF1c2UgPSBwcm9wcy50cmFuc2FjdGlvbk1heFBhdXNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm9wZXJ0eSBleGNsdXNpdmUgdG8gQmFzZVNlYXJjaFxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwiYmFzZVNlYXJjaFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVNlYXJjaCA9IHByb3BzLmJhc2VTZWFyY2g7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGZpZWxkc1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZHNbcHJvcHMuZmllbGRzW2ldLmZpZWxkTmFtZV0gPSBuZXcgcm9vdC5EYXRhTW9kZWxGaWVsZChwcm9wcy5maWVsZHNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQYXJzZSBjb25zdHJhaW50c1xuICAgICAgICAgICAgdGhpcy5jb25zdHJhaW50cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5jb25zdHJhaW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uc3RyYWludHMucHVzaChuZXcgcm9vdC5EYXRhTW9kZWxDb25zdHJhaW50KHByb3BzLmNvbnN0cmFpbnRzW2pdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGNhbGN1bGF0aW9uc1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcHJvcHMuY2FsY3VsYXRpb25zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGlvbnNbcHJvcHMuY2FsY3VsYXRpb25zW2tdLmNhbGN1bGF0aW9uSURdID0gbmV3IHJvb3QuRGF0YU1vZGVsQ2FsY3VsYXRpb24ocHJvcHMuY2FsY3VsYXRpb25zW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCBhIEJhc2VTZWFyY2g/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCBpcyB0aGUgcm9vdCB0eXBlLCBCYXNlU2VhcmNoLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpc0Jhc2VTZWFyY2g6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICF1dGlscy5pc1VuZGVmaW5lZCh0aGlzLmJhc2VTZWFyY2gpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGlzIGEgQmFzZVRyYW5zYWN0aW9uP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QgaXMgdGhlIHJvb3QgdHlwZSwgQmFzZVRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpc0Jhc2VUcmFuc2FjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHRoaXMubWF4U3Bhbik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBmaWVsZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIGZpZWxkIG5hbWVzIG9mIHRoaXMgXG4gICAgICAgICAqIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBmaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBkYXRhIG1vZGVsIGZpZWxkIGluc3RhbmNlLCByZXByZXNlbnRpbmcgYSBmaWVsZCBvbiB0aGlzXG4gICAgICAgICAqIGRhdGEgbW9kZWwgb2JqZWN0LiBcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZHxudWxsfSBUaGUgZGF0YSBtb2RlbCBmaWVsZFxuICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG51bGwgaWYgaXQgdGhlIFxuICAgICAgICAgKiBmaWVsZCBieSB0aGF0IG5hbWUgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgZmllbGRCeU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRGaWVsZHMoKVtuYW1lXSB8fCB0aGlzLmZpZWxkc1tuYW1lXSB8fCBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBmaWVsZHMgZnJvbSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLCBhbmQgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGZpZWxkcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGBzcGx1bmsuU2VydmljZS5EYXRhTW9kZWxGaWVsZGAgb2JqZWN0c1xuICAgICAgICAgKiB3aGljaCBpbmNsdWRlcyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3MgZmllbGRzLCBhbmQgdGhlIGZpZWxkcyBmcm9tXG4gICAgICAgICAqIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGFsbEZpZWxkczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBtZXJnZSBmaWVsZHMgYW5kIGNhbGN1bGF0ZWRGaWVsZHMoKVxuICAgICAgICAgICAgdmFyIGNvbWJpbmVkRmllbGRzID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGYgaW4gdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMuaGFzT3duUHJvcGVydHkoZikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRGaWVsZHNbZl0gPSB0aGlzLmZpZWxkc1tmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjYWxjdWxhdGVkRmllbGRzID0gdGhpcy5jYWxjdWxhdGVkRmllbGRzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBjZiBpbiBjYWxjdWxhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRGaWVsZHMuaGFzT3duUHJvcGVydHkoY2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkRmllbGRzW2NmXSA9IGNhbGN1bGF0ZWRGaWVsZHNbY2ZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVkRmllbGRzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLCBhbmQgdGhlIG5hbWVzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBmaWVsZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIGZpZWxkIG5hbWVzIG9mIHRoaXMgXG4gICAgICAgICAqIGRhdGEgbW9kZWwgb2JqZWN0J3MgY2FsY3VsYXRpb25zLCBhbmQgdGhlIG5hbWVzIG9mIGZpZWxkcyBvbiBcbiAgICAgICAgICogdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgYWxsRmllbGROYW1lczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hbGxGaWVsZHMoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBmaWVsZHMgZnJvbSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgYHNwbHVuay5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkYCBvYmplY3RzXG4gICAgICAgICAqIG9mIHRoZSBmaWVsZHMgZnJvbSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3MgY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBjYWxjdWxhdGVkRmllbGRzOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIGZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjYWxjdWxhdGlvbnMsIGdldCB0aGVpciBmaWVsZHNcbiAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5jYWxjdWxhdGlvbklEcygpO1xuICAgICAgICAgICAgdmFyIGNhbGN1bGF0aW9ucyA9IHRoaXMuY2FsY3VsYXRpb25zO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGN1bGF0aW9uID0gY2FsY3VsYXRpb25zW2tleXNbaV1dO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGYgPSAwOyBmIDwgY2FsY3VsYXRpb24ub3V0cHV0RmllbGROYW1lcygpLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tjYWxjdWxhdGlvbi5vdXRwdXRGaWVsZE5hbWVzKClbZl1dID0gY2FsY3VsYXRpb24ub3V0cHV0RmllbGRzW2NhbGN1bGF0aW9uLm91dHB1dEZpZWxkTmFtZXMoKVtmXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzXG4gICAgICAgICAqIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNhbGN1bGF0ZWRGaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhbGN1bGF0ZWRGaWVsZHMoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGNvbnRhaW5zIHRoZSBmaWVsZCB3aXRoIHRoZVxuICAgICAgICAgKiBuYW1lIHBhc3NlZCBpbiB0aGUgYGZpZWxkTmFtZWAgcGFyYW1ldGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBsb29rIGZvci5cbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY29udGFpbnMgdGhlIGZpZWxkIGJ5IG5hbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGhhc0ZpZWxkOiBmdW5jdGlvbihmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5jb250YWlucyh0aGlzLmFsbEZpZWxkTmFtZXMoKSwgZmllbGROYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB0aGUgSURzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIElEcyBvZiB0aGlzIGRhdGEgbW9kZWxcbiAgICAgICAgICogb2JqZWN0J3MgY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBjYWxjdWxhdGlvbklEczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jYWxjdWxhdGlvbnMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2NhbCBhY2NlbGVyYXRpb24gaXMgdHNpZHggYWNjZWxlcmF0aW9uIG9mIGEgZGF0YSBtb2RlbCBvYmplY3QgdGhhdCBpcyBoYW5kbGVkXG4gICAgICAgICAqIG1hbnVhbGx5IGJ5IGEgdXNlci4gWW91IGNyZWF0ZSBhIGpvYiB3aGljaCBnZW5lcmF0ZXMgYW4gaW5kZXgsIGFuZCB0aGVuIHVzZSB0aGF0XG4gICAgICAgICAqIGluZGV4IGluIHlvdXIgcGl2b3RzIG9uIHRoZSBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG5hbWVzcGFjZSBjcmVhdGVkIGJ5IHRoZSBqb2IgaXMgJ3NpZD17c2lkfScgd2hlcmUge3NpZH0gaXMgdGhlIGpvYidzIHNpZC4gWW91XG4gICAgICAgICAqIHdvdWxkIHVzZSBpdCBpbiBhbm90aGVyIGpvYiBieSBzdGFydGluZyB5b3VyIHNlYXJjaCBxdWVyeSB3aXRoIGB8IHRzdGF0cyAuLi4gZnJvbSBzaWQ9e3NpZH0gfCAuLi5gXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSB0c2lkeCBpbmRleCBjcmVhdGVkIGJ5IHRoaXMgam9iIGlzIGRlbGV0ZWQgd2hlbiB0aGUgam9iIGlzIGdhcmJhZ2UgY29sbGVjdGVkIGJ5IFNwbHVuay5cbiAgICAgICAgICpcbiAgICAgICAgICogSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBtYW5hZ2UgdGhpcyBqb2IsIGluY2x1ZGluZyBjYW5jZWxsaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UuZGF0YU1vZGVscygpLmZldGNoKGZ1bmN0aW9uKGVyciwgZGF0YU1vZGVscykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgb2JqZWN0ID0gZGF0YU1vZGVscy5pdGVtKFwic29tZV9kYXRhX21vZGVsXCIpLm9iamVjdEJ5TmFtZShcInNvbWVfb2JqZWN0XCIpO1xuICAgICAgICAgKiAgICAgICAgICBvYmplY3QuY3JlYXRlTG9jYWxBY2NlbGVyYXRpb25Kb2IoXCItMWRcIiwgZnVuY3Rpb24oZXJyLCBhY2NlbGVyYXRpb25Kb2IpIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIGpvYiBoYXMgbmFtZTpcIiwgYWNjZWxlcmF0aW9uSm9iLm5hbWUpO1xuICAgICAgICAgKiAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGVhcmxpZXN0VGltZSBBIHRpbWUgbW9kaWZpZXIgKGUuZy4sIFwiLTJ3XCIpIHNldHRpbmcgdGhlIGVhcmxpZXN0IHRpbWUgdG8gaW5kZXguXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgYWNjZWxlcmF0aW9uSm9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZUxvY2FsQWNjZWxlcmF0aW9uSm9iOiBmdW5jdGlvbihlYXJsaWVzdFRpbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBlYXJsaWVzdFRpbWUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gc2V0IGNhbGxiYWNrIHRvIGl0cyB2YWx1ZVxuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKGVhcmxpZXN0VGltZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVhcmxpZXN0VGltZTtcbiAgICAgICAgICAgICAgICBlYXJsaWVzdFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBxdWVyeSA9IFwifCBkYXRhbW9kZWwgXFxcIlwiICsgdGhpcy5kYXRhTW9kZWwubmFtZSArIFwiXFxcIiBcIiArIHRoaXMubmFtZSArIFwiIHNlYXJjaCB8IHRzY29sbGVjdFwiO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBlYXJsaWVzdFRpbWUgPyB7ZWFybGllc3RfdGltZTogZWFybGllc3RUaW1lfSA6IHt9O1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5zZXJ2aWNlLnNlYXJjaChxdWVyeSwgYXJncywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydCBhIHNlYXJjaCBqb2IgdGhhdCBhcHBsaWVzIHF1ZXJ5U3VmZml4IHRvIGFsbCB0aGUgZXZlbnRzIGluIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBvYmplY3QgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAgICAgKiAgICAgICAgICBvYmplY3Quc3RhcnRTZWFyY2goe30sIFwifCBoZWFkIDVcIiwgZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIGpvYiBoYXMgbmFtZTpcIiwgam9iLm5hbWUpO1xuICAgICAgICAgKiAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiAgICAgICAgKipOb3RlOioqIFRoaXMgbWV0aG9kIHRocm93cyBhbiBlcnJvciBpZiB0aGUgYGV4ZWNfbW9kZT1vbmVzaG90YCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIHdpdGggdGhlIHByb3BlcnRpZXMgZGljdGlvbmFyeS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5U3VmZml4IEEgc2VhcmNoIHF1ZXJ5LCBzdGFydGluZyB3aXRoIGEgJ3wnIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCB0byBmZXRjaCB0aGUgY29udGVudHMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCAoZS5nLiwgXCJ8IGhlYWQgM1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgc3RhcnRTZWFyY2g6IGZ1bmN0aW9uKHBhcmFtcywgcXVlcnlTdWZmaXgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnkgPSBcInwgZGF0YW1vZGVsIFwiICsgdGhpcy5kYXRhTW9kZWwubmFtZSArIFwiIFwiICsgdGhpcy5uYW1lICsgXCIgc2VhcmNoXCI7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGEgc3BhY2UgdG8gdGhlIHF1ZXJ5U3VmZml4LCBvciBzZXQgaXQgdG8gYW4gZW1wdHkgc3RyaW5nIGlmIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBxdWVyeVN1ZmZpeCA9IChxdWVyeVN1ZmZpeCkgPyAoXCIgXCIgKyBxdWVyeVN1ZmZpeCkgOiAoXCJcIik7XG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5zZXJ2aWNlLnNlYXJjaChxdWVyeSArIHF1ZXJ5U3VmZml4LCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIG1vZGVsIG9iamVjdCB0aGlzIG9uZSBpbmhlcml0cyBmcm9tIGlmIGl0IGlzIGEgdXNlciBkZWZpbmVkLFxuICAgICAgICAgKiBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0fG51bGx9IFRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBwYXJlbnRcbiAgICAgICAgICogICAgIG9yIG51bGwgaWYgdGhpcyBpcyBub3QgYSB1c2VyIGRlZmluZWQgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIHBhcmVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhTW9kZWwub2JqZWN0QnlOYW1lKHRoaXMucGFyZW50TmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIG5ldyBQaXZvdCBTcGVjaWZpY2F0aW9uLCBhY2NlcHRzIG5vIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBBIG5ldyBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQaXZvdFNwZWNpZmljYXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gUGFzcyBpbiB0aGlzIERhdGFNb2RlbE9iamVjdCB0byBjcmVhdGUgYSBQaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5QaXZvdFNwZWNpZmljYXRpb24odGhpcyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZGF0YSBtb2RlbCBvbiB0aGUgc2VydmVyLiBEYXRhIG1vZGVsc1xuICAgICAqIGNvbnRhaW4gYERhdGFNb2RlbE9iamVjdGAgaW5zdGFuY2VzLCB3aGljaCBzcGVjaWZ5IHN0cnVjdHVyZWRcbiAgICAgKiB2aWV3cyBvbiBTcGx1bmsgZGF0YS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhbW9kZWwvbW9kZWwve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbCA9IFNlcnZpY2UuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5kYXRhTW9kZWxzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IGRhdGEgbW9kZWwuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgKE9wdGlvbmFsKSBuYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIG9mIHRoaXMgZGF0YSBtb2RlbDpcbiAgICAgICAgICogICAgLSBgYWNjZWxlcmF0aW9uYCAoX3N0cmluZ18pOiBBIEpTT04gb2JqZWN0IHdpdGggYW4gYGVuYWJsZWRgIGtleSwgcmVwcmVzZW50aW5nIGlmIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkIG9yIG5vdC5cbiAgICAgICAgICogICAgLSBgY29uY2lzZWAgKF9zdHJpbmdfKTogSW5kaWNhdGVzIHdoZXRoZXIgdG8gbGlzdCBhIGNvbmNpc2UgSlNPTiBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBtb2RlbCwgc2hvdWxkIGFsd2F5cyBiZSBcIjBcIi5cbiAgICAgICAgICogICAgLSBgZGVzY3JpcHRpb25gIChfc3RyaW5nXyk6IFRoZSBKU09OIGRlc2NyaWJpbmcgdGhlIGRhdGEgbW9kZWwuXG4gICAgICAgICAqICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBkaXNwbGF5ZWQgZm9yIHRoZSBkYXRhIG1vZGVsIGluIFNwbHVuayBXZWIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSwgcHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vdCBnaXZlbiBhIDR0aCBhcmcsIGFzc3VtZSB0aGUgbmFtZXNwYWNlIHdhcyBvbWl0dGVkXG4gICAgICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24gPSBKU09OLnBhcnNlKHByb3BzLmNvbnRlbnQuYWNjZWxlcmF0aW9uKSB8fCB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VsZXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShcImVuYWJsZWRcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBlbmFibGVkIHByb3BlcnR5IHRvIGEgYm9vbGVhblxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uLmVuYWJsZWQgPSAhIXRoaXMuYWNjZWxlcmF0aW9uLmVuYWJsZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbmNpc2U9MCAoZmFsc2UpIGZvcmNlcyB0aGUgc2VydmVyIHRvIHJldHVybiBhbGwgZGV0YWlscyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBkYXRhIG1vZGVsLlxuICAgICAgICAgICAgLy8gd2UgZG8gbm90IHdhbnQgYSBzdW1tYXJ5IG9mIHRoaXMgZGF0YSBtb2RlbFxuICAgICAgICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShcImNvbmNpc2VcIikgfHwgdXRpbHMuaXNVbmRlZmluZWQocHJvcHMuY29uY2lzZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNpc2UgPSBcIjBcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRhdGFNb2RlbERlZmluaXRpb24gPSBKU09OLnBhcnNlKHByb3BzLmNvbnRlbnQuZGVzY3JpcHRpb24pO1xuXG4gICAgICAgICAgICB0aGlzLm9iamVjdE5hbWVzID0gZGF0YU1vZGVsRGVmaW5pdGlvbi5vYmplY3ROYW1lTGlzdDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkYXRhTW9kZWxEZWZpbml0aW9uLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGFNb2RlbERlZmluaXRpb24uZGVzY3JpcHRpb247XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBvYmplY3RzIGZvciB0aGlzIGRhdGEgbW9kZWwgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG9ianMgPSBkYXRhTW9kZWxEZWZpbml0aW9uLm9iamVjdHM7XG4gICAgICAgICAgICB0aGlzLm9iamVjdHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG5ldyByb290LkRhdGFNb2RlbE9iamVjdChvYmpzW2ldLCB0aGlzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnJlbW92ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIGlzQWNjZWxlcmF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5hY2NlbGVyYXRpb24uZW5hYmxlZDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGRhdGEgbW9kZWwgb2JqZWN0IGZyb20gdGhpcyBkYXRhIG1vZGVsXG4gICAgICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdHxudWxsfSBhIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICAgICAqL1xuICAgICAgICBvYmplY3RCeU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBib29sZWFuIG9mIHdoZXRoZXIgdGhpcyBleGlzdHMgaW4gdGhpcyBkYXRhIG1vZGVsIG9yIG5vdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBoYXMgb2JqZWN0IHdpdGggc3BlY2lmaWVkIG5hbWUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgaGFzT2JqZWN0OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMuY29udGFpbnModGhpcy5vYmplY3ROYW1lcywgbmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGRhdGEgbW9kZWwgb24gdGhlIHNlcnZlciwgdXNlZCB0byB1cGRhdGUgYWNjZWxlcmF0aW9uIHNldHRpbmdzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gdXBkYXRlIHRoZSBvYmplY3Qgd2l0aDpcbiAgICAgICAgICogICAgIC0gYGFjY2VsZXJhdGlvbmAgKF9vYmplY3RfKTogVGhlIGFjY2VsZXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIGRhdGEgbW9kZWwuXG4gICAgICAgICAqICAgICAgICAgVmFsaWQga2V5cyBhcmU6IGBlbmFibGVkYCwgYGVhcmxpZXN0VGltZWAsIGBjcm9uU2NoZWR1bGVgLlxuICAgICAgICAgKiAgICAgICAgIEFueSBrZXlzIG5vdCBzZXQgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgYWNjZWxlcmF0aW9uIHNldHRpbmdzIGFscmVhZHlcbiAgICAgICAgICogICAgICAgICBzZXQgb24gdGhpcyBkYXRhIG1vZGVsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZGF0YSBtb2RlbCBpcyB1cGRhdGVkOiBgKGVyciwgZGF0YU1vZGVsKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvcHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9wcztcbiAgICAgICAgICAgICAgICBwcm9wcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiTXVzdCBzcGVjaWZ5IGEgcHJvcHMgYXJndW1lbnQgdG8gdXBkYXRlIGEgZGF0YSBtb2RlbC5cIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRXhpdCBpZiBwcm9wcyBpc24ndCBzZXQsIHRvIGF2b2lkIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHR3aWNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwibmFtZVwiKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgJ25hbWUnIGZpZWxkIGluICd1cGRhdGUnXCIpLCB0aGlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEV4aXQgaWYgdGhlIG5hbWUgaXMgc2V0LCB0byBhdm9pZCBjYWxsaW5nIHRoZSBjYWxsYmFjayB0d2ljZS5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHVwZGF0ZWRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb246IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogcHJvcHMuYWNjY2VsZXJhdGlvbiAmJiBwcm9wcy5hY2NlbGVyYXRpb24uZW5hYmxlZCB8fCB0aGlzLmFjY2VsZXJhdGlvbi5lbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBlYXJsaWVzdF90aW1lOiBwcm9wcy5hY2NjZWxlcmF0aW9uICYmIHByb3BzLmFjY2VsZXJhdGlvbi5lYXJsaWVzdFRpbWUgfHwgdGhpcy5hY2NlbGVyYXRpb24uZWFybGllc3RUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjcm9uX3NjaGVkdWxlOiBwcm9wcy5hY2NjZWxlcmF0aW9uICYmIHByb3BzLmFjY2VsZXJhdGlvbi5jcm9uU2NoZWR1bGUgfHwgdGhpcy5hY2NlbGVyYXRpb24uY3JvblNjaGVkdWxlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3QoXCJcIiwgdXBkYXRlZFByb3BzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFNb2RlbE5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHJlc3BvbnNlLmRhdGEuZW50cnlbMF0pO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBuZXcgcm9vdC5EYXRhTW9kZWwodGhhdC5zZXJ2aWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdLm5hbWUsIGRhdGFNb2RlbE5hbWVzcGFjZSwgcmVzcG9uc2UuZGF0YS5lbnRyeVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZGF0YSBtb2RlbHMuIFlvdSBjYW4gY3JlYXRlIGFuZFxuICAgICAqIGxpc3QgZGF0YSBtb2RlbHMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3JcbiAgICAgKiBnZXQgYSBzcGVjaWZpYyBkYXRhIG1vZGVsLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGFtb2RlbC9tb2RlbFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbHMgPSBTZXJ2aWNlLkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5kYXRhTW9kZWxzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc2AuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIChPcHRpb25hbCkgbmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gbmFtZXNwYWNlIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5jcmVhdGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGBEYXRhTW9kZWxgIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBJdCBpcyBwcmVmZXJyZWQgdGhhdCB5b3UgY3JlYXRlIGRhdGEgbW9kZWxzIHRocm91Z2ggdGhlIFNwbHVua1xuICAgICAgICAgKiBFbnRlcnByaXNlIHdpdGggYSBicm93c2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCB0byBjcmVhdGUuIElmIGl0IGNvbnRhaW5zIHNwYWNlcyB0aGV5IHdpbGwgYmUgcmVwbGFjZWRcbiAgICAgICAgICogICAgIHdpdGggdW5kZXJzY29yZXMuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBuZXcgYERhdGFNb2RlbGAgb2JqZWN0OiBgKGVyciwgY3JlYXRlZERhdGFNb2RlbClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBnZXQgKG5hbWUsIGNhbGxiYWNrKSBpbnN0ZWFkIG9mIChuYW1lLCBwYXJhbXMsIGNhbGxiYWNrKVxuICAgICAgICAgICAgLy8gZG8gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZSBzd2FwXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xuXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0KFwiXCIsIHtuYW1lOiBuYW1lLCBkZXNjcmlwdGlvbjogSlNPTi5zdHJpbmdpZnkocGFyYW1zKX0sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YU1vZGVsID0gbmV3IHJvb3QuRGF0YU1vZGVsKHRoYXQuc2VydmljZSwgcmVzcG9uc2UuZGF0YS5lbnRyeVswXS5uYW1lLCB0aGF0Lm5hbWVzcGFjZSwgcmVzcG9uc2UuZGF0YS5lbnRyeVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGFNb2RlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHVzZWQgdG8gY3JlYXRlIGEgXG4gICAgICAgICAqIGBEYXRhTW9kZWxgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbH0gQSBuZXcgYERhdGFNb2RlbGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRGF0YU1vZGVsKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qISovXG4gICAgLy8gSXRlcmF0ZXMgb3ZlciBhbiBlbmRwb2ludCdzIHJlc3VsdHMuXG4gICAgcm9vdC5QYWdpbmF0ZWRFbmRwb2ludEl0ZXJhdG9yID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oZW5kcG9pbnQsIHBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9lbmRwb2ludCA9IGVuZHBvaW50O1xuICAgICAgICAgICAgdGhpcy5fcGFnZXNpemUgPSBwYXJhbXMucGFnZXNpemUgfHwgMDtcbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IDA7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvLyBGZXRjaGVzIHRoZSBuZXh0IHBhZ2UgZnJvbSB0aGUgZW5kcG9pbnQuXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgY291bnQ6IHRoaXMuX3BhZ2VzaXplLFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5fb2Zmc2V0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZHBvaW50KHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtUmVzdWx0cyA9IChyZXN1bHRzLnJvd3MgPyByZXN1bHRzLnJvd3MubGVuZ3RoIDogMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29mZnNldCArPSBudW1SZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cywgbnVtUmVzdWx0cyA+IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpOyJdfQ== \ No newline at end of file diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index b88cded10..cf10ea935 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -139,6 +139,68 @@ exports.setup = function (svc) { }); }); + it("Callback#create_v2", function (done) { + var that = this; + var namespace = { owner: "nobody", app: "system" }; + var filename = "jssdk_file_new_" + getNextId(); + var stanza = "jssdk_stanza" + var property1 = "foo1" + var value1 = "bar1"; + var property2 = "foo2" + var value2 = "bar2"; + + Async.chain([ + function (done) { + var configs = svc.configurations(namespace); + configs.fetch(done); + }, + async function (configs, done) { + var keyValueMap = {} + keyValueMap[property1] = value1; + keyValueMap[property2] = value2; + + configs.create_v2(configs, svc, filename, stanza, keyValueMap, done); + }, + async function (done) { + var configs = svc.configurations(namespace); + configs.fetch(); + + // a. File exists: Positive + var doesFileExistResponse1 = await configs.doesFileExist(filename); + var configFile = doesFileExistResponse1?.file; + assert.ok(configFile); + + // b. Stanza exists: Positive + configFile = await configFile.fetch_v2(); + var doesStanzaExistResponse1 = await configs.doesStanzaExist(configFile, stanza); + var configStanza = doesStanzaExistResponse1.stanza; + + assert.ok(configStanza); + assert.ok(configStanza._properties); + assert.strictEqual(configStanza._properties[property1], value1 ); + assert.strictEqual(configStanza._properties[property2], value2 ); + + // c. File exists: Negative + var doesFileExistResponse2 = await configs.doesFileExist("invalid_filename"); + var invalidConfigFile = doesFileExistResponse2?.file; + + assert.ok(!invalidConfigFile); + + // d. Stanza exists: Positive + var doesStanzaExistResponse2 = await configs.doesStanzaExist(configFile, "invalid_stanza_name"); + var invalidConfigStanza = doesStanzaExistResponse2.stanza; + + assert.ok(!invalidConfigStanza); + + done(); + }, + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + it("Callback#can get default stanza", function (done) { var that = this; var namespace = { owner: "admin", app: "search" }; From fee7c72fb2b56608bca74b9345bf27912cc031fe Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 19 Nov 2021 16:57:15 +0530 Subject: [PATCH 02/11] remove .cache files --- lib/service.js | 6 +- ...40852eb3b30bc694a31ea4d853ea54b53a73249.js | 2876 ----------------- ...84d81786a58e3cde0369210c14b0a65c62d3b58.js | 2875 ---------------- 3 files changed, 3 insertions(+), 5754 deletions(-) delete mode 100644 node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js delete mode 100644 node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js diff --git a/lib/service.js b/lib/service.js index c6de116cf..98efcb767 100644 --- a/lib/service.js +++ b/lib/service.js @@ -3131,15 +3131,15 @@ // 2. Filter the files var files = response?.body?.entry?.filter(f => f.name === filename); - // 2. Check if the file exists + // 3. Check if the file exists if(files && files.length == 0) { return { code:"FILE_NOT_FOUND", message: `File with the name '${filename}' does not exist.`}; } - // 3. Create a local instance + // 4. Create a local instance var configurationFile = new root.ConfigurationFile(that.service, filename); - // 4. Load the file content + // 5. Load the file content var fetchedFile = await configurationFile.fetch_v2(); return {file: fetchedFile}; diff --git a/node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js b/node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js deleted file mode 100644 index e43a4157e..000000000 --- a/node_modules/.cache/nyc/service-c5a42beecb731026519e3377040852eb3b30bc694a31ea4d853ea54b53a73249.js +++ /dev/null @@ -1,2876 +0,0 @@ -function cov_1ks4ntaci2(){var path="/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js";var hash="b527bc3bbffe3a4fee511c63590269cdc3ea500f";var global=new Function("return this")();var gcv="__coverage__";var coverageData={path:"/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js",statementMap:{"0":{start:{line:16,column:0},end:{line:5803,column:5}},"1":{start:{line:19,column:22},end:{line:19,column:42}},"2":{start:{line:20,column:22},end:{line:20,column:39}},"3":{start:{line:21,column:22},end:{line:21,column:40}},"4":{start:{line:22,column:22},end:{line:22,column:46}},"5":{start:{line:23,column:22},end:{line:23,column:53}},"6":{start:{line:24,column:22},end:{line:24,column:40}},"7":{start:{line:26,column:15},end:{line:26,column:30}},"8":{start:{line:27,column:18},end:{line:27,column:22}},"9":{start:{line:37,column:22},end:{line:41,column:6}},"10":{start:{line:39,column:12},end:{line:39,column:47}},"11":{start:{line:51,column:4},end:{line:664,column:7}},"12":{start:{line:73,column:12},end:{line:73,column:47}},"13":{start:{line:77,column:12},end:{line:77,column:72}},"14":{start:{line:78,column:12},end:{line:78,column:66}},"15":{start:{line:79,column:12},end:{line:79,column:76}},"16":{start:{line:80,column:12},end:{line:80,column:69}},"17":{start:{line:81,column:12},end:{line:81,column:75}},"18":{start:{line:82,column:12},end:{line:82,column:66}},"19":{start:{line:83,column:12},end:{line:83,column:67}},"20":{start:{line:84,column:12},end:{line:84,column:73}},"21":{start:{line:85,column:12},end:{line:85,column:67}},"22":{start:{line:86,column:12},end:{line:86,column:78}},"23":{start:{line:87,column:12},end:{line:87,column:72}},"24":{start:{line:106,column:12},end:{line:116,column:15}},"25":{start:{line:136,column:12},end:{line:136,column:47}},"26":{start:{line:164,column:12},end:{line:164,column:60}},"27":{start:{line:192,column:12},end:{line:192,column:53}},"28":{start:{line:218,column:12},end:{line:218,column:59}},"29":{start:{line:244,column:12},end:{line:244,column:62}},"30":{start:{line:271,column:12},end:{line:271,column:71}},"31":{start:{line:300,column:12},end:{line:300,column:50}},"32":{start:{line:312,column:12},end:{line:312,column:56}},"33":{start:{line:337,column:12},end:{line:337,column:40}},"34":{start:{line:366,column:12},end:{line:366,column:51}},"35":{start:{line:397,column:12},end:{line:400,column:13}},"36":{start:{line:398,column:16},end:{line:398,column:37}},"37":{start:{line:399,column:16},end:{line:399,column:33}},"38":{start:{line:402,column:23},end:{line:402,column:53}},"39":{start:{line:403,column:12},end:{line:403,column:56}},"40":{start:{line:420,column:12},end:{line:423,column:13}},"41":{start:{line:421,column:16},end:{line:421,column:37}},"42":{start:{line:422,column:16},end:{line:422,column:33}},"43":{start:{line:424,column:22},end:{line:424,column:56}},"44":{start:{line:425,column:12},end:{line:425,column:43}},"45":{start:{line:453,column:12},end:{line:456,column:13}},"46":{start:{line:454,column:16},end:{line:454,column:37}},"47":{start:{line:455,column:16},end:{line:455,column:33}},"48":{start:{line:458,column:23},end:{line:458,column:53}},"49":{start:{line:459,column:12},end:{line:459,column:63}},"50":{start:{line:478,column:12},end:{line:478,column:49}},"51":{start:{line:480,column:23},end:{line:480,column:27}},"52":{start:{line:481,column:22},end:{line:497,column:14}},"53":{start:{line:482,column:16},end:{line:496,column:17}},"54":{start:{line:483,column:20},end:{line:483,column:34}},"55":{start:{line:486,column:35},end:{line:486,column:74}},"56":{start:{line:487,column:31},end:{line:487,column:60}},"57":{start:{line:488,column:20},end:{line:495,column:23}},"58":{start:{line:489,column:24},end:{line:494,column:25}},"59":{start:{line:490,column:28},end:{line:490,column:35}},"60":{start:{line:493,column:28},end:{line:493,column:60}},"61":{start:{line:499,column:12},end:{line:499,column:23}},"62":{start:{line:517,column:12},end:{line:517,column:49}},"63":{start:{line:519,column:29},end:{line:519,column:54}},"64":{start:{line:520,column:12},end:{line:520,column:46}},"65":{start:{line:544,column:12},end:{line:547,column:13}},"66":{start:{line:545,column:16},end:{line:545,column:34}},"67":{start:{line:546,column:16},end:{line:546,column:28}},"68":{start:{line:549,column:12},end:{line:549,column:49}},"69":{start:{line:550,column:12},end:{line:550,column:34}},"70":{start:{line:552,column:12},end:{line:552,column:29}},"71":{start:{line:554,column:12},end:{line:561,column:15}},"72":{start:{line:555,column:16},end:{line:560,column:17}},"73":{start:{line:556,column:20},end:{line:556,column:34}},"74":{start:{line:559,column:20},end:{line:559,column:50}},"75":{start:{line:581,column:12},end:{line:584,column:13}},"76":{start:{line:582,column:16},end:{line:582,column:33}},"77":{start:{line:583,column:16},end:{line:583,column:27}},"78":{start:{line:586,column:12},end:{line:586,column:49}},"79":{start:{line:587,column:25},end:{line:590,column:13}},"80":{start:{line:592,column:12},end:{line:600,column:15}},"81":{start:{line:593,column:16},end:{line:599,column:17}},"82":{start:{line:594,column:20},end:{line:594,column:34}},"83":{start:{line:597,column:34},end:{line:597,column:63}},"84":{start:{line:598,column:20},end:{line:598,column:50}},"85":{start:{line:625,column:12},end:{line:628,column:13}},"86":{start:{line:626,column:16},end:{line:626,column:34}},"87":{start:{line:627,column:16},end:{line:627,column:28}},"88":{start:{line:630,column:12},end:{line:630,column:49}},"89":{start:{line:631,column:12},end:{line:631,column:34}},"90":{start:{line:634,column:12},end:{line:636,column:13}},"91":{start:{line:635,column:16},end:{line:635,column:46}},"92":{start:{line:638,column:23},end:{line:638,column:45}},"93":{start:{line:639,column:25},end:{line:639,column:31}},"94":{start:{line:640,column:26},end:{line:640,column:56}},"95":{start:{line:641,column:23},end:{line:641,column:28}},"96":{start:{line:642,column:22},end:{line:642,column:28}},"97":{start:{line:643,column:23},end:{line:643,column:25}},"98":{start:{line:645,column:22},end:{line:660,column:13}},"99":{start:{line:653,column:20},end:{line:658,column:21}},"100":{start:{line:654,column:24},end:{line:654,column:38}},"101":{start:{line:657,column:24},end:{line:657,column:54}},"102":{start:{line:662,column:12},end:{line:662,column:23}},"103":{start:{line:674,column:4},end:{line:815,column:7}},"104":{start:{line:686,column:12},end:{line:688,column:13}},"105":{start:{line:687,column:16},end:{line:687,column:61}},"106":{start:{line:690,column:12},end:{line:692,column:13}},"107":{start:{line:691,column:16},end:{line:691,column:60}},"108":{start:{line:694,column:12},end:{line:694,column:35}},"109":{start:{line:695,column:12},end:{line:695,column:47}},"110":{start:{line:699,column:12},end:{line:699,column:53}},"111":{start:{line:701,column:12},end:{line:701,column:54}},"112":{start:{line:702,column:12},end:{line:702,column:53}},"113":{start:{line:722,column:22},end:{line:722,column:40}},"114":{start:{line:726,column:12},end:{line:728,column:13}},"115":{start:{line:727,column:16},end:{line:727,column:42}},"116":{start:{line:730,column:12},end:{line:734,column:14}},"117":{start:{line:738,column:22},end:{line:738,column:40}},"118":{start:{line:742,column:12},end:{line:744,column:13}},"119":{start:{line:743,column:16},end:{line:743,column:42}},"120":{start:{line:746,column:12},end:{line:749,column:14}},"121":{start:{line:769,column:22},end:{line:769,column:40}},"122":{start:{line:773,column:12},end:{line:775,column:13}},"123":{start:{line:774,column:16},end:{line:774,column:42}},"124":{start:{line:777,column:12},end:{line:781,column:14}},"125":{start:{line:801,column:22},end:{line:801,column:40}},"126":{start:{line:805,column:12},end:{line:807,column:13}},"127":{start:{line:806,column:16},end:{line:806,column:42}},"128":{start:{line:809,column:12},end:{line:813,column:14}},"129":{start:{line:828,column:4},end:{line:916,column:7}},"130":{start:{line:844,column:27},end:{line:844,column:60}},"131":{start:{line:846,column:12},end:{line:846,column:43}},"132":{start:{line:847,column:12},end:{line:847,column:39}},"133":{start:{line:848,column:12},end:{line:848,column:34}},"134":{start:{line:849,column:12},end:{line:849,column:29}},"135":{start:{line:853,column:12},end:{line:853,column:60}},"136":{start:{line:854,column:12},end:{line:854,column:60}},"137":{start:{line:855,column:12},end:{line:855,column:65}},"138":{start:{line:856,column:12},end:{line:856,column:60}},"139":{start:{line:857,column:12},end:{line:857,column:59}},"140":{start:{line:866,column:12},end:{line:866,column:50}},"141":{start:{line:878,column:12},end:{line:878,column:48}},"142":{start:{line:879,column:12},end:{line:879,column:43}},"143":{start:{line:892,column:12},end:{line:892,column:50}},"144":{start:{line:903,column:12},end:{line:903,column:36}},"145":{start:{line:914,column:12},end:{line:914,column:31}},"146":{start:{line:929,column:4},end:{line:1238,column:7}},"147":{start:{line:954,column:12},end:{line:954,column:50}},"148":{start:{line:958,column:12},end:{line:958,column:58}},"149":{start:{line:959,column:12},end:{line:959,column:58}},"150":{start:{line:960,column:12},end:{line:960,column:59}},"151":{start:{line:961,column:12},end:{line:961,column:59}},"152":{start:{line:962,column:12},end:{line:962,column:59}},"153":{start:{line:963,column:12},end:{line:963,column:58}},"154":{start:{line:964,column:12},end:{line:964,column:56}},"155":{start:{line:965,column:12},end:{line:965,column:59}},"156":{start:{line:966,column:12},end:{line:966,column:60}},"157":{start:{line:967,column:12},end:{line:967,column:62}},"158":{start:{line:968,column:12},end:{line:968,column:59}},"159":{start:{line:969,column:12},end:{line:969,column:60}},"160":{start:{line:970,column:12},end:{line:970,column:59}},"161":{start:{line:973,column:12},end:{line:973,column:34}},"162":{start:{line:974,column:12},end:{line:974,column:34}},"163":{start:{line:975,column:12},end:{line:975,column:34}},"164":{start:{line:976,column:12},end:{line:976,column:34}},"165":{start:{line:988,column:12},end:{line:988,column:80}},"166":{start:{line:992,column:12},end:{line:997,column:14}},"167":{start:{line:999,column:12},end:{line:999,column:36}},"168":{start:{line:1002,column:12},end:{line:1002,column:58}},"169":{start:{line:1003,column:12},end:{line:1003,column:74}},"170":{start:{line:1004,column:12},end:{line:1004,column:58}},"171":{start:{line:1005,column:12},end:{line:1005,column:58}},"172":{start:{line:1006,column:12},end:{line:1006,column:60}},"173":{start:{line:1007,column:12},end:{line:1007,column:60}},"174":{start:{line:1008,column:12},end:{line:1008,column:60}},"175":{start:{line:1020,column:12},end:{line:1020,column:32}},"176":{start:{line:1032,column:12},end:{line:1032,column:29}},"177":{start:{line:1044,column:12},end:{line:1044,column:31}},"178":{start:{line:1055,column:12},end:{line:1055,column:32}},"179":{start:{line:1066,column:12},end:{line:1066,column:33}},"180":{start:{line:1077,column:12},end:{line:1077,column:35}},"181":{start:{line:1096,column:12},end:{line:1099,column:13}},"182":{start:{line:1097,column:16},end:{line:1097,column:35}},"183":{start:{line:1098,column:16},end:{line:1098,column:29}},"184":{start:{line:1100,column:12},end:{line:1100,column:49}},"185":{start:{line:1102,column:12},end:{line:1102,column:36}},"186":{start:{line:1104,column:23},end:{line:1104,column:27}},"187":{start:{line:1105,column:12},end:{line:1113,column:15}},"188":{start:{line:1106,column:16},end:{line:1112,column:17}},"189":{start:{line:1107,column:20},end:{line:1107,column:34}},"190":{start:{line:1110,column:20},end:{line:1110,column:75}},"191":{start:{line:1111,column:20},end:{line:1111,column:41}},"192":{start:{line:1125,column:12},end:{line:1125,column:49}},"193":{start:{line:1127,column:23},end:{line:1127,column:27}},"194":{start:{line:1128,column:12},end:{line:1130,column:15}},"195":{start:{line:1129,column:16},end:{line:1129,column:30}},"196":{start:{line:1143,column:12},end:{line:1143,column:49}},"197":{start:{line:1145,column:12},end:{line:1147,column:13}},"198":{start:{line:1146,column:16},end:{line:1146,column:71}},"199":{start:{line:1149,column:23},end:{line:1149,column:27}},"200":{start:{line:1150,column:22},end:{line:1168,column:14}},"201":{start:{line:1151,column:16},end:{line:1167,column:17}},"202":{start:{line:1152,column:20},end:{line:1152,column:52}},"203":{start:{line:1153,column:20},end:{line:1153,column:40}},"204":{start:{line:1155,column:21},end:{line:1167,column:17}},"205":{start:{line:1156,column:20},end:{line:1163,column:23}},"206":{start:{line:1157,column:24},end:{line:1162,column:25}},"207":{start:{line:1158,column:28},end:{line:1158,column:35}},"208":{start:{line:1161,column:28},end:{line:1161,column:60}},"209":{start:{line:1166,column:20},end:{line:1166,column:40}},"210":{start:{line:1170,column:12},end:{line:1170,column:23}},"211":{start:{line:1182,column:12},end:{line:1182,column:49}},"212":{start:{line:1184,column:23},end:{line:1184,column:27}},"213":{start:{line:1185,column:12},end:{line:1192,column:15}},"214":{start:{line:1186,column:16},end:{line:1191,column:17}},"215":{start:{line:1187,column:20},end:{line:1187,column:34}},"216":{start:{line:1190,column:20},end:{line:1190,column:41}},"217":{start:{line:1204,column:12},end:{line:1204,column:49}},"218":{start:{line:1206,column:23},end:{line:1206,column:27}},"219":{start:{line:1207,column:12},end:{line:1214,column:15}},"220":{start:{line:1208,column:16},end:{line:1213,column:17}},"221":{start:{line:1209,column:20},end:{line:1209,column:34}},"222":{start:{line:1212,column:20},end:{line:1212,column:41}},"223":{start:{line:1226,column:12},end:{line:1226,column:49}},"224":{start:{line:1228,column:23},end:{line:1228,column:27}},"225":{start:{line:1229,column:12},end:{line:1236,column:15}},"226":{start:{line:1230,column:16},end:{line:1235,column:17}},"227":{start:{line:1231,column:20},end:{line:1231,column:34}},"228":{start:{line:1234,column:20},end:{line:1234,column:41}},"229":{start:{line:1248,column:4},end:{line:1579,column:7}},"230":{start:{line:1273,column:12},end:{line:1273,column:50}},"231":{start:{line:1277,column:12},end:{line:1277,column:66}},"232":{start:{line:1278,column:12},end:{line:1278,column:66}},"233":{start:{line:1279,column:12},end:{line:1279,column:67}},"234":{start:{line:1280,column:12},end:{line:1280,column:65}},"235":{start:{line:1281,column:12},end:{line:1281,column:65}},"236":{start:{line:1282,column:12},end:{line:1282,column:78}},"237":{start:{line:1285,column:12},end:{line:1285,column:38}},"238":{start:{line:1286,column:12},end:{line:1286,column:38}},"239":{start:{line:1287,column:12},end:{line:1287,column:38}},"240":{start:{line:1288,column:12},end:{line:1288,column:38}},"241":{start:{line:1289,column:12},end:{line:1289,column:38}},"242":{start:{line:1301,column:12},end:{line:1301,column:50}},"243":{start:{line:1314,column:12},end:{line:1314,column:36}},"244":{start:{line:1316,column:27},end:{line:1316,column:29}},"245":{start:{line:1317,column:33},end:{line:1317,column:35}},"246":{start:{line:1318,column:37},end:{line:1318,column:59}},"247":{start:{line:1319,column:12},end:{line:1331,column:13}},"248":{start:{line:1319,column:24},end:{line:1319,column:25}},"249":{start:{line:1320,column:28},end:{line:1320,column:49}},"250":{start:{line:1321,column:29},end:{line:1321,column:58}},"251":{start:{line:1322,column:16},end:{line:1322,column:36}},"252":{start:{line:1323,column:16},end:{line:1323,column:38}},"253":{start:{line:1325,column:16},end:{line:1330,column:17}},"254":{start:{line:1326,column:20},end:{line:1326,column:61}},"255":{start:{line:1329,column:20},end:{line:1329,column:59}},"256":{start:{line:1332,column:12},end:{line:1332,column:44}},"257":{start:{line:1333,column:12},end:{line:1333,column:50}},"258":{start:{line:1334,column:12},end:{line:1334,column:62}},"259":{start:{line:1335,column:12},end:{line:1335,column:62}},"260":{start:{line:1336,column:12},end:{line:1336,column:64}},"261":{start:{line:1348,column:12},end:{line:1348,column:31}},"262":{start:{line:1359,column:12},end:{line:1359,column:32}},"263":{start:{line:1370,column:12},end:{line:1370,column:33}},"264":{start:{line:1389,column:12},end:{line:1392,column:13}},"265":{start:{line:1390,column:16},end:{line:1390,column:35}},"266":{start:{line:1391,column:16},end:{line:1391,column:29}},"267":{start:{line:1393,column:12},end:{line:1393,column:49}},"268":{start:{line:1395,column:12},end:{line:1395,column:36}},"269":{start:{line:1396,column:12},end:{line:1398,column:13}},"270":{start:{line:1397,column:16},end:{line:1397,column:34}},"271":{start:{line:1400,column:23},end:{line:1400,column:27}},"272":{start:{line:1401,column:22},end:{line:1409,column:14}},"273":{start:{line:1402,column:16},end:{line:1408,column:17}},"274":{start:{line:1403,column:20},end:{line:1403,column:34}},"275":{start:{line:1406,column:20},end:{line:1406,column:46}},"276":{start:{line:1407,column:20},end:{line:1407,column:41}},"277":{start:{line:1411,column:12},end:{line:1411,column:23}},"278":{start:{line:1415,column:12},end:{line:1415,column:36}},"279":{start:{line:1416,column:12},end:{line:1418,column:13}},"280":{start:{line:1417,column:16},end:{line:1417,column:34}},"281":{start:{line:1420,column:23},end:{line:1420,column:27}},"282":{start:{line:1421,column:27},end:{line:1421,column:57}},"283":{start:{line:1423,column:12},end:{line:1423,column:38}},"284":{start:{line:1424,column:12},end:{line:1424,column:24}},"285":{start:{line:1449,column:12},end:{line:1451,column:13}},"286":{start:{line:1450,column:16},end:{line:1450,column:33}},"287":{start:{line:1453,column:12},end:{line:1455,column:13}},"288":{start:{line:1454,column:16},end:{line:1454,column:64}},"289":{start:{line:1457,column:12},end:{line:1459,column:13}},"290":{start:{line:1458,column:16},end:{line:1458,column:136}},"291":{start:{line:1461,column:27},end:{line:1461,column:31}},"292":{start:{line:1462,column:12},end:{line:1504,column:13}},"293":{start:{line:1463,column:31},end:{line:1463,column:55}},"294":{start:{line:1465,column:16},end:{line:1500,column:17}},"295":{start:{line:1470,column:20},end:{line:1470,column:39}},"296":{start:{line:1472,column:21},end:{line:1500,column:17}},"297":{start:{line:1476,column:20},end:{line:1476,column:84}},"298":{start:{line:1477,column:20},end:{line:1482,column:21}},"299":{start:{line:1478,column:24},end:{line:1478,column:43}},"300":{start:{line:1481,column:24},end:{line:1481,column:36}},"301":{start:{line:1484,column:21},end:{line:1500,column:17}},"302":{start:{line:1488,column:20},end:{line:1488,column:77}},"303":{start:{line:1493,column:20},end:{line:1499,column:21}},"304":{start:{line:1493,column:32},end:{line:1493,column:33}},"305":{start:{line:1494,column:37},end:{line:1494,column:48}},"306":{start:{line:1495,column:24},end:{line:1495,column:88}},"307":{start:{line:1496,column:24},end:{line:1498,column:25}},"308":{start:{line:1497,column:28},end:{line:1497,column:42}},"309":{start:{line:1503,column:16},end:{line:1503,column:28}},"310":{start:{line:1525,column:12},end:{line:1525,column:49}},"311":{start:{line:1526,column:23},end:{line:1526,column:27}},"312":{start:{line:1527,column:22},end:{line:1554,column:14}},"313":{start:{line:1528,column:16},end:{line:1553,column:17}},"314":{start:{line:1529,column:20},end:{line:1529,column:34}},"315":{start:{line:1532,column:32},end:{line:1532,column:51}},"316":{start:{line:1533,column:20},end:{line:1535,column:21}},"317":{start:{line:1534,column:24},end:{line:1534,column:41}},"318":{start:{line:1537,column:33},end:{line:1537,column:62}},"319":{start:{line:1538,column:20},end:{line:1538,column:40}},"320":{start:{line:1540,column:20},end:{line:1552,column:21}},"321":{start:{line:1541,column:24},end:{line:1548,column:27}},"322":{start:{line:1542,column:28},end:{line:1547,column:29}},"323":{start:{line:1543,column:32},end:{line:1543,column:39}},"324":{start:{line:1546,column:32},end:{line:1546,column:64}},"325":{start:{line:1551,column:24},end:{line:1551,column:47}},"326":{start:{line:1556,column:12},end:{line:1556,column:23}},"327":{start:{line:1575,column:12},end:{line:1575,column:49}},"328":{start:{line:1577,column:12},end:{line:1577,column:47}},"329":{start:{line:1589,column:4},end:{line:1843,column:7}},"330":{start:{line:1596,column:12},end:{line:1596,column:77}},"331":{start:{line:1614,column:12},end:{line:1614,column:29}},"332":{start:{line:1615,column:12},end:{line:1615,column:57}},"333":{start:{line:1617,column:12},end:{line:1617,column:67}},"334":{start:{line:1618,column:12},end:{line:1618,column:64}},"335":{start:{line:1619,column:12},end:{line:1619,column:63}},"336":{start:{line:1620,column:12},end:{line:1620,column:68}},"337":{start:{line:1637,column:12},end:{line:1637,column:78}},"338":{start:{line:1657,column:12},end:{line:1657,column:49}},"339":{start:{line:1659,column:23},end:{line:1659,column:27}},"340":{start:{line:1660,column:22},end:{line:1662,column:14}},"341":{start:{line:1661,column:16},end:{line:1661,column:36}},"342":{start:{line:1664,column:12},end:{line:1664,column:23}},"343":{start:{line:1689,column:12},end:{line:1692,column:13}},"344":{start:{line:1690,column:16},end:{line:1690,column:35}},"345":{start:{line:1691,column:16},end:{line:1691,column:29}},"346":{start:{line:1694,column:12},end:{line:1694,column:49}},"347":{start:{line:1695,column:12},end:{line:1695,column:36}},"348":{start:{line:1697,column:23},end:{line:1697,column:27}},"349":{start:{line:1698,column:22},end:{line:1708,column:14}},"350":{start:{line:1699,column:16},end:{line:1702,column:17}},"351":{start:{line:1700,column:20},end:{line:1700,column:34}},"352":{start:{line:1701,column:20},end:{line:1701,column:27}},"353":{start:{line:1704,column:26},end:{line:1704,column:43}},"354":{start:{line:1705,column:26},end:{line:1705,column:73}},"355":{start:{line:1707,column:16},end:{line:1707,column:42}},"356":{start:{line:1710,column:12},end:{line:1710,column:23}},"357":{start:{line:1726,column:12},end:{line:1726,column:69}},"358":{start:{line:1749,column:12},end:{line:1752,column:13}},"359":{start:{line:1750,column:16},end:{line:1750,column:35}},"360":{start:{line:1751,column:16},end:{line:1751,column:29}},"361":{start:{line:1754,column:12},end:{line:1754,column:49}},"362":{start:{line:1755,column:12},end:{line:1755,column:36}},"363":{start:{line:1757,column:23},end:{line:1757,column:27}},"364":{start:{line:1758,column:12},end:{line:1776,column:15}},"365":{start:{line:1759,column:16},end:{line:1762,column:17}},"366":{start:{line:1760,column:20},end:{line:1760,column:34}},"367":{start:{line:1761,column:20},end:{line:1761,column:27}},"368":{start:{line:1764,column:27},end:{line:1764,column:29}},"369":{start:{line:1765,column:27},end:{line:1765,column:52}},"370":{start:{line:1766,column:16},end:{line:1773,column:17}},"371":{start:{line:1766,column:28},end:{line:1766,column:29}},"372":{start:{line:1767,column:34},end:{line:1767,column:56}},"373":{start:{line:1768,column:36},end:{line:1768,column:74}},"374":{start:{line:1769,column:30},end:{line:1769,column:81}},"375":{start:{line:1771,column:20},end:{line:1771,column:39}},"376":{start:{line:1772,column:20},end:{line:1772,column:35}},"377":{start:{line:1775,column:16},end:{line:1775,column:43}},"378":{start:{line:1795,column:12},end:{line:1795,column:49}},"379":{start:{line:1797,column:23},end:{line:1797,column:27}},"380":{start:{line:1798,column:12},end:{line:1800,column:15}},"381":{start:{line:1799,column:16},end:{line:1799,column:65}},"382":{start:{line:1816,column:12},end:{line:1816,column:34}},"383":{start:{line:1818,column:12},end:{line:1841,column:13}},"384":{start:{line:1819,column:29},end:{line:1819,column:40}},"385":{start:{line:1820,column:26},end:{line:1835,column:18}},"386":{start:{line:1821,column:20},end:{line:1834,column:21}},"387":{start:{line:1822,column:24},end:{line:1822,column:38}},"388":{start:{line:1825,column:24},end:{line:1825,column:67}},"389":{start:{line:1826,column:24},end:{line:1833,column:27}},"390":{start:{line:1827,column:28},end:{line:1832,column:29}},"391":{start:{line:1828,column:32},end:{line:1828,column:39}},"392":{start:{line:1831,column:32},end:{line:1831,column:64}},"393":{start:{line:1837,column:16},end:{line:1837,column:27}},"394":{start:{line:1840,column:16},end:{line:1840,column:53}},"395":{start:{line:1854,column:4},end:{line:1893,column:7}},"396":{start:{line:1861,column:12},end:{line:1861,column:39}},"397":{start:{line:1873,column:34},end:{line:1873,column:70}},"398":{start:{line:1874,column:12},end:{line:1874,column:83}},"399":{start:{line:1891,column:12},end:{line:1891,column:57}},"400":{start:{line:1903,column:4},end:{line:1931,column:7}},"401":{start:{line:1910,column:12},end:{line:1910,column:80}},"402":{start:{line:1928,column:12},end:{line:1928,column:29}},"403":{start:{line:1929,column:12},end:{line:1929,column:57}},"404":{start:{line:1941,column:4},end:{line:1991,column:7}},"405":{start:{line:1957,column:12},end:{line:1957,column:42}},"406":{start:{line:1971,column:34},end:{line:1971,column:70}},"407":{start:{line:1972,column:12},end:{line:1972,column:87}},"408":{start:{line:1989,column:12},end:{line:1989,column:57}},"409":{start:{line:2002,column:4},end:{line:2143,column:7}},"410":{start:{line:2009,column:12},end:{line:2009,column:75}},"411":{start:{line:2021,column:12},end:{line:2021,column:51}},"412":{start:{line:2031,column:12},end:{line:2031,column:56}},"413":{start:{line:2045,column:12},end:{line:2045,column:51}},"414":{start:{line:2057,column:12},end:{line:2057,column:70}},"415":{start:{line:2067,column:12},end:{line:2067,column:62}},"416":{start:{line:2078,column:12},end:{line:2078,column:66}},"417":{start:{line:2088,column:12},end:{line:2088,column:49}},"418":{start:{line:2098,column:12},end:{line:2098,column:58}},"419":{start:{line:2110,column:12},end:{line:2110,column:67}},"420":{start:{line:2122,column:12},end:{line:2122,column:74}},"421":{start:{line:2140,column:12},end:{line:2140,column:29}},"422":{start:{line:2141,column:12},end:{line:2141,column:57}},"423":{start:{line:2154,column:4},end:{line:2243,column:7}},"424":{start:{line:2161,column:12},end:{line:2161,column:75}},"425":{start:{line:2173,column:12},end:{line:2173,column:78}},"426":{start:{line:2194,column:12},end:{line:2197,column:13}},"427":{start:{line:2195,column:16},end:{line:2195,column:35}},"428":{start:{line:2196,column:16},end:{line:2196,column:29}},"429":{start:{line:2199,column:12},end:{line:2199,column:49}},"430":{start:{line:2200,column:12},end:{line:2200,column:36}},"431":{start:{line:2202,column:23},end:{line:2202,column:27}},"432":{start:{line:2203,column:12},end:{line:2220,column:15}},"433":{start:{line:2204,column:16},end:{line:2207,column:17}},"434":{start:{line:2205,column:20},end:{line:2205,column:34}},"435":{start:{line:2206,column:20},end:{line:2206,column:27}},"436":{start:{line:2209,column:34},end:{line:2209,column:36}},"437":{start:{line:2210,column:27},end:{line:2210,column:52}},"438":{start:{line:2211,column:16},end:{line:2217,column:17}},"439":{start:{line:2211,column:29},end:{line:2211,column:30}},"440":{start:{line:2212,column:41},end:{line:2212,column:63}},"441":{start:{line:2213,column:36},end:{line:2213,column:81}},"442":{start:{line:2214,column:37},end:{line:2214,column:102}},"443":{start:{line:2215,column:20},end:{line:2215,column:53}},"444":{start:{line:2216,column:20},end:{line:2216,column:49}},"445":{start:{line:2219,column:16},end:{line:2219,column:50}},"446":{start:{line:2238,column:12},end:{line:2238,column:29}},"447":{start:{line:2239,column:12},end:{line:2239,column:57}},"448":{start:{line:2241,column:12},end:{line:2241,column:52}},"449":{start:{line:2255,column:4},end:{line:2306,column:7}},"450":{start:{line:2262,column:12},end:{line:2262,column:37}},"451":{start:{line:2274,column:34},end:{line:2274,column:70}},"452":{start:{line:2275,column:12},end:{line:2275,column:87}},"453":{start:{line:2284,column:12},end:{line:2284,column:95}},"454":{start:{line:2301,column:12},end:{line:2301,column:57}},"455":{start:{line:2303,column:12},end:{line:2303,column:78}},"456":{start:{line:2304,column:12},end:{line:2304,column:56}},"457":{start:{line:2316,column:4},end:{line:2409,column:7}},"458":{start:{line:2331,column:12},end:{line:2331,column:68}},"459":{start:{line:2345,column:12},end:{line:2345,column:29}},"460":{start:{line:2346,column:12},end:{line:2346,column:50}},"461":{start:{line:2348,column:12},end:{line:2348,column:63}},"462":{start:{line:2349,column:12},end:{line:2349,column:64}},"463":{start:{line:2368,column:12},end:{line:2368,column:49}},"464":{start:{line:2370,column:23},end:{line:2370,column:27}},"465":{start:{line:2371,column:12},end:{line:2378,column:15}},"466":{start:{line:2372,column:16},end:{line:2377,column:17}},"467":{start:{line:2373,column:20},end:{line:2373,column:34}},"468":{start:{line:2376,column:20},end:{line:2376,column:70}},"469":{start:{line:2397,column:12},end:{line:2397,column:49}},"470":{start:{line:2399,column:23},end:{line:2399,column:27}},"471":{start:{line:2400,column:12},end:{line:2407,column:15}},"472":{start:{line:2401,column:16},end:{line:2406,column:17}},"473":{start:{line:2402,column:20},end:{line:2402,column:34}},"474":{start:{line:2405,column:20},end:{line:2405,column:70}},"475":{start:{line:2419,column:4},end:{line:2462,column:7}},"476":{start:{line:2435,column:12},end:{line:2435,column:30}},"477":{start:{line:2447,column:12},end:{line:2447,column:70}},"478":{start:{line:2460,column:12},end:{line:2460,column:50}},"479":{start:{line:2471,column:4},end:{line:2494,column:7}},"480":{start:{line:2478,column:12},end:{line:2478,column:30}},"481":{start:{line:2491,column:12},end:{line:2491,column:38}},"482":{start:{line:2492,column:12},end:{line:2492,column:50}},"483":{start:{line:2504,column:4},end:{line:2528,column:7}},"484":{start:{line:2511,column:12},end:{line:2511,column:69}},"485":{start:{line:2525,column:12},end:{line:2525,column:29}},"486":{start:{line:2526,column:12},end:{line:2526,column:50}},"487":{start:{line:2538,column:4},end:{line:2618,column:7}},"488":{start:{line:2554,column:12},end:{line:2554,column:31}},"489":{start:{line:2566,column:12},end:{line:2566,column:63}},"490":{start:{line:2579,column:12},end:{line:2579,column:50}},"491":{start:{line:2593,column:12},end:{line:2593,column:49}},"492":{start:{line:2595,column:23},end:{line:2595,column:27}},"493":{start:{line:2596,column:22},end:{line:2614,column:14}},"494":{start:{line:2597,column:16},end:{line:2613,column:17}},"495":{start:{line:2598,column:20},end:{line:2598,column:34}},"496":{start:{line:2602,column:32},end:{line:2602,column:51}},"497":{start:{line:2604,column:33},end:{line:2604,column:62}},"498":{start:{line:2605,column:20},end:{line:2612,column:23}},"499":{start:{line:2606,column:24},end:{line:2611,column:25}},"500":{start:{line:2607,column:28},end:{line:2607,column:35}},"501":{start:{line:2610,column:28},end:{line:2610,column:60}},"502":{start:{line:2616,column:12},end:{line:2616,column:23}},"503":{start:{line:2628,column:4},end:{line:2656,column:7}},"504":{start:{line:2635,column:12},end:{line:2635,column:69}},"505":{start:{line:2653,column:12},end:{line:2653,column:29}},"506":{start:{line:2654,column:12},end:{line:2654,column:57}},"507":{start:{line:2666,column:4},end:{line:2705,column:7}},"508":{start:{line:2673,column:12},end:{line:2673,column:31}},"509":{start:{line:2685,column:34},end:{line:2685,column:70}},"510":{start:{line:2686,column:12},end:{line:2686,column:76}},"511":{start:{line:2703,column:12},end:{line:2703,column:57}},"512":{start:{line:2714,column:4},end:{line:2792,column:7}},"513":{start:{line:2721,column:12},end:{line:2721,column:71}},"514":{start:{line:2739,column:12},end:{line:2739,column:29}},"515":{start:{line:2740,column:12},end:{line:2740,column:57}},"516":{start:{line:2742,column:12},end:{line:2742,column:66}},"517":{start:{line:2767,column:12},end:{line:2770,column:13}},"518":{start:{line:2768,column:16},end:{line:2768,column:34}},"519":{start:{line:2769,column:16},end:{line:2769,column:28}},"520":{start:{line:2772,column:12},end:{line:2772,column:49}},"521":{start:{line:2773,column:12},end:{line:2773,column:34}},"522":{start:{line:2776,column:12},end:{line:2776,column:40}},"523":{start:{line:2778,column:23},end:{line:2778,column:27}},"524":{start:{line:2779,column:12},end:{line:2781,column:15}},"525":{start:{line:2780,column:16},end:{line:2780,column:44}},"526":{start:{line:2785,column:12},end:{line:2790,column:13}},"527":{start:{line:2786,column:16},end:{line:2786,column:75}},"528":{start:{line:2789,column:16},end:{line:2789,column:45}},"529":{start:{line:2802,column:4},end:{line:2873,column:7}},"530":{start:{line:2809,column:12},end:{line:2809,column:33}},"531":{start:{line:2821,column:34},end:{line:2821,column:70}},"532":{start:{line:2822,column:12},end:{line:2822,column:77}},"533":{start:{line:2839,column:12},end:{line:2839,column:57}},"534":{start:{line:2862,column:12},end:{line:2866,column:13}},"535":{start:{line:2863,column:16},end:{line:2863,column:34}},"536":{start:{line:2864,column:16},end:{line:2864,column:30}},"537":{start:{line:2865,column:16},end:{line:2865,column:35}},"538":{start:{line:2868,column:12},end:{line:2868,column:34}},"539":{start:{line:2869,column:12},end:{line:2869,column:34}},"540":{start:{line:2871,column:12},end:{line:2871,column:49}},"541":{start:{line:2883,column:4},end:{line:2914,column:7}},"542":{start:{line:2890,column:23},end:{line:2890,column:67}},"543":{start:{line:2891,column:12},end:{line:2891,column:116}},"544":{start:{line:2910,column:12},end:{line:2910,column:29}},"545":{start:{line:2911,column:12},end:{line:2911,column:29}},"546":{start:{line:2912,column:12},end:{line:2912,column:57}},"547":{start:{line:2925,column:4},end:{line:3017,column:7}},"548":{start:{line:2932,column:12},end:{line:2932,column:83}},"549":{start:{line:2946,column:12},end:{line:2946,column:100}},"550":{start:{line:2958,column:34},end:{line:2958,column:70}},"551":{start:{line:2959,column:12},end:{line:2959,column:102}},"552":{start:{line:2977,column:12},end:{line:2977,column:29}},"553":{start:{line:2978,column:12},end:{line:2978,column:57}},"554":{start:{line:3001,column:12},end:{line:3005,column:13}},"555":{start:{line:3002,column:16},end:{line:3002,column:34}},"556":{start:{line:3003,column:16},end:{line:3003,column:36}},"557":{start:{line:3004,column:16},end:{line:3004,column:41}},"558":{start:{line:3007,column:12},end:{line:3010,column:13}},"559":{start:{line:3008,column:16},end:{line:3008,column:34}},"560":{start:{line:3009,column:16},end:{line:3009,column:28}},"561":{start:{line:3012,column:12},end:{line:3012,column:34}},"562":{start:{line:3013,column:12},end:{line:3013,column:40}},"563":{start:{line:3015,column:12},end:{line:3015,column:49}},"564":{start:{line:3027,column:4},end:{line:3213,column:7}},"565":{start:{line:3043,column:12},end:{line:3043,column:36}},"566":{start:{line:3055,column:12},end:{line:3055,column:88}},"567":{start:{line:3072,column:12},end:{line:3074,column:13}},"568":{start:{line:3073,column:16},end:{line:3073,column:84}},"569":{start:{line:3076,column:12},end:{line:3076,column:57}},"570":{start:{line:3098,column:12},end:{line:3100,column:13}},"571":{start:{line:3099,column:16},end:{line:3099,column:46}},"572":{start:{line:3102,column:12},end:{line:3102,column:49}},"573":{start:{line:3104,column:23},end:{line:3104,column:27}},"574":{start:{line:3105,column:22},end:{line:3120,column:14}},"575":{start:{line:3106,column:16},end:{line:3119,column:17}},"576":{start:{line:3107,column:20},end:{line:3107,column:34}},"577":{start:{line:3110,column:33},end:{line:3110,column:83}},"578":{start:{line:3111,column:20},end:{line:3118,column:23}},"579":{start:{line:3112,column:24},end:{line:3117,column:25}},"580":{start:{line:3113,column:28},end:{line:3113,column:35}},"581":{start:{line:3116,column:28},end:{line:3116,column:60}},"582":{start:{line:3122,column:12},end:{line:3122,column:23}},"583":{start:{line:3126,column:12},end:{line:3150,column:13}},"584":{start:{line:3127,column:27},end:{line:3127,column:31}},"585":{start:{line:3130,column:31},end:{line:3130,column:73}},"586":{start:{line:3133,column:28},end:{line:3133,column:83}},"587":{start:{line:3133,column:63},end:{line:3133,column:82}},"588":{start:{line:3136,column:16},end:{line:3138,column:17}},"589":{start:{line:3137,column:20},end:{line:3137,column:113}},"590":{start:{line:3141,column:40},end:{line:3141,column:90}},"591":{start:{line:3144,column:34},end:{line:3144,column:68}},"592":{start:{line:3146,column:16},end:{line:3146,column:43}},"593":{start:{line:3149,column:16},end:{line:3149,column:72}},"594":{start:{line:3154,column:12},end:{line:3168,column:13}},"595":{start:{line:3157,column:36},end:{line:3157,column:53}},"596":{start:{line:3159,column:16},end:{line:3164,column:17}},"597":{start:{line:3160,column:20},end:{line:3160,column:115}},"598":{start:{line:3163,column:20},end:{line:3163,column:51}},"599":{start:{line:3167,column:16},end:{line:3167,column:72}},"600":{start:{line:3172,column:12},end:{line:3172,column:49}},"601":{start:{line:3173,column:23},end:{line:3173,column:27}},"602":{start:{line:3176,column:40},end:{line:3176,column:74}},"603":{start:{line:3177,column:29},end:{line:3177,column:55}},"604":{start:{line:3180,column:12},end:{line:3189,column:13}},"605":{start:{line:3181,column:16},end:{line:3181,column:51}},"606":{start:{line:3182,column:16},end:{line:3182,column:68}},"607":{start:{line:3184,column:16},end:{line:3185,column:95}},"608":{start:{line:3185,column:38},end:{line:3185,column:92}},"609":{start:{line:3187,column:16},end:{line:3187,column:82}},"610":{start:{line:3188,column:16},end:{line:3188,column:57}},"611":{start:{line:3192,column:42},end:{line:3192,column:88}},"612":{start:{line:3193,column:31},end:{line:3193,column:61}},"613":{start:{line:3196,column:12},end:{line:3211,column:13}},"614":{start:{line:3197,column:16},end:{line:3197,column:53}},"615":{start:{line:3198,column:16},end:{line:3198,column:70}},"616":{start:{line:3200,column:16},end:{line:3203,column:19}},"617":{start:{line:3201,column:20},end:{line:3201,column:75}},"618":{start:{line:3202,column:20},end:{line:3202,column:31}},"619":{start:{line:3207,column:16},end:{line:3210,column:19}},"620":{start:{line:3208,column:20},end:{line:3208,column:75}},"621":{start:{line:3209,column:20},end:{line:3209,column:31}},"622":{start:{line:3223,column:4},end:{line:3814,column:7}},"623":{start:{line:3230,column:12},end:{line:3230,column:68}},"624":{start:{line:3248,column:12},end:{line:3248,column:28}},"625":{start:{line:3249,column:12},end:{line:3249,column:57}},"626":{start:{line:3250,column:12},end:{line:3250,column:27}},"627":{start:{line:3254,column:12},end:{line:3254,column:64}},"628":{start:{line:3255,column:12},end:{line:3255,column:72}},"629":{start:{line:3256,column:12},end:{line:3256,column:71}},"630":{start:{line:3257,column:12},end:{line:3257,column:64}},"631":{start:{line:3258,column:12},end:{line:3258,column:66}},"632":{start:{line:3259,column:12},end:{line:3259,column:63}},"633":{start:{line:3260,column:12},end:{line:3260,column:65}},"634":{start:{line:3261,column:12},end:{line:3261,column:65}},"635":{start:{line:3262,column:12},end:{line:3262,column:67}},"636":{start:{line:3263,column:12},end:{line:3263,column:69}},"637":{start:{line:3264,column:12},end:{line:3264,column:64}},"638":{start:{line:3265,column:12},end:{line:3265,column:65}},"639":{start:{line:3266,column:12},end:{line:3266,column:66}},"640":{start:{line:3267,column:12},end:{line:3267,column:63}},"641":{start:{line:3268,column:12},end:{line:3268,column:65}},"642":{start:{line:3287,column:22},end:{line:3287,column:72}},"643":{start:{line:3289,column:12},end:{line:3289,column:23}},"644":{start:{line:3308,column:12},end:{line:3308,column:49}},"645":{start:{line:3310,column:23},end:{line:3310,column:27}},"646":{start:{line:3311,column:22},end:{line:3313,column:14}},"647":{start:{line:3312,column:16},end:{line:3312,column:36}},"648":{start:{line:3315,column:12},end:{line:3315,column:23}},"649":{start:{line:3334,column:12},end:{line:3334,column:49}},"650":{start:{line:3336,column:23},end:{line:3336,column:27}},"651":{start:{line:3337,column:22},end:{line:3339,column:14}},"652":{start:{line:3338,column:16},end:{line:3338,column:36}},"653":{start:{line:3341,column:12},end:{line:3341,column:23}},"654":{start:{line:3361,column:12},end:{line:3361,column:49}},"655":{start:{line:3362,column:12},end:{line:3362,column:34}},"656":{start:{line:3363,column:12},end:{line:3363,column:67}},"657":{start:{line:3365,column:23},end:{line:3365,column:27}},"658":{start:{line:3366,column:12},end:{line:3373,column:15}},"659":{start:{line:3367,column:16},end:{line:3372,column:17}},"660":{start:{line:3368,column:20},end:{line:3368,column:34}},"661":{start:{line:3371,column:20},end:{line:3371,column:56}},"662":{start:{line:3392,column:12},end:{line:3392,column:49}},"663":{start:{line:3394,column:23},end:{line:3394,column:27}},"664":{start:{line:3395,column:22},end:{line:3397,column:14}},"665":{start:{line:3396,column:16},end:{line:3396,column:36}},"666":{start:{line:3399,column:12},end:{line:3399,column:23}},"667":{start:{line:3414,column:12},end:{line:3414,column:74}},"668":{start:{line:3433,column:12},end:{line:3433,column:49}},"669":{start:{line:3435,column:23},end:{line:3435,column:27}},"670":{start:{line:3436,column:22},end:{line:3438,column:14}},"671":{start:{line:3437,column:16},end:{line:3437,column:36}},"672":{start:{line:3440,column:12},end:{line:3440,column:23}},"673":{start:{line:3460,column:12},end:{line:3460,column:49}},"674":{start:{line:3461,column:12},end:{line:3461,column:34}},"675":{start:{line:3462,column:12},end:{line:3462,column:67}},"676":{start:{line:3464,column:23},end:{line:3464,column:27}},"677":{start:{line:3465,column:12},end:{line:3472,column:15}},"678":{start:{line:3466,column:16},end:{line:3471,column:17}},"679":{start:{line:3467,column:20},end:{line:3467,column:34}},"680":{start:{line:3470,column:20},end:{line:3470,column:56}},"681":{start:{line:3497,column:12},end:{line:3497,column:49}},"682":{start:{line:3498,column:12},end:{line:3498,column:34}},"683":{start:{line:3499,column:12},end:{line:3499,column:67}},"684":{start:{line:3501,column:23},end:{line:3501,column:27}},"685":{start:{line:3502,column:12},end:{line:3509,column:15}},"686":{start:{line:3503,column:16},end:{line:3508,column:17}},"687":{start:{line:3504,column:20},end:{line:3504,column:34}},"688":{start:{line:3507,column:20},end:{line:3507,column:56}},"689":{start:{line:3528,column:12},end:{line:3528,column:49}},"690":{start:{line:3530,column:23},end:{line:3530,column:27}},"691":{start:{line:3531,column:12},end:{line:3538,column:15}},"692":{start:{line:3532,column:16},end:{line:3537,column:17}},"693":{start:{line:3533,column:20},end:{line:3533,column:34}},"694":{start:{line:3536,column:20},end:{line:3536,column:56}},"695":{start:{line:3558,column:12},end:{line:3558,column:49}},"696":{start:{line:3560,column:23},end:{line:3560,column:27}},"697":{start:{line:3561,column:22},end:{line:3563,column:14}},"698":{start:{line:3562,column:16},end:{line:3562,column:36}},"699":{start:{line:3565,column:12},end:{line:3565,column:23}},"700":{start:{line:3586,column:12},end:{line:3586,column:49}},"701":{start:{line:3588,column:23},end:{line:3588,column:27}},"702":{start:{line:3589,column:22},end:{line:3591,column:14}},"703":{start:{line:3590,column:16},end:{line:3590,column:36}},"704":{start:{line:3593,column:12},end:{line:3593,column:23}},"705":{start:{line:3613,column:12},end:{line:3613,column:49}},"706":{start:{line:3615,column:23},end:{line:3615,column:27}},"707":{start:{line:3616,column:12},end:{line:3623,column:15}},"708":{start:{line:3617,column:16},end:{line:3622,column:17}},"709":{start:{line:3618,column:20},end:{line:3618,column:34}},"710":{start:{line:3621,column:20},end:{line:3621,column:56}},"711":{start:{line:3643,column:12},end:{line:3643,column:49}},"712":{start:{line:3645,column:23},end:{line:3645,column:27}},"713":{start:{line:3646,column:12},end:{line:3653,column:15}},"714":{start:{line:3647,column:16},end:{line:3652,column:17}},"715":{start:{line:3648,column:20},end:{line:3648,column:34}},"716":{start:{line:3651,column:20},end:{line:3651,column:56}},"717":{start:{line:3673,column:12},end:{line:3673,column:49}},"718":{start:{line:3675,column:23},end:{line:3675,column:27}},"719":{start:{line:3676,column:22},end:{line:3678,column:14}},"720":{start:{line:3677,column:16},end:{line:3677,column:36}},"721":{start:{line:3680,column:12},end:{line:3680,column:23}},"722":{start:{line:3700,column:25},end:{line:3700,column:46}},"723":{start:{line:3702,column:12},end:{line:3706,column:13}},"724":{start:{line:3703,column:16},end:{line:3705,column:18}},"725":{start:{line:3709,column:16},end:{line:3712,column:32}},"726":{start:{line:3715,column:12},end:{line:3715,column:63}},"727":{start:{line:3716,column:12},end:{line:3716,column:69}},"728":{start:{line:3717,column:12},end:{line:3717,column:61}},"729":{start:{line:3718,column:12},end:{line:3718,column:65}},"730":{start:{line:3719,column:12},end:{line:3719,column:63}},"731":{start:{line:3722,column:12},end:{line:3722,column:71}},"732":{start:{line:3723,column:12},end:{line:3723,column:89}},"733":{start:{line:3725,column:23},end:{line:3725,column:27}},"734":{start:{line:3726,column:31},end:{line:3726,column:36}},"735":{start:{line:3727,column:30},end:{line:3727,column:35}},"736":{start:{line:3728,column:12},end:{line:3786,column:14}},"737":{start:{line:3729,column:29},end:{line:3729,column:49}},"738":{start:{line:3731,column:20},end:{line:3779,column:23}},"739":{start:{line:3732,column:24},end:{line:3735,column:25}},"740":{start:{line:3733,column:28},end:{line:3733,column:47}},"741":{start:{line:3734,column:28},end:{line:3734,column:35}},"742":{start:{line:3737,column:44},end:{line:3737,column:74}},"743":{start:{line:3738,column:39},end:{line:3738,column:96}},"744":{start:{line:3739,column:24},end:{line:3776,column:25}},"745":{start:{line:3740,column:28},end:{line:3740,column:53}},"746":{start:{line:3743,column:28},end:{line:3756,column:29}},"747":{start:{line:3744,column:32},end:{line:3744,column:53}},"748":{start:{line:3745,column:32},end:{line:3745,column:52}},"749":{start:{line:3749,column:32},end:{line:3755,column:33}},"750":{start:{line:3750,column:36},end:{line:3750,column:70}},"751":{start:{line:3752,column:36},end:{line:3752,column:55}},"752":{start:{line:3753,column:36},end:{line:3753,column:52}},"753":{start:{line:3754,column:36},end:{line:3754,column:43}},"754":{start:{line:3758,column:28},end:{line:3758,column:52}},"755":{start:{line:3760,column:40},end:{line:3760,column:56}},"756":{start:{line:3762,column:28},end:{line:3775,column:29}},"757":{start:{line:3763,column:32},end:{line:3763,column:52}},"758":{start:{line:3765,column:32},end:{line:3765,column:51}},"759":{start:{line:3766,column:32},end:{line:3766,column:48}},"760":{start:{line:3767,column:32},end:{line:3767,column:39}},"761":{start:{line:3769,column:33},end:{line:3775,column:29}},"762":{start:{line:3770,column:32},end:{line:3770,column:54}},"763":{start:{line:3772,column:32},end:{line:3772,column:51}},"764":{start:{line:3773,column:32},end:{line:3773,column:48}},"765":{start:{line:3774,column:32},end:{line:3774,column:39}},"766":{start:{line:3778,column:24},end:{line:3778,column:59}},"767":{start:{line:3782,column:20},end:{line:3784,column:21}},"768":{start:{line:3783,column:24},end:{line:3783,column:45}},"769":{start:{line:3805,column:12},end:{line:3805,column:49}},"770":{start:{line:3807,column:23},end:{line:3807,column:27}},"771":{start:{line:3808,column:22},end:{line:3810,column:14}},"772":{start:{line:3809,column:16},end:{line:3809,column:36}},"773":{start:{line:3812,column:12},end:{line:3812,column:23}},"774":{start:{line:3824,column:4},end:{line:4015,column:7}},"775":{start:{line:3831,column:12},end:{line:3831,column:30}},"776":{start:{line:3843,column:22},end:{line:3843,column:39}},"777":{start:{line:3844,column:34},end:{line:3844,column:70}},"778":{start:{line:3845,column:12},end:{line:3845,column:68}},"779":{start:{line:3862,column:12},end:{line:3862,column:57}},"780":{start:{line:3866,column:12},end:{line:3866,column:60}},"781":{start:{line:3889,column:12},end:{line:3893,column:13}},"782":{start:{line:3890,column:16},end:{line:3890,column:34}},"783":{start:{line:3891,column:16},end:{line:3891,column:31}},"784":{start:{line:3892,column:16},end:{line:3892,column:38}},"785":{start:{line:3895,column:12},end:{line:3895,column:49}},"786":{start:{line:3896,column:12},end:{line:3896,column:34}},"787":{start:{line:3897,column:12},end:{line:3897,column:34}},"788":{start:{line:3899,column:12},end:{line:3901,column:13}},"789":{start:{line:3900,column:16},end:{line:3900,column:104}},"790":{start:{line:3903,column:12},end:{line:3906,column:13}},"791":{start:{line:3904,column:16},end:{line:3904,column:72}},"792":{start:{line:3905,column:16},end:{line:3905,column:23}},"793":{start:{line:3907,column:23},end:{line:3907,column:27}},"794":{start:{line:3908,column:12},end:{line:3916,column:15}},"795":{start:{line:3909,column:16},end:{line:3915,column:17}},"796":{start:{line:3910,column:20},end:{line:3910,column:34}},"797":{start:{line:3913,column:30},end:{line:3913,column:91}},"798":{start:{line:3914,column:20},end:{line:3914,column:40}},"799":{start:{line:3945,column:12},end:{line:3945,column:56}},"800":{start:{line:3972,column:12},end:{line:3976,column:13}},"801":{start:{line:3973,column:16},end:{line:3973,column:34}},"802":{start:{line:3974,column:16},end:{line:3974,column:31}},"803":{start:{line:3975,column:16},end:{line:3975,column:38}},"804":{start:{line:3978,column:12},end:{line:3978,column:49}},"805":{start:{line:3979,column:12},end:{line:3979,column:34}},"806":{start:{line:3980,column:12},end:{line:3980,column:34}},"807":{start:{line:3981,column:12},end:{line:3981,column:41}},"808":{start:{line:3983,column:12},end:{line:3985,column:13}},"809":{start:{line:3984,column:16},end:{line:3984,column:72}},"810":{start:{line:3987,column:29},end:{line:3987,column:62}},"811":{start:{line:3989,column:23},end:{line:3989,column:41}},"812":{start:{line:3990,column:25},end:{line:3990,column:31}},"813":{start:{line:3991,column:26},end:{line:3991,column:28}},"814":{start:{line:3992,column:23},end:{line:3992,column:29}},"815":{start:{line:3993,column:22},end:{line:3993,column:47}},"816":{start:{line:3994,column:23},end:{line:3994,column:27}},"817":{start:{line:3996,column:22},end:{line:4011,column:13}},"818":{start:{line:4004,column:20},end:{line:4009,column:21}},"819":{start:{line:4005,column:24},end:{line:4005,column:38}},"820":{start:{line:4008,column:24},end:{line:4008,column:54}},"821":{start:{line:4013,column:12},end:{line:4013,column:23}},"822":{start:{line:4047,column:4},end:{line:4164,column:7}},"823":{start:{line:4072,column:12},end:{line:4072,column:32}},"824":{start:{line:4073,column:12},end:{line:4073,column:44}},"825":{start:{line:4075,column:12},end:{line:4075,column:50}},"826":{start:{line:4076,column:12},end:{line:4076,column:52}},"827":{start:{line:4077,column:12},end:{line:4077,column:45}},"828":{start:{line:4078,column:12},end:{line:4078,column:51}},"829":{start:{line:4079,column:12},end:{line:4079,column:49}},"830":{start:{line:4080,column:12},end:{line:4080,column:47}},"831":{start:{line:4081,column:12},end:{line:4081,column:49}},"832":{start:{line:4082,column:12},end:{line:4082,column:56}},"833":{start:{line:4083,column:12},end:{line:4083,column:52}},"834":{start:{line:4084,column:12},end:{line:4084,column:57}},"835":{start:{line:4085,column:12},end:{line:4085,column:72}},"836":{start:{line:4096,column:12},end:{line:4096,column:42}},"837":{start:{line:4107,column:12},end:{line:4107,column:42}},"838":{start:{line:4118,column:12},end:{line:4118,column:45}},"839":{start:{line:4129,column:12},end:{line:4129,column:47}},"840":{start:{line:4140,column:12},end:{line:4140,column:46}},"841":{start:{line:4151,column:12},end:{line:4151,column:40}},"842":{start:{line:4162,column:12},end:{line:4162,column:43}},"843":{start:{line:4177,column:4},end:{line:4199,column:7}},"844":{start:{line:4192,column:12},end:{line:4192,column:32}},"845":{start:{line:4193,column:12},end:{line:4193,column:44}},"846":{start:{line:4195,column:12},end:{line:4195,column:40}},"847":{start:{line:4196,column:12},end:{line:4196,column:50}},"848":{start:{line:4197,column:12},end:{line:4197,column:65}},"849":{start:{line:4232,column:4},end:{line:4350,column:7}},"850":{start:{line:4258,column:12},end:{line:4258,column:32}},"851":{start:{line:4259,column:12},end:{line:4259,column:44}},"852":{start:{line:4261,column:12},end:{line:4261,column:54}},"853":{start:{line:4262,column:12},end:{line:4262,column:56}},"854":{start:{line:4263,column:12},end:{line:4263,column:56}},"855":{start:{line:4264,column:12},end:{line:4264,column:49}},"856":{start:{line:4265,column:12},end:{line:4265,column:57}},"857":{start:{line:4266,column:12},end:{line:4266,column:72}},"858":{start:{line:4268,column:12},end:{line:4268,column:35}},"859":{start:{line:4269,column:12},end:{line:4271,column:13}},"860":{start:{line:4269,column:25},end:{line:4269,column:26}},"861":{start:{line:4270,column:16},end:{line:4270,column:116}},"862":{start:{line:4273,column:12},end:{line:4275,column:13}},"863":{start:{line:4274,column:16},end:{line:4274,column:51}},"864":{start:{line:4276,column:12},end:{line:4278,column:13}},"865":{start:{line:4277,column:16},end:{line:4277,column:51}},"866":{start:{line:4279,column:12},end:{line:4282,column:13}},"867":{start:{line:4280,column:16},end:{line:4280,column:51}},"868":{start:{line:4281,column:16},end:{line:4281,column:64}},"869":{start:{line:4293,column:12},end:{line:4293,column:50}},"870":{start:{line:4304,column:12},end:{line:4304,column:35}},"871":{start:{line:4315,column:12},end:{line:4315,column:42}},"872":{start:{line:4326,column:12},end:{line:4326,column:40}},"873":{start:{line:4337,column:12},end:{line:4337,column:39}},"874":{start:{line:4348,column:12},end:{line:4348,column:41}},"875":{start:{line:4366,column:4},end:{line:4413,column:7}},"876":{start:{line:4383,column:12},end:{line:4383,column:35}},"877":{start:{line:4384,column:12},end:{line:4384,column:39}},"878":{start:{line:4385,column:12},end:{line:4385,column:58}},"879":{start:{line:4386,column:12},end:{line:4386,column:72}},"880":{start:{line:4387,column:12},end:{line:4387,column:50}},"881":{start:{line:4388,column:12},end:{line:4388,column:60}},"882":{start:{line:4390,column:12},end:{line:4390,column:50}},"883":{start:{line:4402,column:12},end:{line:4405,column:13}},"884":{start:{line:4403,column:16},end:{line:4403,column:32}},"885":{start:{line:4404,column:16},end:{line:4404,column:26}},"886":{start:{line:4406,column:12},end:{line:4408,column:13}},"887":{start:{line:4407,column:16},end:{line:4407,column:26}},"888":{start:{line:4411,column:12},end:{line:4411,column:87}},"889":{start:{line:4524,column:4},end:{line:5169,column:7}},"890":{start:{line:4544,column:12},end:{line:4544,column:51}},"891":{start:{line:4545,column:12},end:{line:4545,column:30}},"892":{start:{line:4546,column:12},end:{line:4546,column:27}},"893":{start:{line:4547,column:12},end:{line:4547,column:30}},"894":{start:{line:4548,column:12},end:{line:4548,column:28}},"895":{start:{line:4550,column:12},end:{line:4551,column:54}},"896":{start:{line:4553,column:12},end:{line:4553,column:52}},"897":{start:{line:4554,column:12},end:{line:4554,column:54}},"898":{start:{line:4570,column:12},end:{line:4572,column:13}},"899":{start:{line:4571,column:16},end:{line:4571,column:30}},"900":{start:{line:4574,column:12},end:{line:4576,column:13}},"901":{start:{line:4575,column:16},end:{line:4575,column:81}},"902":{start:{line:4578,column:12},end:{line:4578,column:54}},"903":{start:{line:4579,column:12},end:{line:4579,column:24}},"904":{start:{line:4595,column:12},end:{line:4597,column:13}},"905":{start:{line:4596,column:16},end:{line:4596,column:77}},"906":{start:{line:4598,column:12},end:{line:4604,column:13}},"907":{start:{line:4599,column:16},end:{line:4603,column:70}},"908":{start:{line:4605,column:12},end:{line:4610,column:13}},"909":{start:{line:4606,column:16},end:{line:4609,column:59}},"910":{start:{line:4612,column:22},end:{line:4616,column:13}},"911":{start:{line:4618,column:12},end:{line:4623,column:13}},"912":{start:{line:4619,column:16},end:{line:4622,column:18}},"913":{start:{line:4624,column:12},end:{line:4624,column:35}},"914":{start:{line:4626,column:12},end:{line:4626,column:24}},"915":{start:{line:4643,column:12},end:{line:4645,column:13}},"916":{start:{line:4644,column:16},end:{line:4644,column:83}},"917":{start:{line:4647,column:20},end:{line:4647,column:63}},"918":{start:{line:4649,column:12},end:{line:4651,column:13}},"919":{start:{line:4650,column:16},end:{line:4650,column:112}},"920":{start:{line:4653,column:12},end:{line:4656,column:13}},"921":{start:{line:4654,column:16},end:{line:4655,column:35}},"922":{start:{line:4658,column:12},end:{line:4661,column:13}},"923":{start:{line:4659,column:16},end:{line:4660,column:35}},"924":{start:{line:4663,column:12},end:{line:4665,column:13}},"925":{start:{line:4664,column:16},end:{line:4664,column:120}},"926":{start:{line:4667,column:25},end:{line:4676,column:13}},"927":{start:{line:4678,column:12},end:{line:4678,column:84}},"928":{start:{line:4679,column:12},end:{line:4679,column:38}},"929":{start:{line:4681,column:12},end:{line:4681,column:24}},"930":{start:{line:4694,column:12},end:{line:4696,column:13}},"931":{start:{line:4695,column:16},end:{line:4695,column:67}},"932":{start:{line:4697,column:20},end:{line:4697,column:63}},"933":{start:{line:4698,column:12},end:{line:4700,column:13}},"934":{start:{line:4699,column:16},end:{line:4699,column:96}},"935":{start:{line:4702,column:22},end:{line:4707,column:13}},"936":{start:{line:4709,column:12},end:{line:4711,column:13}},"937":{start:{line:4710,column:16},end:{line:4710,column:36}},"938":{start:{line:4713,column:12},end:{line:4713,column:32}},"939":{start:{line:4715,column:12},end:{line:4715,column:24}},"940":{start:{line:4738,column:12},end:{line:4740,column:13}},"941":{start:{line:4739,column:16},end:{line:4739,column:63}},"942":{start:{line:4741,column:20},end:{line:4741,column:59}},"943":{start:{line:4742,column:12},end:{line:4744,column:13}},"944":{start:{line:4743,column:16},end:{line:4743,column:86}},"945":{start:{line:4745,column:31},end:{line:4745,column:33}},"946":{start:{line:4746,column:12},end:{line:4748,column:13}},"947":{start:{line:4747,column:16},end:{line:4747,column:50}},"948":{start:{line:4749,column:12},end:{line:4751,column:13}},"949":{start:{line:4750,column:16},end:{line:4750,column:46}},"950":{start:{line:4752,column:12},end:{line:4754,column:13}},"951":{start:{line:4753,column:16},end:{line:4753,column:48}},"952":{start:{line:4755,column:12},end:{line:4757,column:13}},"953":{start:{line:4756,column:16},end:{line:4756,column:56}},"954":{start:{line:4759,column:12},end:{line:4766,column:15}},"955":{start:{line:4768,column:12},end:{line:4768,column:24}},"956":{start:{line:4783,column:12},end:{line:4785,column:13}},"957":{start:{line:4784,column:16},end:{line:4784,column:63}},"958":{start:{line:4786,column:20},end:{line:4786,column:59}},"959":{start:{line:4787,column:12},end:{line:4789,column:13}},"960":{start:{line:4788,column:16},end:{line:4788,column:87}},"961":{start:{line:4791,column:12},end:{line:4798,column:15}},"962":{start:{line:4800,column:12},end:{line:4800,column:24}},"963":{start:{line:4814,column:12},end:{line:4816,column:13}},"964":{start:{line:4815,column:16},end:{line:4815,column:63}},"965":{start:{line:4817,column:20},end:{line:4817,column:59}},"966":{start:{line:4818,column:12},end:{line:4820,column:13}},"967":{start:{line:4819,column:16},end:{line:4819,column:89}},"968":{start:{line:4821,column:12},end:{line:4823,column:13}},"969":{start:{line:4822,column:16},end:{line:4822,column:120}},"970":{start:{line:4825,column:12},end:{line:4831,column:15}},"971":{start:{line:4833,column:12},end:{line:4833,column:24}},"972":{start:{line:4846,column:12},end:{line:4848,column:13}},"973":{start:{line:4847,column:16},end:{line:4847,column:67}},"974":{start:{line:4849,column:20},end:{line:4849,column:63}},"975":{start:{line:4850,column:12},end:{line:4852,column:13}},"976":{start:{line:4851,column:16},end:{line:4851,column:96}},"977":{start:{line:4854,column:22},end:{line:4858,column:13}},"978":{start:{line:4860,column:12},end:{line:4862,column:13}},"979":{start:{line:4861,column:16},end:{line:4861,column:36}},"980":{start:{line:4864,column:12},end:{line:4864,column:35}},"981":{start:{line:4866,column:12},end:{line:4866,column:24}},"982":{start:{line:4883,column:12},end:{line:4885,column:13}},"983":{start:{line:4884,column:16},end:{line:4884,column:67}},"984":{start:{line:4886,column:20},end:{line:4886,column:63}},"985":{start:{line:4887,column:12},end:{line:4889,column:13}},"986":{start:{line:4888,column:16},end:{line:4888,column:86}},"987":{start:{line:4893,column:32},end:{line:4893,column:34}},"988":{start:{line:4894,column:12},end:{line:4896,column:13}},"989":{start:{line:4895,column:16},end:{line:4895,column:51}},"990":{start:{line:4897,column:12},end:{line:4899,column:13}},"991":{start:{line:4898,column:16},end:{line:4898,column:47}},"992":{start:{line:4900,column:12},end:{line:4902,column:13}},"993":{start:{line:4901,column:16},end:{line:4901,column:49}},"994":{start:{line:4903,column:12},end:{line:4905,column:13}},"995":{start:{line:4904,column:16},end:{line:4904,column:57}},"996":{start:{line:4907,column:12},end:{line:4913,column:15}},"997":{start:{line:4915,column:12},end:{line:4915,column:24}},"998":{start:{line:4929,column:12},end:{line:4931,column:13}},"999":{start:{line:4930,column:16},end:{line:4930,column:67}},"1000":{start:{line:4932,column:20},end:{line:4932,column:63}},"1001":{start:{line:4933,column:12},end:{line:4935,column:13}},"1002":{start:{line:4934,column:16},end:{line:4934,column:87}},"1003":{start:{line:4937,column:12},end:{line:4943,column:15}},"1004":{start:{line:4945,column:12},end:{line:4945,column:24}},"1005":{start:{line:4958,column:12},end:{line:4960,column:13}},"1006":{start:{line:4959,column:16},end:{line:4959,column:63}},"1007":{start:{line:4961,column:20},end:{line:4961,column:59}},"1008":{start:{line:4962,column:12},end:{line:4964,column:13}},"1009":{start:{line:4963,column:16},end:{line:4963,column:89}},"1010":{start:{line:4965,column:12},end:{line:4967,column:13}},"1011":{start:{line:4966,column:16},end:{line:4966,column:120}},"1012":{start:{line:4969,column:12},end:{line:4974,column:15}},"1013":{start:{line:4976,column:12},end:{line:4976,column:24}},"1014":{start:{line:4990,column:12},end:{line:4992,column:13}},"1015":{start:{line:4991,column:16},end:{line:4991,column:67}},"1016":{start:{line:4994,column:20},end:{line:4994,column:63}},"1017":{start:{line:4995,column:12},end:{line:5047,column:13}},"1018":{start:{line:5004,column:16},end:{line:5006,column:35}},"1019":{start:{line:5008,column:17},end:{line:5047,column:13}},"1020":{start:{line:5020,column:16},end:{line:5023,column:22}},"1021":{start:{line:5025,column:17},end:{line:5047,column:13}},"1022":{start:{line:5034,column:16},end:{line:5037,column:22}},"1023":{start:{line:5039,column:17},end:{line:5047,column:13}},"1024":{start:{line:5042,column:16},end:{line:5043,column:46}},"1025":{start:{line:5045,column:17},end:{line:5047,column:13}},"1026":{start:{line:5046,column:16},end:{line:5046,column:84}},"1027":{start:{line:5049,column:12},end:{line:5056,column:15}},"1028":{start:{line:5058,column:12},end:{line:5058,column:24}},"1029":{start:{line:5069,column:12},end:{line:5076,column:14}},"1030":{start:{line:5102,column:22},end:{line:5102,column:60}},"1031":{start:{line:5104,column:23},end:{line:5106,column:13}},"1032":{start:{line:5108,column:12},end:{line:5110,column:13}},"1033":{start:{line:5109,column:16},end:{line:5109,column:60}},"1034":{start:{line:5112,column:12},end:{line:5124,column:15}},"1035":{start:{line:5113,column:16},end:{line:5116,column:17}},"1036":{start:{line:5114,column:20},end:{line:5114,column:77}},"1037":{start:{line:5115,column:20},end:{line:5115,column:27}},"1038":{start:{line:5118,column:16},end:{line:5123,column:17}},"1039":{start:{line:5119,column:20},end:{line:5119,column:88}},"1040":{start:{line:5122,column:20},end:{line:5122,column:96}},"1041":{start:{line:5154,column:12},end:{line:5157,column:13}},"1042":{start:{line:5155,column:16},end:{line:5155,column:32}},"1043":{start:{line:5156,column:16},end:{line:5156,column:26}},"1044":{start:{line:5158,column:12},end:{line:5158,column:30}},"1045":{start:{line:5160,column:12},end:{line:5167,column:15}},"1046":{start:{line:5161,column:16},end:{line:5166,column:17}},"1047":{start:{line:5162,column:20},end:{line:5162,column:46}},"1048":{start:{line:5165,column:20},end:{line:5165,column:68}},"1049":{start:{line:5197,column:4},end:{line:5515,column:7}},"1050":{start:{line:5225,column:12},end:{line:5225,column:32}},"1051":{start:{line:5226,column:12},end:{line:5226,column:44}},"1052":{start:{line:5228,column:12},end:{line:5228,column:58}},"1053":{start:{line:5229,column:12},end:{line:5229,column:59}},"1054":{start:{line:5230,column:12},end:{line:5230,column:60}},"1055":{start:{line:5231,column:12},end:{line:5231,column:59}},"1056":{start:{line:5232,column:12},end:{line:5232,column:67}},"1057":{start:{line:5235,column:12},end:{line:5237,column:13}},"1058":{start:{line:5236,column:16},end:{line:5236,column:57}},"1059":{start:{line:5238,column:12},end:{line:5240,column:13}},"1060":{start:{line:5239,column:16},end:{line:5239,column:59}},"1061":{start:{line:5241,column:12},end:{line:5243,column:13}},"1062":{start:{line:5242,column:16},end:{line:5242,column:60}},"1063":{start:{line:5244,column:12},end:{line:5246,column:13}},"1064":{start:{line:5245,column:16},end:{line:5245,column:58}},"1065":{start:{line:5249,column:12},end:{line:5251,column:13}},"1066":{start:{line:5250,column:16},end:{line:5250,column:51}},"1067":{start:{line:5254,column:12},end:{line:5254,column:29}},"1068":{start:{line:5255,column:12},end:{line:5257,column:13}},"1069":{start:{line:5255,column:25},end:{line:5255,column:26}},"1070":{start:{line:5256,column:16},end:{line:5256,column:98}},"1071":{start:{line:5260,column:12},end:{line:5260,column:34}},"1072":{start:{line:5261,column:12},end:{line:5263,column:13}},"1073":{start:{line:5261,column:25},end:{line:5261,column:26}},"1074":{start:{line:5262,column:16},end:{line:5262,column:90}},"1075":{start:{line:5266,column:12},end:{line:5266,column:35}},"1076":{start:{line:5267,column:12},end:{line:5269,column:13}},"1077":{start:{line:5267,column:25},end:{line:5267,column:26}},"1078":{start:{line:5268,column:16},end:{line:5268,column:126}},"1079":{start:{line:5280,column:12},end:{line:5280,column:55}},"1080":{start:{line:5291,column:12},end:{line:5291,column:52}},"1081":{start:{line:5303,column:12},end:{line:5303,column:44}},"1082":{start:{line:5317,column:12},end:{line:5317,column:78}},"1083":{start:{line:5332,column:33},end:{line:5332,column:35}},"1084":{start:{line:5334,column:12},end:{line:5338,column:13}},"1085":{start:{line:5335,column:16},end:{line:5337,column:17}},"1086":{start:{line:5336,column:20},end:{line:5336,column:55}},"1087":{start:{line:5340,column:35},end:{line:5340,column:58}},"1088":{start:{line:5341,column:12},end:{line:5345,column:13}},"1089":{start:{line:5342,column:16},end:{line:5344,column:17}},"1090":{start:{line:5343,column:20},end:{line:5343,column:62}},"1091":{start:{line:5347,column:12},end:{line:5347,column:34}},"1092":{start:{line:5361,column:12},end:{line:5361,column:49}},"1093":{start:{line:5374,column:25},end:{line:5374,column:27}},"1094":{start:{line:5376,column:23},end:{line:5376,column:44}},"1095":{start:{line:5377,column:31},end:{line:5377,column:48}},"1096":{start:{line:5378,column:12},end:{line:5383,column:13}},"1097":{start:{line:5378,column:25},end:{line:5378,column:26}},"1098":{start:{line:5379,column:34},end:{line:5379,column:55}},"1099":{start:{line:5380,column:16},end:{line:5382,column:17}},"1100":{start:{line:5380,column:29},end:{line:5380,column:30}},"1101":{start:{line:5381,column:20},end:{line:5381,column:124}},"1102":{start:{line:5384,column:12},end:{line:5384,column:26}},"1103":{start:{line:5397,column:12},end:{line:5397,column:56}},"1104":{start:{line:5410,column:12},end:{line:5410,column:67}},"1105":{start:{line:5423,column:12},end:{line:5423,column:50}},"1106":{start:{line:5454,column:12},end:{line:5457,column:13}},"1107":{start:{line:5455,column:16},end:{line:5455,column:40}},"1108":{start:{line:5456,column:16},end:{line:5456,column:41}},"1109":{start:{line:5459,column:24},end:{line:5459,column:106}},"1110":{start:{line:5460,column:23},end:{line:5460,column:72}},"1111":{start:{line:5462,column:12},end:{line:5462,column:65}},"1112":{start:{line:5485,column:24},end:{line:5485,column:90}},"1113":{start:{line:5487,column:12},end:{line:5487,column:69}},"1114":{start:{line:5488,column:12},end:{line:5488,column:81}},"1115":{start:{line:5501,column:12},end:{line:5501,column:64}},"1116":{start:{line:5513,column:12},end:{line:5513,column:53}},"1117":{start:{line:5526,column:4},end:{line:5679,column:7}},"1118":{start:{line:5533,column:12},end:{line:5533,column:74}},"1119":{start:{line:5556,column:12},end:{line:5559,column:13}},"1120":{start:{line:5557,column:16},end:{line:5557,column:34}},"1121":{start:{line:5558,column:16},end:{line:5558,column:31}},"1122":{start:{line:5561,column:12},end:{line:5561,column:29}},"1123":{start:{line:5562,column:12},end:{line:5562,column:57}},"1124":{start:{line:5564,column:12},end:{line:5564,column:77}},"1125":{start:{line:5565,column:12},end:{line:5568,column:13}},"1126":{start:{line:5567,column:16},end:{line:5567,column:72}},"1127":{start:{line:5572,column:12},end:{line:5574,column:13}},"1128":{start:{line:5573,column:16},end:{line:5573,column:35}},"1129":{start:{line:5576,column:38},end:{line:5576,column:75}},"1130":{start:{line:5578,column:12},end:{line:5578,column:66}},"1131":{start:{line:5579,column:12},end:{line:5579,column:63}},"1132":{start:{line:5580,column:12},end:{line:5580,column:63}},"1133":{start:{line:5583,column:23},end:{line:5583,column:50}},"1134":{start:{line:5584,column:12},end:{line:5584,column:30}},"1135":{start:{line:5585,column:12},end:{line:5587,column:13}},"1136":{start:{line:5585,column:25},end:{line:5585,column:26}},"1137":{start:{line:5586,column:16},end:{line:5586,column:75}},"1138":{start:{line:5589,column:12},end:{line:5589,column:56}},"1139":{start:{line:5590,column:12},end:{line:5590,column:56}},"1140":{start:{line:5601,column:12},end:{line:5601,column:47}},"1141":{start:{line:5613,column:12},end:{line:5617,column:13}},"1142":{start:{line:5613,column:25},end:{line:5613,column:26}},"1143":{start:{line:5614,column:16},end:{line:5616,column:17}},"1144":{start:{line:5615,column:20},end:{line:5615,column:43}},"1145":{start:{line:5618,column:12},end:{line:5618,column:24}},"1146":{start:{line:5629,column:12},end:{line:5629,column:58}},"1147":{start:{line:5645,column:12},end:{line:5648,column:13}},"1148":{start:{line:5646,column:16},end:{line:5646,column:33}},"1149":{start:{line:5647,column:16},end:{line:5647,column:27}},"1150":{start:{line:5649,column:12},end:{line:5649,column:49}},"1151":{start:{line:5651,column:12},end:{line:5654,column:13}},"1152":{start:{line:5652,column:16},end:{line:5652,column:93}},"1153":{start:{line:5653,column:16},end:{line:5653,column:23}},"1154":{start:{line:5655,column:12},end:{line:5658,column:13}},"1155":{start:{line:5656,column:16},end:{line:5656,column:81}},"1156":{start:{line:5657,column:16},end:{line:5657,column:23}},"1157":{start:{line:5660,column:31},end:{line:5666,column:13}},"1158":{start:{line:5668,column:23},end:{line:5668,column:27}},"1159":{start:{line:5669,column:12},end:{line:5677,column:15}},"1160":{start:{line:5670,column:16},end:{line:5676,column:17}},"1161":{start:{line:5671,column:20},end:{line:5671,column:40}},"1162":{start:{line:5674,column:45},end:{line:5674,column:98}},"1163":{start:{line:5675,column:20},end:{line:5675,column:142}},"1164":{start:{line:5690,column:4},end:{line:5768,column:7}},"1165":{start:{line:5697,column:12},end:{line:5697,column:36}},"1166":{start:{line:5713,column:12},end:{line:5713,column:40}},"1167":{start:{line:5714,column:12},end:{line:5714,column:57}},"1168":{start:{line:5715,column:12},end:{line:5715,column:56}},"1169":{start:{line:5733,column:12},end:{line:5736,column:13}},"1170":{start:{line:5734,column:16},end:{line:5734,column:34}},"1171":{start:{line:5735,column:16},end:{line:5735,column:28}},"1172":{start:{line:5738,column:12},end:{line:5738,column:34}},"1173":{start:{line:5739,column:12},end:{line:5739,column:48}},"1174":{start:{line:5740,column:12},end:{line:5740,column:43}},"1175":{start:{line:5742,column:23},end:{line:5742,column:27}},"1176":{start:{line:5743,column:12},end:{line:5751,column:15}},"1177":{start:{line:5744,column:16},end:{line:5750,column:17}},"1178":{start:{line:5745,column:20},end:{line:5745,column:34}},"1179":{start:{line:5748,column:36},end:{line:5748,column:137}},"1180":{start:{line:5749,column:20},end:{line:5749,column:46}},"1181":{start:{line:5765,column:34},end:{line:5765,column:70}},"1182":{start:{line:5766,column:12},end:{line:5766,column:88}},"1183":{start:{line:5772,column:4},end:{line:5802,column:7}},"1184":{start:{line:5774,column:12},end:{line:5774,column:34}},"1185":{start:{line:5776,column:12},end:{line:5776,column:38}},"1186":{start:{line:5777,column:12},end:{line:5777,column:50}},"1187":{start:{line:5778,column:12},end:{line:5778,column:29}},"1188":{start:{line:5783,column:12},end:{line:5783,column:49}},"1189":{start:{line:5785,column:23},end:{line:5785,column:27}},"1190":{start:{line:5786,column:25},end:{line:5789,column:13}},"1191":{start:{line:5790,column:12},end:{line:5800,column:15}},"1192":{start:{line:5791,column:16},end:{line:5799,column:17}},"1193":{start:{line:5792,column:20},end:{line:5792,column:34}},"1194":{start:{line:5795,column:38},end:{line:5795,column:76}},"1195":{start:{line:5796,column:20},end:{line:5796,column:47}},"1196":{start:{line:5798,column:20},end:{line:5798,column:60}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:16,column:1},end:{line:16,column:2}},loc:{start:{line:16,column:12},end:{line:5803,column:1}},line:16},"1":{name:"(anonymous_1)",decl:{start:{line:38,column:14},end:{line:38,column:15}},loc:{start:{line:38,column:25},end:{line:40,column:9}},line:38},"2":{name:"(anonymous_2)",decl:{start:{line:72,column:14},end:{line:72,column:15}},loc:{start:{line:72,column:25},end:{line:88,column:9}},line:72},"3":{name:"(anonymous_3)",decl:{start:{line:105,column:20},end:{line:105,column:21}},loc:{start:{line:105,column:41},end:{line:117,column:9}},line:105},"4":{name:"(anonymous_4)",decl:{start:{line:135,column:14},end:{line:135,column:15}},loc:{start:{line:135,column:25},end:{line:137,column:9}},line:135},"5":{name:"(anonymous_5)",decl:{start:{line:163,column:24},end:{line:163,column:25}},loc:{start:{line:163,column:44},end:{line:165,column:9}},line:163},"6":{name:"(anonymous_6)",decl:{start:{line:191,column:17},end:{line:191,column:18}},loc:{start:{line:191,column:37},end:{line:193,column:9}},line:191},"7":{name:"(anonymous_7)",decl:{start:{line:217,column:23},end:{line:217,column:24}},loc:{start:{line:217,column:43},end:{line:219,column:9}},line:217},"8":{name:"(anonymous_8)",decl:{start:{line:243,column:26},end:{line:243,column:27}},loc:{start:{line:243,column:46},end:{line:245,column:9}},line:243},"9":{name:"(anonymous_9)",decl:{start:{line:270,column:26},end:{line:270,column:27}},loc:{start:{line:270,column:46},end:{line:272,column:9}},line:270},"10":{name:"(anonymous_10)",decl:{start:{line:299,column:14},end:{line:299,column:15}},loc:{start:{line:299,column:34},end:{line:301,column:9}},line:299},"11":{name:"(anonymous_11)",decl:{start:{line:311,column:20},end:{line:311,column:21}},loc:{start:{line:311,column:40},end:{line:313,column:9}},line:311},"12":{name:"(anonymous_12)",decl:{start:{line:336,column:15},end:{line:336,column:16}},loc:{start:{line:336,column:26},end:{line:338,column:9}},line:336},"13":{name:"(anonymous_13)",decl:{start:{line:365,column:15},end:{line:365,column:16}},loc:{start:{line:365,column:35},end:{line:367,column:9}},line:365},"14":{name:"(anonymous_14)",decl:{start:{line:396,column:16},end:{line:396,column:17}},loc:{start:{line:396,column:61},end:{line:404,column:9}},line:396},"15":{name:"(anonymous_15)",decl:{start:{line:419,column:16},end:{line:419,column:17}},loc:{start:{line:419,column:51},end:{line:426,column:9}},line:419},"16":{name:"(anonymous_16)",decl:{start:{line:452,column:23},end:{line:452,column:24}},loc:{start:{line:452,column:68},end:{line:460,column:9}},line:452},"17":{name:"(anonymous_17)",decl:{start:{line:477,column:21},end:{line:477,column:22}},loc:{start:{line:477,column:40},end:{line:500,column:9}},line:477},"18":{name:"(anonymous_18)",decl:{start:{line:478,column:35},end:{line:478,column:36}},loc:{start:{line:478,column:46},end:{line:478,column:48}},line:478},"19":{name:"(anonymous_19)",decl:{start:{line:481,column:54},end:{line:481,column:55}},loc:{start:{line:481,column:78},end:{line:497,column:13}},line:481},"20":{name:"(anonymous_20)",decl:{start:{line:488,column:31},end:{line:488,column:32}},loc:{start:{line:488,column:42},end:{line:495,column:21}},line:488},"21":{name:"(anonymous_21)",decl:{start:{line:516,column:20},end:{line:516,column:21}},loc:{start:{line:516,column:39},end:{line:521,column:9}},line:516},"22":{name:"(anonymous_22)",decl:{start:{line:517,column:35},end:{line:517,column:36}},loc:{start:{line:517,column:46},end:{line:517,column:48}},line:517},"23":{name:"(anonymous_23)",decl:{start:{line:543,column:15},end:{line:543,column:16}},loc:{start:{line:543,column:49},end:{line:562,column:9}},line:543},"24":{name:"(anonymous_24)",decl:{start:{line:549,column:35},end:{line:549,column:36}},loc:{start:{line:549,column:46},end:{line:549,column:48}},line:549},"25":{name:"(anonymous_25)",decl:{start:{line:554,column:50},end:{line:554,column:51}},loc:{start:{line:554,column:74},end:{line:561,column:13}},line:554},"26":{name:"(anonymous_26)",decl:{start:{line:580,column:19},end:{line:580,column:20}},loc:{start:{line:580,column:53},end:{line:601,column:9}},line:580},"27":{name:"(anonymous_27)",decl:{start:{line:586,column:35},end:{line:586,column:36}},loc:{start:{line:586,column:46},end:{line:586,column:48}},line:586},"28":{name:"(anonymous_28)",decl:{start:{line:592,column:53},end:{line:592,column:54}},loc:{start:{line:592,column:77},end:{line:600,column:13}},line:592},"29":{name:"(anonymous_29)",decl:{start:{line:624,column:13},end:{line:624,column:14}},loc:{start:{line:624,column:47},end:{line:663,column:9}},line:624},"30":{name:"(anonymous_30)",decl:{start:{line:630,column:35},end:{line:630,column:36}},loc:{start:{line:630,column:46},end:{line:630,column:48}},line:630},"31":{name:"(anonymous_31)",decl:{start:{line:652,column:16},end:{line:652,column:17}},loc:{start:{line:652,column:40},end:{line:659,column:17}},line:652},"32":{name:"(anonymous_32)",decl:{start:{line:685,column:14},end:{line:685,column:15}},loc:{start:{line:685,column:47},end:{line:703,column:9}},line:685},"33":{name:"(anonymous_33)",decl:{start:{line:721,column:13},end:{line:721,column:14}},loc:{start:{line:721,column:49},end:{line:735,column:9}},line:721},"34":{name:"(anonymous_34)",decl:{start:{line:737,column:16},end:{line:737,column:17}},loc:{start:{line:737,column:42},end:{line:750,column:9}},line:737},"35":{name:"(anonymous_35)",decl:{start:{line:768,column:14},end:{line:768,column:15}},loc:{start:{line:768,column:50},end:{line:782,column:9}},line:768},"36":{name:"(anonymous_36)",decl:{start:{line:800,column:13},end:{line:800,column:14}},loc:{start:{line:800,column:49},end:{line:814,column:9}},line:800},"37":{name:"(anonymous_37)",decl:{start:{line:843,column:14},end:{line:843,column:15}},loc:{start:{line:843,column:49},end:{line:858,column:9}},line:843},"38":{name:"(anonymous_38)",decl:{start:{line:865,column:14},end:{line:865,column:15}},loc:{start:{line:865,column:25},end:{line:867,column:9}},line:865},"39":{name:"(anonymous_39)",decl:{start:{line:877,column:15},end:{line:877,column:16}},loc:{start:{line:877,column:36},end:{line:880,column:9}},line:877},"40":{name:"(anonymous_40)",decl:{start:{line:891,column:15},end:{line:891,column:16}},loc:{start:{line:891,column:34},end:{line:893,column:9}},line:891},"41":{name:"(anonymous_41)",decl:{start:{line:902,column:20},end:{line:902,column:21}},loc:{start:{line:902,column:31},end:{line:904,column:9}},line:902},"42":{name:"(anonymous_42)",decl:{start:{line:913,column:15},end:{line:913,column:16}},loc:{start:{line:913,column:26},end:{line:915,column:9}},line:913},"43":{name:"(anonymous_43)",decl:{start:{line:953,column:14},end:{line:953,column:15}},loc:{start:{line:953,column:49},end:{line:977,column:9}},line:953},"44":{name:"(anonymous_44)",decl:{start:{line:987,column:15},end:{line:987,column:16}},loc:{start:{line:987,column:36},end:{line:1009,column:9}},line:987},"45":{name:"(anonymous_45)",decl:{start:{line:1019,column:16},end:{line:1019,column:17}},loc:{start:{line:1019,column:27},end:{line:1021,column:9}},line:1019},"46":{name:"(anonymous_46)",decl:{start:{line:1031,column:13},end:{line:1031,column:14}},loc:{start:{line:1031,column:24},end:{line:1033,column:9}},line:1031},"47":{name:"(anonymous_47)",decl:{start:{line:1043,column:15},end:{line:1043,column:16}},loc:{start:{line:1043,column:26},end:{line:1045,column:9}},line:1043},"48":{name:"(anonymous_48)",decl:{start:{line:1054,column:16},end:{line:1054,column:17}},loc:{start:{line:1054,column:27},end:{line:1056,column:9}},line:1054},"49":{name:"(anonymous_49)",decl:{start:{line:1065,column:17},end:{line:1065,column:18}},loc:{start:{line:1065,column:28},end:{line:1067,column:9}},line:1065},"50":{name:"(anonymous_50)",decl:{start:{line:1076,column:19},end:{line:1076,column:20}},loc:{start:{line:1076,column:30},end:{line:1078,column:9}},line:1076},"51":{name:"(anonymous_51)",decl:{start:{line:1095,column:15},end:{line:1095,column:16}},loc:{start:{line:1095,column:43},end:{line:1114,column:9}},line:1095},"52":{name:"(anonymous_52)",decl:{start:{line:1100,column:35},end:{line:1100,column:36}},loc:{start:{line:1100,column:46},end:{line:1100,column:48}},line:1100},"53":{name:"(anonymous_53)",decl:{start:{line:1105,column:41},end:{line:1105,column:42}},loc:{start:{line:1105,column:65},end:{line:1113,column:13}},line:1105},"54":{name:"(anonymous_54)",decl:{start:{line:1124,column:16},end:{line:1124,column:17}},loc:{start:{line:1124,column:35},end:{line:1131,column:9}},line:1124},"55":{name:"(anonymous_55)",decl:{start:{line:1125,column:35},end:{line:1125,column:36}},loc:{start:{line:1125,column:46},end:{line:1125,column:48}},line:1125},"56":{name:"(anonymous_56)",decl:{start:{line:1128,column:36},end:{line:1128,column:37}},loc:{start:{line:1128,column:50},end:{line:1130,column:13}},line:1128},"57":{name:"(anonymous_57)",decl:{start:{line:1142,column:16},end:{line:1142,column:17}},loc:{start:{line:1142,column:42},end:{line:1171,column:9}},line:1142},"58":{name:"(anonymous_58)",decl:{start:{line:1143,column:35},end:{line:1143,column:36}},loc:{start:{line:1143,column:46},end:{line:1143,column:48}},line:1143},"59":{name:"(anonymous_59)",decl:{start:{line:1150,column:43},end:{line:1150,column:44}},loc:{start:{line:1150,column:67},end:{line:1168,column:13}},line:1150},"60":{name:"(anonymous_60)",decl:{start:{line:1156,column:31},end:{line:1156,column:32}},loc:{start:{line:1156,column:42},end:{line:1163,column:21}},line:1156},"61":{name:"(anonymous_61)",decl:{start:{line:1181,column:17},end:{line:1181,column:18}},loc:{start:{line:1181,column:36},end:{line:1193,column:9}},line:1181},"62":{name:"(anonymous_62)",decl:{start:{line:1182,column:35},end:{line:1182,column:36}},loc:{start:{line:1182,column:46},end:{line:1182,column:48}},line:1182},"63":{name:"(anonymous_63)",decl:{start:{line:1185,column:37},end:{line:1185,column:38}},loc:{start:{line:1185,column:61},end:{line:1192,column:13}},line:1185},"64":{name:"(anonymous_64)",decl:{start:{line:1203,column:16},end:{line:1203,column:17}},loc:{start:{line:1203,column:35},end:{line:1215,column:9}},line:1203},"65":{name:"(anonymous_65)",decl:{start:{line:1204,column:35},end:{line:1204,column:36}},loc:{start:{line:1204,column:46},end:{line:1204,column:48}},line:1204},"66":{name:"(anonymous_66)",decl:{start:{line:1207,column:36},end:{line:1207,column:37}},loc:{start:{line:1207,column:60},end:{line:1214,column:13}},line:1207},"67":{name:"(anonymous_67)",decl:{start:{line:1225,column:16},end:{line:1225,column:17}},loc:{start:{line:1225,column:35},end:{line:1237,column:9}},line:1225},"68":{name:"(anonymous_68)",decl:{start:{line:1226,column:35},end:{line:1226,column:36}},loc:{start:{line:1226,column:46},end:{line:1226,column:48}},line:1226},"69":{name:"(anonymous_69)",decl:{start:{line:1229,column:37},end:{line:1229,column:38}},loc:{start:{line:1229,column:61},end:{line:1236,column:13}},line:1229},"70":{name:"(anonymous_70)",decl:{start:{line:1272,column:14},end:{line:1272,column:15}},loc:{start:{line:1272,column:49},end:{line:1290,column:9}},line:1272},"71":{name:"(anonymous_71)",decl:{start:{line:1300,column:27},end:{line:1300,column:28}},loc:{start:{line:1300,column:43},end:{line:1302,column:9}},line:1300},"72":{name:"(anonymous_72)",decl:{start:{line:1313,column:15},end:{line:1313,column:16}},loc:{start:{line:1313,column:36},end:{line:1337,column:9}},line:1313},"73":{name:"(anonymous_73)",decl:{start:{line:1347,column:15},end:{line:1347,column:16}},loc:{start:{line:1347,column:26},end:{line:1349,column:9}},line:1347},"74":{name:"(anonymous_74)",decl:{start:{line:1358,column:16},end:{line:1358,column:17}},loc:{start:{line:1358,column:27},end:{line:1360,column:9}},line:1358},"75":{name:"(anonymous_75)",decl:{start:{line:1369,column:17},end:{line:1369,column:18}},loc:{start:{line:1369,column:28},end:{line:1371,column:9}},line:1369},"76":{name:"(anonymous_76)",decl:{start:{line:1388,column:15},end:{line:1388,column:16}},loc:{start:{line:1388,column:43},end:{line:1412,column:9}},line:1388},"77":{name:"(anonymous_77)",decl:{start:{line:1393,column:35},end:{line:1393,column:36}},loc:{start:{line:1393,column:46},end:{line:1393,column:48}},line:1393},"78":{name:"(anonymous_78)",decl:{start:{line:1401,column:44},end:{line:1401,column:45}},loc:{start:{line:1401,column:68},end:{line:1409,column:13}},line:1401},"79":{name:"(anonymous_79)",decl:{start:{line:1414,column:18},end:{line:1414,column:19}},loc:{start:{line:1414,column:42},end:{line:1425,column:9}},line:1414},"80":{name:"(anonymous_80)",decl:{start:{line:1448,column:14},end:{line:1448,column:15}},loc:{start:{line:1448,column:38},end:{line:1505,column:9}},line:1448},"81":{name:"(anonymous_81)",decl:{start:{line:1524,column:16},end:{line:1524,column:17}},loc:{start:{line:1524,column:43},end:{line:1557,column:9}},line:1524},"82":{name:"(anonymous_82)",decl:{start:{line:1525,column:35},end:{line:1525,column:36}},loc:{start:{line:1525,column:46},end:{line:1525,column:48}},line:1525},"83":{name:"(anonymous_83)",decl:{start:{line:1527,column:44},end:{line:1527,column:45}},loc:{start:{line:1527,column:68},end:{line:1554,column:13}},line:1527},"84":{name:"(anonymous_84)",decl:{start:{line:1541,column:37},end:{line:1541,column:38}},loc:{start:{line:1541,column:48},end:{line:1548,column:25}},line:1541},"85":{name:"(anonymous_85)",decl:{start:{line:1574,column:14},end:{line:1574,column:15}},loc:{start:{line:1574,column:33},end:{line:1578,column:9}},line:1574},"86":{name:"(anonymous_86)",decl:{start:{line:1575,column:35},end:{line:1575,column:36}},loc:{start:{line:1575,column:46},end:{line:1575,column:48}},line:1575},"87":{name:"(anonymous_87)",decl:{start:{line:1595,column:14},end:{line:1595,column:15}},loc:{start:{line:1595,column:25},end:{line:1597,column:9}},line:1595},"88":{name:"(anonymous_88)",decl:{start:{line:1613,column:14},end:{line:1613,column:15}},loc:{start:{line:1613,column:49},end:{line:1621,column:9}},line:1613},"89":{name:"(anonymous_89)",decl:{start:{line:1636,column:20},end:{line:1636,column:21}},loc:{start:{line:1636,column:31},end:{line:1638,column:9}},line:1636},"90":{name:"(anonymous_90)",decl:{start:{line:1656,column:21},end:{line:1656,column:22}},loc:{start:{line:1656,column:40},end:{line:1665,column:9}},line:1656},"91":{name:"(anonymous_91)",decl:{start:{line:1657,column:35},end:{line:1657,column:36}},loc:{start:{line:1657,column:46},end:{line:1657,column:48}},line:1657},"92":{name:"(anonymous_92)",decl:{start:{line:1660,column:51},end:{line:1660,column:52}},loc:{start:{line:1660,column:65},end:{line:1662,column:13}},line:1660},"93":{name:"(anonymous_93)",decl:{start:{line:1688,column:18},end:{line:1688,column:19}},loc:{start:{line:1688,column:46},end:{line:1711,column:9}},line:1688},"94":{name:"(anonymous_94)",decl:{start:{line:1694,column:35},end:{line:1694,column:36}},loc:{start:{line:1694,column:46},end:{line:1694,column:48}},line:1694},"95":{name:"(anonymous_95)",decl:{start:{line:1698,column:53},end:{line:1698,column:54}},loc:{start:{line:1698,column:77},end:{line:1708,column:13}},line:1698},"96":{name:"(anonymous_96)",decl:{start:{line:1725,column:25},end:{line:1725,column:26}},loc:{start:{line:1725,column:36},end:{line:1727,column:9}},line:1725},"97":{name:"(anonymous_97)",decl:{start:{line:1748,column:17},end:{line:1748,column:18}},loc:{start:{line:1748,column:45},end:{line:1777,column:9}},line:1748},"98":{name:"(anonymous_98)",decl:{start:{line:1754,column:35},end:{line:1754,column:36}},loc:{start:{line:1754,column:46},end:{line:1754,column:48}},line:1754},"99":{name:"(anonymous_99)",decl:{start:{line:1758,column:48},end:{line:1758,column:49}},loc:{start:{line:1758,column:72},end:{line:1776,column:13}},line:1758},"100":{name:"(anonymous_100)",decl:{start:{line:1794,column:22},end:{line:1794,column:23}},loc:{start:{line:1794,column:41},end:{line:1801,column:9}},line:1794},"101":{name:"(anonymous_101)",decl:{start:{line:1795,column:35},end:{line:1795,column:36}},loc:{start:{line:1795,column:46},end:{line:1795,column:48}},line:1795},"102":{name:"(anonymous_102)",decl:{start:{line:1798,column:44},end:{line:1798,column:45}},loc:{start:{line:1798,column:68},end:{line:1800,column:13}},line:1798},"103":{name:"(anonymous_103)",decl:{start:{line:1815,column:16},end:{line:1815,column:17}},loc:{start:{line:1815,column:43},end:{line:1842,column:9}},line:1815},"104":{name:"(anonymous_104)",decl:{start:{line:1820,column:37},end:{line:1820,column:38}},loc:{start:{line:1820,column:59},end:{line:1835,column:17}},line:1820},"105":{name:"(anonymous_105)",decl:{start:{line:1826,column:52},end:{line:1826,column:53}},loc:{start:{line:1826,column:63},end:{line:1833,column:25}},line:1826},"106":{name:"(anonymous_106)",decl:{start:{line:1860,column:14},end:{line:1860,column:15}},loc:{start:{line:1860,column:25},end:{line:1862,column:9}},line:1860},"107":{name:"(anonymous_107)",decl:{start:{line:1872,column:27},end:{line:1872,column:28}},loc:{start:{line:1872,column:43},end:{line:1875,column:9}},line:1872},"108":{name:"(anonymous_108)",decl:{start:{line:1890,column:14},end:{line:1890,column:15}},loc:{start:{line:1890,column:43},end:{line:1892,column:9}},line:1890},"109":{name:"(anonymous_109)",decl:{start:{line:1909,column:14},end:{line:1909,column:15}},loc:{start:{line:1909,column:26},end:{line:1911,column:9}},line:1909},"110":{name:"(anonymous_110)",decl:{start:{line:1927,column:14},end:{line:1927,column:15}},loc:{start:{line:1927,column:50},end:{line:1930,column:9}},line:1927},"111":{name:"(anonymous_111)",decl:{start:{line:1956,column:14},end:{line:1956,column:15}},loc:{start:{line:1956,column:25},end:{line:1958,column:9}},line:1956},"112":{name:"(anonymous_112)",decl:{start:{line:1970,column:27},end:{line:1970,column:28}},loc:{start:{line:1970,column:43},end:{line:1973,column:9}},line:1970},"113":{name:"(anonymous_113)",decl:{start:{line:1988,column:14},end:{line:1988,column:15}},loc:{start:{line:1988,column:43},end:{line:1990,column:9}},line:1988},"114":{name:"(anonymous_114)",decl:{start:{line:2008,column:14},end:{line:2008,column:15}},loc:{start:{line:2008,column:25},end:{line:2010,column:9}},line:2008},"115":{name:"(anonymous_115)",decl:{start:{line:2020,column:17},end:{line:2020,column:18}},loc:{start:{line:2020,column:28},end:{line:2022,column:9}},line:2020},"116":{name:"(anonymous_116)",decl:{start:{line:2030,column:19},end:{line:2030,column:20}},loc:{start:{line:2030,column:30},end:{line:2032,column:9}},line:2030},"117":{name:"(anonymous_117)",decl:{start:{line:2043,column:22},end:{line:2043,column:23}},loc:{start:{line:2043,column:33},end:{line:2046,column:9}},line:2043},"118":{name:"(anonymous_118)",decl:{start:{line:2056,column:24},end:{line:2056,column:25}},loc:{start:{line:2056,column:35},end:{line:2058,column:9}},line:2056},"119":{name:"(anonymous_119)",decl:{start:{line:2066,column:25},end:{line:2066,column:26}},loc:{start:{line:2066,column:36},end:{line:2068,column:9}},line:2066},"120":{name:"(anonymous_120)",decl:{start:{line:2077,column:18},end:{line:2077,column:19}},loc:{start:{line:2077,column:29},end:{line:2079,column:9}},line:2077},"121":{name:"(anonymous_121)",decl:{start:{line:2087,column:13},end:{line:2087,column:14}},loc:{start:{line:2087,column:24},end:{line:2089,column:9}},line:2087},"122":{name:"(anonymous_122)",decl:{start:{line:2097,column:21},end:{line:2097,column:22}},loc:{start:{line:2097,column:32},end:{line:2099,column:9}},line:2097},"123":{name:"(anonymous_123)",decl:{start:{line:2109,column:29},end:{line:2109,column:30}},loc:{start:{line:2109,column:40},end:{line:2111,column:9}},line:2109},"124":{name:"(anonymous_124)",decl:{start:{line:2121,column:29},end:{line:2121,column:30}},loc:{start:{line:2121,column:40},end:{line:2123,column:9}},line:2121},"125":{name:"(anonymous_125)",decl:{start:{line:2139,column:14},end:{line:2139,column:15}},loc:{start:{line:2139,column:49},end:{line:2142,column:9}},line:2139},"126":{name:"(anonymous_126)",decl:{start:{line:2160,column:14},end:{line:2160,column:15}},loc:{start:{line:2160,column:25},end:{line:2162,column:9}},line:2160},"127":{name:"(anonymous_127)",decl:{start:{line:2172,column:15},end:{line:2172,column:16}},loc:{start:{line:2172,column:26},end:{line:2174,column:9}},line:2172},"128":{name:"(anonymous_128)",decl:{start:{line:2193,column:14},end:{line:2193,column:15}},loc:{start:{line:2193,column:42},end:{line:2221,column:9}},line:2193},"129":{name:"(anonymous_129)",decl:{start:{line:2199,column:35},end:{line:2199,column:36}},loc:{start:{line:2199,column:46},end:{line:2199,column:48}},line:2199},"130":{name:"(anonymous_130)",decl:{start:{line:2203,column:41},end:{line:2203,column:42}},loc:{start:{line:2203,column:65},end:{line:2220,column:13}},line:2203},"131":{name:"(anonymous_131)",decl:{start:{line:2237,column:14},end:{line:2237,column:15}},loc:{start:{line:2237,column:49},end:{line:2242,column:9}},line:2237},"132":{name:"(anonymous_132)",decl:{start:{line:2261,column:14},end:{line:2261,column:15}},loc:{start:{line:2261,column:25},end:{line:2263,column:9}},line:2261},"133":{name:"(anonymous_133)",decl:{start:{line:2273,column:27},end:{line:2273,column:28}},loc:{start:{line:2273,column:43},end:{line:2276,column:9}},line:2273},"134":{name:"(anonymous_134)",decl:{start:{line:2283,column:16},end:{line:2283,column:17}},loc:{start:{line:2283,column:27},end:{line:2285,column:9}},line:2283},"135":{name:"(anonymous_135)",decl:{start:{line:2300,column:14},end:{line:2300,column:15}},loc:{start:{line:2300,column:43},end:{line:2305,column:9}},line:2300},"136":{name:"(anonymous_136)",decl:{start:{line:2330,column:14},end:{line:2330,column:15}},loc:{start:{line:2330,column:25},end:{line:2332,column:9}},line:2330},"137":{name:"(anonymous_137)",decl:{start:{line:2344,column:14},end:{line:2344,column:15}},loc:{start:{line:2344,column:38},end:{line:2350,column:9}},line:2344},"138":{name:"(anonymous_138)",decl:{start:{line:2367,column:19},end:{line:2367,column:20}},loc:{start:{line:2367,column:38},end:{line:2379,column:9}},line:2367},"139":{name:"(anonymous_139)",decl:{start:{line:2368,column:35},end:{line:2368,column:36}},loc:{start:{line:2368,column:46},end:{line:2368,column:48}},line:2368},"140":{name:"(anonymous_140)",decl:{start:{line:2371,column:41},end:{line:2371,column:42}},loc:{start:{line:2371,column:65},end:{line:2378,column:13}},line:2371},"141":{name:"(anonymous_141)",decl:{start:{line:2396,column:20},end:{line:2396,column:21}},loc:{start:{line:2396,column:39},end:{line:2408,column:9}},line:2396},"142":{name:"(anonymous_142)",decl:{start:{line:2397,column:35},end:{line:2397,column:36}},loc:{start:{line:2397,column:46},end:{line:2397,column:48}},line:2397},"143":{name:"(anonymous_143)",decl:{start:{line:2400,column:42},end:{line:2400,column:43}},loc:{start:{line:2400,column:66},end:{line:2407,column:13}},line:2400},"144":{name:"(anonymous_144)",decl:{start:{line:2434,column:14},end:{line:2434,column:15}},loc:{start:{line:2434,column:25},end:{line:2436,column:9}},line:2434},"145":{name:"(anonymous_145)",decl:{start:{line:2446,column:27},end:{line:2446,column:28}},loc:{start:{line:2446,column:43},end:{line:2448,column:9}},line:2446},"146":{name:"(anonymous_146)",decl:{start:{line:2459,column:14},end:{line:2459,column:15}},loc:{start:{line:2459,column:32},end:{line:2461,column:9}},line:2459},"147":{name:"(anonymous_147)",decl:{start:{line:2477,column:14},end:{line:2477,column:15}},loc:{start:{line:2477,column:25},end:{line:2479,column:9}},line:2477},"148":{name:"(anonymous_148)",decl:{start:{line:2490,column:14},end:{line:2490,column:15}},loc:{start:{line:2490,column:32},end:{line:2493,column:9}},line:2490},"149":{name:"(anonymous_149)",decl:{start:{line:2510,column:14},end:{line:2510,column:15}},loc:{start:{line:2510,column:25},end:{line:2512,column:9}},line:2510},"150":{name:"(anonymous_150)",decl:{start:{line:2524,column:14},end:{line:2524,column:15}},loc:{start:{line:2524,column:38},end:{line:2527,column:9}},line:2524},"151":{name:"(anonymous_151)",decl:{start:{line:2553,column:14},end:{line:2553,column:15}},loc:{start:{line:2553,column:25},end:{line:2555,column:9}},line:2553},"152":{name:"(anonymous_152)",decl:{start:{line:2565,column:27},end:{line:2565,column:28}},loc:{start:{line:2565,column:43},end:{line:2567,column:9}},line:2565},"153":{name:"(anonymous_153)",decl:{start:{line:2578,column:14},end:{line:2578,column:15}},loc:{start:{line:2578,column:32},end:{line:2580,column:9}},line:2578},"154":{name:"(anonymous_154)",decl:{start:{line:2592,column:16},end:{line:2592,column:17}},loc:{start:{line:2592,column:43},end:{line:2617,column:9}},line:2592},"155":{name:"(anonymous_155)",decl:{start:{line:2593,column:35},end:{line:2593,column:36}},loc:{start:{line:2593,column:46},end:{line:2593,column:48}},line:2593},"156":{name:"(anonymous_156)",decl:{start:{line:2596,column:44},end:{line:2596,column:45}},loc:{start:{line:2596,column:68},end:{line:2614,column:13}},line:2596},"157":{name:"(anonymous_157)",decl:{start:{line:2605,column:33},end:{line:2605,column:34}},loc:{start:{line:2605,column:44},end:{line:2612,column:21}},line:2605},"158":{name:"(anonymous_158)",decl:{start:{line:2634,column:14},end:{line:2634,column:15}},loc:{start:{line:2634,column:25},end:{line:2636,column:9}},line:2634},"159":{name:"(anonymous_159)",decl:{start:{line:2652,column:14},end:{line:2652,column:15}},loc:{start:{line:2652,column:49},end:{line:2655,column:9}},line:2652},"160":{name:"(anonymous_160)",decl:{start:{line:2672,column:14},end:{line:2672,column:15}},loc:{start:{line:2672,column:25},end:{line:2674,column:9}},line:2672},"161":{name:"(anonymous_161)",decl:{start:{line:2684,column:27},end:{line:2684,column:28}},loc:{start:{line:2684,column:43},end:{line:2687,column:9}},line:2684},"162":{name:"(anonymous_162)",decl:{start:{line:2702,column:14},end:{line:2702,column:15}},loc:{start:{line:2702,column:43},end:{line:2704,column:9}},line:2702},"163":{name:"(anonymous_163)",decl:{start:{line:2720,column:14},end:{line:2720,column:15}},loc:{start:{line:2720,column:25},end:{line:2722,column:9}},line:2720},"164":{name:"(anonymous_164)",decl:{start:{line:2738,column:14},end:{line:2738,column:15}},loc:{start:{line:2738,column:49},end:{line:2743,column:9}},line:2738},"165":{name:"(anonymous_165)",decl:{start:{line:2766,column:21},end:{line:2766,column:22}},loc:{start:{line:2766,column:55},end:{line:2782,column:9}},line:2766},"166":{name:"(anonymous_166)",decl:{start:{line:2772,column:35},end:{line:2772,column:36}},loc:{start:{line:2772,column:46},end:{line:2772,column:48}},line:2772},"167":{name:"(anonymous_167)",decl:{start:{line:2779,column:51},end:{line:2779,column:52}},loc:{start:{line:2779,column:73},end:{line:2781,column:13}},line:2779},"168":{name:"(anonymous_168)",decl:{start:{line:2784,column:16},end:{line:2784,column:17}},loc:{start:{line:2784,column:35},end:{line:2791,column:9}},line:2784},"169":{name:"(anonymous_169)",decl:{start:{line:2808,column:14},end:{line:2808,column:15}},loc:{start:{line:2808,column:25},end:{line:2810,column:9}},line:2808},"170":{name:"(anonymous_170)",decl:{start:{line:2820,column:27},end:{line:2820,column:28}},loc:{start:{line:2820,column:43},end:{line:2823,column:9}},line:2820},"171":{name:"(anonymous_171)",decl:{start:{line:2838,column:14},end:{line:2838,column:15}},loc:{start:{line:2838,column:43},end:{line:2840,column:9}},line:2838},"172":{name:"(anonymous_172)",decl:{start:{line:2859,column:16},end:{line:2859,column:17}},loc:{start:{line:2859,column:49},end:{line:2872,column:9}},line:2859},"173":{name:"(anonymous_173)",decl:{start:{line:2889,column:14},end:{line:2889,column:15}},loc:{start:{line:2889,column:25},end:{line:2892,column:9}},line:2889},"174":{name:"(anonymous_174)",decl:{start:{line:2909,column:14},end:{line:2909,column:15}},loc:{start:{line:2909,column:55},end:{line:2913,column:9}},line:2909},"175":{name:"(anonymous_175)",decl:{start:{line:2931,column:14},end:{line:2931,column:15}},loc:{start:{line:2931,column:25},end:{line:2933,column:9}},line:2931},"176":{name:"(anonymous_176)",decl:{start:{line:2945,column:26},end:{line:2945,column:27}},loc:{start:{line:2945,column:37},end:{line:2947,column:9}},line:2945},"177":{name:"(anonymous_177)",decl:{start:{line:2957,column:27},end:{line:2957,column:28}},loc:{start:{line:2957,column:43},end:{line:2960,column:9}},line:2957},"178":{name:"(anonymous_178)",decl:{start:{line:2976,column:14},end:{line:2976,column:15}},loc:{start:{line:2976,column:49},end:{line:2979,column:9}},line:2976},"179":{name:"(anonymous_179)",decl:{start:{line:2998,column:16},end:{line:2998,column:17}},loc:{start:{line:2998,column:55},end:{line:3016,column:9}},line:2998},"180":{name:"(anonymous_180)",decl:{start:{line:3042,column:14},end:{line:3042,column:15}},loc:{start:{line:3042,column:25},end:{line:3044,column:9}},line:3042},"181":{name:"(anonymous_181)",decl:{start:{line:3054,column:27},end:{line:3054,column:28}},loc:{start:{line:3054,column:43},end:{line:3056,column:9}},line:3054},"182":{name:"(anonymous_182)",decl:{start:{line:3071,column:14},end:{line:3071,column:15}},loc:{start:{line:3071,column:43},end:{line:3077,column:9}},line:3071},"183":{name:"(anonymous_183)",decl:{start:{line:3095,column:16},end:{line:3095,column:17}},loc:{start:{line:3095,column:45},end:{line:3123,column:9}},line:3095},"184":{name:"(anonymous_184)",decl:{start:{line:3102,column:35},end:{line:3102,column:36}},loc:{start:{line:3102,column:46},end:{line:3102,column:48}},line:3102},"185":{name:"(anonymous_185)",decl:{start:{line:3105,column:56},end:{line:3105,column:57}},loc:{start:{line:3105,column:80},end:{line:3120,column:13}},line:3105},"186":{name:"(anonymous_186)",decl:{start:{line:3111,column:33},end:{line:3111,column:34}},loc:{start:{line:3111,column:44},end:{line:3118,column:21}},line:3111},"187":{name:"(anonymous_187)",decl:{start:{line:3125,column:23},end:{line:3125,column:24}},loc:{start:{line:3125,column:48},end:{line:3151,column:9}},line:3125},"188":{name:"(anonymous_188)",decl:{start:{line:3133,column:58},end:{line:3133,column:59}},loc:{start:{line:3133,column:63},end:{line:3133,column:82}},line:3133},"189":{name:"(anonymous_189)",decl:{start:{line:3153,column:25},end:{line:3153,column:26}},loc:{start:{line:3153,column:54},end:{line:3169,column:9}},line:3153},"190":{name:"(anonymous_190)",decl:{start:{line:3171,column:19},end:{line:3171,column:20}},loc:{start:{line:3171,column:90},end:{line:3212,column:9}},line:3171},"191":{name:"(anonymous_191)",decl:{start:{line:3172,column:35},end:{line:3172,column:36}},loc:{start:{line:3172,column:46},end:{line:3172,column:48}},line:3172},"192":{name:"(anonymous_192)",decl:{start:{line:3185,column:20},end:{line:3185,column:21}},loc:{start:{line:3185,column:38},end:{line:3185,column:92}},line:3185},"193":{name:"(anonymous_193)",decl:{start:{line:3200,column:55},end:{line:3200,column:56}},loc:{start:{line:3200,column:81},end:{line:3203,column:17}},line:3200},"194":{name:"(anonymous_194)",decl:{start:{line:3207,column:49},end:{line:3207,column:50}},loc:{start:{line:3207,column:73},end:{line:3210,column:17}},line:3207},"195":{name:"(anonymous_195)",decl:{start:{line:3229,column:14},end:{line:3229,column:15}},loc:{start:{line:3229,column:25},end:{line:3231,column:9}},line:3229},"196":{name:"(anonymous_196)",decl:{start:{line:3247,column:14},end:{line:3247,column:15}},loc:{start:{line:3247,column:48},end:{line:3269,column:9}},line:3247},"197":{name:"(anonymous_197)",decl:{start:{line:3286,column:16},end:{line:3286,column:17}},loc:{start:{line:3286,column:35},end:{line:3290,column:9}},line:3286},"198":{name:"(anonymous_198)",decl:{start:{line:3307,column:24},end:{line:3307,column:25}},loc:{start:{line:3307,column:43},end:{line:3316,column:9}},line:3307},"199":{name:"(anonymous_199)",decl:{start:{line:3308,column:35},end:{line:3308,column:36}},loc:{start:{line:3308,column:46},end:{line:3308,column:48}},line:3308},"200":{name:"(anonymous_200)",decl:{start:{line:3311,column:71},end:{line:3311,column:72}},loc:{start:{line:3311,column:85},end:{line:3313,column:13}},line:3311},"201":{name:"(anonymous_201)",decl:{start:{line:3333,column:23},end:{line:3333,column:24}},loc:{start:{line:3333,column:42},end:{line:3342,column:9}},line:3333},"202":{name:"(anonymous_202)",decl:{start:{line:3334,column:35},end:{line:3334,column:36}},loc:{start:{line:3334,column:46},end:{line:3334,column:48}},line:3334},"203":{name:"(anonymous_203)",decl:{start:{line:3337,column:70},end:{line:3337,column:71}},loc:{start:{line:3337,column:84},end:{line:3339,column:13}},line:3337},"204":{name:"(anonymous_204)",decl:{start:{line:3360,column:16},end:{line:3360,column:17}},loc:{start:{line:3360,column:43},end:{line:3374,column:9}},line:3360},"205":{name:"(anonymous_205)",decl:{start:{line:3361,column:35},end:{line:3361,column:36}},loc:{start:{line:3361,column:46},end:{line:3361,column:48}},line:3361},"206":{name:"(anonymous_206)",decl:{start:{line:3366,column:46},end:{line:3366,column:47}},loc:{start:{line:3366,column:70},end:{line:3373,column:13}},line:3366},"207":{name:"(anonymous_207)",decl:{start:{line:3391,column:18},end:{line:3391,column:19}},loc:{start:{line:3391,column:37},end:{line:3400,column:9}},line:3391},"208":{name:"(anonymous_208)",decl:{start:{line:3392,column:35},end:{line:3392,column:36}},loc:{start:{line:3392,column:46},end:{line:3392,column:48}},line:3392},"209":{name:"(anonymous_209)",decl:{start:{line:3395,column:65},end:{line:3395,column:66}},loc:{start:{line:3395,column:79},end:{line:3397,column:13}},line:3395},"210":{name:"(anonymous_210)",decl:{start:{line:3413,column:18},end:{line:3413,column:19}},loc:{start:{line:3413,column:41},end:{line:3415,column:9}},line:3413},"211":{name:"(anonymous_211)",decl:{start:{line:3432,column:15},end:{line:3432,column:16}},loc:{start:{line:3432,column:34},end:{line:3441,column:9}},line:3432},"212":{name:"(anonymous_212)",decl:{start:{line:3433,column:35},end:{line:3433,column:36}},loc:{start:{line:3433,column:46},end:{line:3433,column:48}},line:3433},"213":{name:"(anonymous_213)",decl:{start:{line:3436,column:62},end:{line:3436,column:63}},loc:{start:{line:3436,column:76},end:{line:3438,column:13}},line:3436},"214":{name:"(anonymous_214)",decl:{start:{line:3459,column:17},end:{line:3459,column:18}},loc:{start:{line:3459,column:44},end:{line:3473,column:9}},line:3459},"215":{name:"(anonymous_215)",decl:{start:{line:3460,column:35},end:{line:3460,column:36}},loc:{start:{line:3460,column:46},end:{line:3460,column:48}},line:3460},"216":{name:"(anonymous_216)",decl:{start:{line:3465,column:55},end:{line:3465,column:56}},loc:{start:{line:3465,column:79},end:{line:3472,column:13}},line:3465},"217":{name:"(anonymous_217)",decl:{start:{line:3496,column:17},end:{line:3496,column:18}},loc:{start:{line:3496,column:44},end:{line:3510,column:9}},line:3496},"218":{name:"(anonymous_218)",decl:{start:{line:3497,column:35},end:{line:3497,column:36}},loc:{start:{line:3497,column:46},end:{line:3497,column:48}},line:3497},"219":{name:"(anonymous_219)",decl:{start:{line:3502,column:47},end:{line:3502,column:48}},loc:{start:{line:3502,column:71},end:{line:3509,column:13}},line:3502},"220":{name:"(anonymous_220)",decl:{start:{line:3527,column:19},end:{line:3527,column:20}},loc:{start:{line:3527,column:38},end:{line:3539,column:9}},line:3527},"221":{name:"(anonymous_221)",decl:{start:{line:3528,column:35},end:{line:3528,column:36}},loc:{start:{line:3528,column:46},end:{line:3528,column:48}},line:3528},"222":{name:"(anonymous_222)",decl:{start:{line:3531,column:46},end:{line:3531,column:47}},loc:{start:{line:3531,column:70},end:{line:3538,column:13}},line:3531},"223":{name:"(anonymous_223)",decl:{start:{line:3557,column:21},end:{line:3557,column:22}},loc:{start:{line:3557,column:47},end:{line:3566,column:9}},line:3557},"224":{name:"(anonymous_224)",decl:{start:{line:3558,column:35},end:{line:3558,column:36}},loc:{start:{line:3558,column:46},end:{line:3558,column:48}},line:3558},"225":{name:"(anonymous_225)",decl:{start:{line:3561,column:85},end:{line:3561,column:86}},loc:{start:{line:3561,column:99},end:{line:3563,column:13}},line:3561},"226":{name:"(anonymous_226)",decl:{start:{line:3585,column:16},end:{line:3585,column:17}},loc:{start:{line:3585,column:42},end:{line:3594,column:9}},line:3585},"227":{name:"(anonymous_227)",decl:{start:{line:3586,column:35},end:{line:3586,column:36}},loc:{start:{line:3586,column:46},end:{line:3586,column:48}},line:3586},"228":{name:"(anonymous_228)",decl:{start:{line:3589,column:75},end:{line:3589,column:76}},loc:{start:{line:3589,column:89},end:{line:3591,column:13}},line:3589},"229":{name:"(anonymous_229)",decl:{start:{line:3612,column:17},end:{line:3612,column:18}},loc:{start:{line:3612,column:44},end:{line:3624,column:9}},line:3612},"230":{name:"(anonymous_230)",decl:{start:{line:3613,column:35},end:{line:3613,column:36}},loc:{start:{line:3613,column:46},end:{line:3613,column:48}},line:3613},"231":{name:"(anonymous_231)",decl:{start:{line:3616,column:47},end:{line:3616,column:48}},loc:{start:{line:3616,column:71},end:{line:3623,column:13}},line:3616},"232":{name:"(anonymous_232)",decl:{start:{line:3642,column:18},end:{line:3642,column:19}},loc:{start:{line:3642,column:45},end:{line:3654,column:9}},line:3642},"233":{name:"(anonymous_233)",decl:{start:{line:3643,column:35},end:{line:3643,column:36}},loc:{start:{line:3643,column:46},end:{line:3643,column:48}},line:3643},"234":{name:"(anonymous_234)",decl:{start:{line:3646,column:48},end:{line:3646,column:49}},loc:{start:{line:3646,column:72},end:{line:3653,column:13}},line:3646},"235":{name:"(anonymous_235)",decl:{start:{line:3672,column:15},end:{line:3672,column:16}},loc:{start:{line:3672,column:34},end:{line:3681,column:9}},line:3672},"236":{name:"(anonymous_236)",decl:{start:{line:3673,column:35},end:{line:3673,column:36}},loc:{start:{line:3673,column:46},end:{line:3673,column:48}},line:3673},"237":{name:"(anonymous_237)",decl:{start:{line:3676,column:62},end:{line:3676,column:63}},loc:{start:{line:3676,column:76},end:{line:3678,column:13}},line:3676},"238":{name:"(anonymous_238)",decl:{start:{line:3699,column:15},end:{line:3699,column:16}},loc:{start:{line:3699,column:44},end:{line:3787,column:9}},line:3699},"239":{name:"(anonymous_239)",decl:{start:{line:3715,column:49},end:{line:3715,column:50}},loc:{start:{line:3715,column:60},end:{line:3715,column:62}},line:3715},"240":{name:"(anonymous_240)",decl:{start:{line:3716,column:55},end:{line:3716,column:56}},loc:{start:{line:3716,column:66},end:{line:3716,column:68}},line:3716},"241":{name:"(anonymous_241)",decl:{start:{line:3717,column:47},end:{line:3717,column:48}},loc:{start:{line:3717,column:58},end:{line:3717,column:60}},line:3717},"242":{name:"(anonymous_242)",decl:{start:{line:3718,column:51},end:{line:3718,column:52}},loc:{start:{line:3718,column:62},end:{line:3718,column:64}},line:3718},"243":{name:"(anonymous_243)",decl:{start:{line:3719,column:49},end:{line:3719,column:50}},loc:{start:{line:3719,column:60},end:{line:3719,column:62}},line:3719},"244":{name:"(anonymous_244)",decl:{start:{line:3722,column:57},end:{line:3722,column:58}},loc:{start:{line:3722,column:68},end:{line:3722,column:70}},line:3722},"245":{name:"(anonymous_245)",decl:{start:{line:3723,column:75},end:{line:3723,column:76}},loc:{start:{line:3723,column:86},end:{line:3723,column:88}},line:3723},"246":{name:"(anonymous_246)",decl:{start:{line:3729,column:16},end:{line:3729,column:17}},loc:{start:{line:3729,column:27},end:{line:3729,column:51}},line:3729},"247":{name:"(anonymous_247)",decl:{start:{line:3730,column:16},end:{line:3730,column:17}},loc:{start:{line:3730,column:40},end:{line:3780,column:17}},line:3730},"248":{name:"(anonymous_248)",decl:{start:{line:3731,column:31},end:{line:3731,column:32}},loc:{start:{line:3731,column:50},end:{line:3779,column:21}},line:3731},"249":{name:"(anonymous_249)",decl:{start:{line:3781,column:16},end:{line:3781,column:17}},loc:{start:{line:3781,column:30},end:{line:3785,column:17}},line:3781},"250":{name:"(anonymous_250)",decl:{start:{line:3804,column:17},end:{line:3804,column:18}},loc:{start:{line:3804,column:36},end:{line:3813,column:9}},line:3804},"251":{name:"(anonymous_251)",decl:{start:{line:3805,column:35},end:{line:3805,column:36}},loc:{start:{line:3805,column:46},end:{line:3805,column:48}},line:3805},"252":{name:"(anonymous_252)",decl:{start:{line:3808,column:64},end:{line:3808,column:65}},loc:{start:{line:3808,column:78},end:{line:3810,column:13}},line:3808},"253":{name:"(anonymous_253)",decl:{start:{line:3830,column:14},end:{line:3830,column:15}},loc:{start:{line:3830,column:25},end:{line:3832,column:9}},line:3830},"254":{name:"(anonymous_254)",decl:{start:{line:3842,column:27},end:{line:3842,column:28}},loc:{start:{line:3842,column:43},end:{line:3846,column:9}},line:3842},"255":{name:"(anonymous_255)",decl:{start:{line:3861,column:14},end:{line:3861,column:15}},loc:{start:{line:3861,column:43},end:{line:3867,column:9}},line:3861},"256":{name:"(anonymous_256)",decl:{start:{line:3886,column:16},end:{line:3886,column:17}},loc:{start:{line:3886,column:50},end:{line:3917,column:9}},line:3886},"257":{name:"(anonymous_257)",decl:{start:{line:3895,column:35},end:{line:3895,column:36}},loc:{start:{line:3895,column:46},end:{line:3895,column:48}},line:3895},"258":{name:"(anonymous_258)",decl:{start:{line:3908,column:41},end:{line:3908,column:42}},loc:{start:{line:3908,column:65},end:{line:3916,column:13}},line:3908},"259":{name:"(anonymous_259)",decl:{start:{line:3944,column:16},end:{line:3944,column:17}},loc:{start:{line:3944,column:50},end:{line:3946,column:9}},line:3944},"260":{name:"(anonymous_260)",decl:{start:{line:3969,column:23},end:{line:3969,column:24}},loc:{start:{line:3969,column:57},end:{line:4014,column:9}},line:3969},"261":{name:"(anonymous_261)",decl:{start:{line:3978,column:35},end:{line:3978,column:36}},loc:{start:{line:3978,column:46},end:{line:3978,column:48}},line:3978},"262":{name:"(anonymous_262)",decl:{start:{line:4003,column:16},end:{line:4003,column:17}},loc:{start:{line:4003,column:40},end:{line:4010,column:17}},line:4003},"263":{name:"(anonymous_263)",decl:{start:{line:4071,column:14},end:{line:4071,column:15}},loc:{start:{line:4071,column:30},end:{line:4086,column:9}},line:4071},"264":{name:"(anonymous_264)",decl:{start:{line:4095,column:18},end:{line:4095,column:19}},loc:{start:{line:4095,column:29},end:{line:4097,column:9}},line:4095},"265":{name:"(anonymous_265)",decl:{start:{line:4106,column:18},end:{line:4106,column:19}},loc:{start:{line:4106,column:29},end:{line:4108,column:9}},line:4106},"266":{name:"(anonymous_266)",decl:{start:{line:4117,column:21},end:{line:4117,column:22}},loc:{start:{line:4117,column:32},end:{line:4119,column:9}},line:4117},"267":{name:"(anonymous_267)",decl:{start:{line:4128,column:23},end:{line:4128,column:24}},loc:{start:{line:4128,column:34},end:{line:4130,column:9}},line:4128},"268":{name:"(anonymous_268)",decl:{start:{line:4139,column:22},end:{line:4139,column:23}},loc:{start:{line:4139,column:33},end:{line:4141,column:9}},line:4139},"269":{name:"(anonymous_269)",decl:{start:{line:4150,column:16},end:{line:4150,column:17}},loc:{start:{line:4150,column:27},end:{line:4152,column:9}},line:4150},"270":{name:"(anonymous_270)",decl:{start:{line:4161,column:19},end:{line:4161,column:20}},loc:{start:{line:4161,column:30},end:{line:4163,column:9}},line:4161},"271":{name:"(anonymous_271)",decl:{start:{line:4191,column:14},end:{line:4191,column:15}},loc:{start:{line:4191,column:30},end:{line:4198,column:9}},line:4191},"272":{name:"(anonymous_272)",decl:{start:{line:4257,column:14},end:{line:4257,column:15}},loc:{start:{line:4257,column:30},end:{line:4283,column:9}},line:4257},"273":{name:"(anonymous_273)",decl:{start:{line:4292,column:26},end:{line:4292,column:27}},loc:{start:{line:4292,column:37},end:{line:4294,column:9}},line:4292},"274":{name:"(anonymous_274)",decl:{start:{line:4303,column:20},end:{line:4303,column:21}},loc:{start:{line:4303,column:31},end:{line:4305,column:9}},line:4303},"275":{name:"(anonymous_275)",decl:{start:{line:4314,column:18},end:{line:4314,column:19}},loc:{start:{line:4314,column:29},end:{line:4316,column:9}},line:4314},"276":{name:"(anonymous_276)",decl:{start:{line:4325,column:16},end:{line:4325,column:17}},loc:{start:{line:4325,column:27},end:{line:4327,column:9}},line:4325},"277":{name:"(anonymous_277)",decl:{start:{line:4336,column:15},end:{line:4336,column:16}},loc:{start:{line:4336,column:26},end:{line:4338,column:9}},line:4336},"278":{name:"(anonymous_278)",decl:{start:{line:4347,column:17},end:{line:4347,column:18}},loc:{start:{line:4347,column:28},end:{line:4349,column:9}},line:4347},"279":{name:"(anonymous_279)",decl:{start:{line:4382,column:14},end:{line:4382,column:15}},loc:{start:{line:4382,column:39},end:{line:4391,column:9}},line:4382},"280":{name:"(anonymous_280)",decl:{start:{line:4401,column:13},end:{line:4401,column:14}},loc:{start:{line:4401,column:38},end:{line:4412,column:9}},line:4401},"281":{name:"(anonymous_281)",decl:{start:{line:4543,column:14},end:{line:4543,column:15}},loc:{start:{line:4543,column:40},end:{line:4555,column:9}},line:4543},"282":{name:"(anonymous_282)",decl:{start:{line:4568,column:28},end:{line:4568,column:29}},loc:{start:{line:4568,column:42},end:{line:4580,column:9}},line:4568},"283":{name:"(anonymous_283)",decl:{start:{line:4594,column:19},end:{line:4594,column:20}},loc:{start:{line:4594,column:80},end:{line:4627,column:9}},line:4594},"284":{name:"(anonymous_284)",decl:{start:{line:4642,column:24},end:{line:4642,column:25}},loc:{start:{line:4642,column:96},end:{line:4682,column:9}},line:4642},"285":{name:"(anonymous_285)",decl:{start:{line:4693,column:21},end:{line:4693,column:22}},loc:{start:{line:4693,column:48},end:{line:4716,column:9}},line:4693},"286":{name:"(anonymous_286)",decl:{start:{line:4737,column:26},end:{line:4737,column:27}},loc:{start:{line:4737,column:57},end:{line:4769,column:9}},line:4737},"287":{name:"(anonymous_287)",decl:{start:{line:4782,column:28},end:{line:4782,column:29}},loc:{start:{line:4782,column:88},end:{line:4801,column:9}},line:4782},"288":{name:"(anonymous_288)",decl:{start:{line:4813,column:30},end:{line:4813,column:31}},loc:{start:{line:4813,column:62},end:{line:4834,column:9}},line:4813},"289":{name:"(anonymous_289)",decl:{start:{line:4845,column:24},end:{line:4845,column:25}},loc:{start:{line:4845,column:44},end:{line:4867,column:9}},line:4845},"290":{name:"(anonymous_290)",decl:{start:{line:4882,column:29},end:{line:4882,column:30}},loc:{start:{line:4882,column:57},end:{line:4916,column:9}},line:4882},"291":{name:"(anonymous_291)",decl:{start:{line:4928,column:31},end:{line:4928,column:32}},loc:{start:{line:4928,column:88},end:{line:4946,column:9}},line:4928},"292":{name:"(anonymous_292)",decl:{start:{line:4957,column:33},end:{line:4957,column:34}},loc:{start:{line:4957,column:58},end:{line:4977,column:9}},line:4957},"293":{name:"(anonymous_293)",decl:{start:{line:4989,column:22},end:{line:4989,column:23}},loc:{start:{line:4989,column:64},end:{line:5059,column:9}},line:4989},"294":{name:"(anonymous_294)",decl:{start:{line:5068,column:22},end:{line:5068,column:23}},loc:{start:{line:5068,column:33},end:{line:5077,column:9}},line:5068},"295":{name:"(anonymous_295)",decl:{start:{line:5101,column:15},end:{line:5101,column:16}},loc:{start:{line:5101,column:34},end:{line:5125,column:9}},line:5101},"296":{name:"(anonymous_296)",decl:{start:{line:5112,column:110},end:{line:5112,column:111}},loc:{start:{line:5112,column:134},end:{line:5124,column:13}},line:5112},"297":{name:"(anonymous_297)",decl:{start:{line:5153,column:13},end:{line:5153,column:14}},loc:{start:{line:5153,column:38},end:{line:5168,column:9}},line:5153},"298":{name:"(anonymous_298)",decl:{start:{line:5160,column:23},end:{line:5160,column:24}},loc:{start:{line:5160,column:44},end:{line:5167,column:13}},line:5160},"299":{name:"(anonymous_299)",decl:{start:{line:5224,column:14},end:{line:5224,column:15}},loc:{start:{line:5224,column:47},end:{line:5270,column:9}},line:5224},"300":{name:"(anonymous_300)",decl:{start:{line:5279,column:22},end:{line:5279,column:23}},loc:{start:{line:5279,column:33},end:{line:5281,column:9}},line:5279},"301":{name:"(anonymous_301)",decl:{start:{line:5290,column:27},end:{line:5290,column:28}},loc:{start:{line:5290,column:38},end:{line:5292,column:9}},line:5290},"302":{name:"(anonymous_302)",decl:{start:{line:5302,column:20},end:{line:5302,column:21}},loc:{start:{line:5302,column:31},end:{line:5304,column:9}},line:5302},"303":{name:"(anonymous_303)",decl:{start:{line:5316,column:21},end:{line:5316,column:22}},loc:{start:{line:5316,column:36},end:{line:5318,column:9}},line:5316},"304":{name:"(anonymous_304)",decl:{start:{line:5330,column:19},end:{line:5330,column:20}},loc:{start:{line:5330,column:30},end:{line:5348,column:9}},line:5330},"305":{name:"(anonymous_305)",decl:{start:{line:5360,column:23},end:{line:5360,column:24}},loc:{start:{line:5360,column:34},end:{line:5362,column:9}},line:5360},"306":{name:"(anonymous_306)",decl:{start:{line:5373,column:26},end:{line:5373,column:27}},loc:{start:{line:5373,column:36},end:{line:5385,column:9}},line:5373},"307":{name:"(anonymous_307)",decl:{start:{line:5396,column:30},end:{line:5396,column:31}},loc:{start:{line:5396,column:41},end:{line:5398,column:9}},line:5396},"308":{name:"(anonymous_308)",decl:{start:{line:5409,column:18},end:{line:5409,column:19}},loc:{start:{line:5409,column:38},end:{line:5411,column:9}},line:5409},"309":{name:"(anonymous_309)",decl:{start:{line:5422,column:24},end:{line:5422,column:25}},loc:{start:{line:5422,column:35},end:{line:5424,column:9}},line:5422},"310":{name:"(anonymous_310)",decl:{start:{line:5452,column:36},end:{line:5452,column:37}},loc:{start:{line:5452,column:69},end:{line:5463,column:9}},line:5452},"311":{name:"(anonymous_311)",decl:{start:{line:5484,column:21},end:{line:5484,column:22}},loc:{start:{line:5484,column:61},end:{line:5489,column:9}},line:5484},"312":{name:"(anonymous_312)",decl:{start:{line:5500,column:16},end:{line:5500,column:17}},loc:{start:{line:5500,column:27},end:{line:5502,column:9}},line:5500},"313":{name:"(anonymous_313)",decl:{start:{line:5511,column:34},end:{line:5511,column:35}},loc:{start:{line:5511,column:45},end:{line:5514,column:9}},line:5511},"314":{name:"(anonymous_314)",decl:{start:{line:5532,column:14},end:{line:5532,column:15}},loc:{start:{line:5532,column:25},end:{line:5534,column:9}},line:5532},"315":{name:"(anonymous_315)",decl:{start:{line:5554,column:14},end:{line:5554,column:15}},loc:{start:{line:5554,column:56},end:{line:5591,column:9}},line:5554},"316":{name:"(anonymous_316)",decl:{start:{line:5600,column:23},end:{line:5600,column:24}},loc:{start:{line:5600,column:34},end:{line:5602,column:9}},line:5600},"317":{name:"(anonymous_317)",decl:{start:{line:5612,column:22},end:{line:5612,column:23}},loc:{start:{line:5612,column:37},end:{line:5619,column:9}},line:5612},"318":{name:"(anonymous_318)",decl:{start:{line:5628,column:19},end:{line:5628,column:20}},loc:{start:{line:5628,column:34},end:{line:5630,column:9}},line:5628},"319":{name:"(anonymous_319)",decl:{start:{line:5644,column:16},end:{line:5644,column:17}},loc:{start:{line:5644,column:42},end:{line:5678,column:9}},line:5644},"320":{name:"(anonymous_320)",decl:{start:{line:5649,column:35},end:{line:5649,column:36}},loc:{start:{line:5649,column:46},end:{line:5649,column:48}},line:5649},"321":{name:"(anonymous_321)",decl:{start:{line:5669,column:47},end:{line:5669,column:48}},loc:{start:{line:5669,column:71},end:{line:5677,column:13}},line:5669},"322":{name:"(anonymous_322)",decl:{start:{line:5696,column:14},end:{line:5696,column:15}},loc:{start:{line:5696,column:25},end:{line:5698,column:9}},line:5696},"323":{name:"(anonymous_323)",decl:{start:{line:5712,column:14},end:{line:5712,column:15}},loc:{start:{line:5712,column:43},end:{line:5716,column:9}},line:5712},"324":{name:"(anonymous_324)",decl:{start:{line:5730,column:16},end:{line:5730,column:17}},loc:{start:{line:5730,column:49},end:{line:5752,column:9}},line:5730},"325":{name:"(anonymous_325)",decl:{start:{line:5739,column:35},end:{line:5739,column:36}},loc:{start:{line:5739,column:45},end:{line:5739,column:47}},line:5739},"326":{name:"(anonymous_326)",decl:{start:{line:5743,column:84},end:{line:5743,column:85}},loc:{start:{line:5743,column:108},end:{line:5751,column:13}},line:5743},"327":{name:"(anonymous_327)",decl:{start:{line:5764,column:27},end:{line:5764,column:28}},loc:{start:{line:5764,column:43},end:{line:5767,column:9}},line:5764},"328":{name:"(anonymous_328)",decl:{start:{line:5773,column:14},end:{line:5773,column:15}},loc:{start:{line:5773,column:41},end:{line:5779,column:9}},line:5773},"329":{name:"(anonymous_329)",decl:{start:{line:5782,column:14},end:{line:5782,column:15}},loc:{start:{line:5782,column:33},end:{line:5801,column:9}},line:5782},"330":{name:"(anonymous_330)",decl:{start:{line:5783,column:35},end:{line:5783,column:36}},loc:{start:{line:5783,column:46},end:{line:5783,column:48}},line:5783},"331":{name:"(anonymous_331)",decl:{start:{line:5790,column:42},end:{line:5790,column:43}},loc:{start:{line:5790,column:65},end:{line:5800,column:13}},line:5790}},branchMap:{"0":{loc:{start:{line:26,column:15},end:{line:26,column:30}},type:"binary-expr",locations:[{start:{line:26,column:15},end:{line:26,column:22}},{start:{line:26,column:26},end:{line:26,column:30}}],line:26},"1":{loc:{start:{line:397,column:12},end:{line:400,column:13}},type:"if",locations:[{start:{line:397,column:12},end:{line:400,column:13}},{start:{line:397,column:12},end:{line:400,column:13}}],line:397},"2":{loc:{start:{line:397,column:16},end:{line:397,column:56}},type:"binary-expr",locations:[{start:{line:397,column:16},end:{line:397,column:25}},{start:{line:397,column:29},end:{line:397,column:56}}],line:397},"3":{loc:{start:{line:420,column:12},end:{line:423,column:13}},type:"if",locations:[{start:{line:420,column:12},end:{line:423,column:13}},{start:{line:420,column:12},end:{line:423,column:13}}],line:420},"4":{loc:{start:{line:420,column:16},end:{line:420,column:56}},type:"binary-expr",locations:[{start:{line:420,column:16},end:{line:420,column:25}},{start:{line:420,column:29},end:{line:420,column:56}}],line:420},"5":{loc:{start:{line:453,column:12},end:{line:456,column:13}},type:"if",locations:[{start:{line:453,column:12},end:{line:456,column:13}},{start:{line:453,column:12},end:{line:456,column:13}}],line:453},"6":{loc:{start:{line:453,column:16},end:{line:453,column:56}},type:"binary-expr",locations:[{start:{line:453,column:16},end:{line:453,column:25}},{start:{line:453,column:29},end:{line:453,column:56}}],line:453},"7":{loc:{start:{line:478,column:23},end:{line:478,column:48}},type:"binary-expr",locations:[{start:{line:478,column:23},end:{line:478,column:31}},{start:{line:478,column:35},end:{line:478,column:48}}],line:478},"8":{loc:{start:{line:482,column:16},end:{line:496,column:17}},type:"if",locations:[{start:{line:482,column:16},end:{line:496,column:17}},{start:{line:482,column:16},end:{line:496,column:17}}],line:482},"9":{loc:{start:{line:489,column:24},end:{line:494,column:25}},type:"if",locations:[{start:{line:489,column:24},end:{line:494,column:25}},{start:{line:489,column:24},end:{line:494,column:25}}],line:489},"10":{loc:{start:{line:517,column:23},end:{line:517,column:48}},type:"binary-expr",locations:[{start:{line:517,column:23},end:{line:517,column:31}},{start:{line:517,column:35},end:{line:517,column:48}}],line:517},"11":{loc:{start:{line:544,column:12},end:{line:547,column:13}},type:"if",locations:[{start:{line:544,column:12},end:{line:547,column:13}},{start:{line:544,column:12},end:{line:547,column:13}}],line:544},"12":{loc:{start:{line:544,column:16},end:{line:544,column:53}},type:"binary-expr",locations:[{start:{line:544,column:16},end:{line:544,column:25}},{start:{line:544,column:29},end:{line:544,column:53}}],line:544},"13":{loc:{start:{line:549,column:23},end:{line:549,column:48}},type:"binary-expr",locations:[{start:{line:549,column:23},end:{line:549,column:31}},{start:{line:549,column:35},end:{line:549,column:48}}],line:549},"14":{loc:{start:{line:550,column:21},end:{line:550,column:33}},type:"binary-expr",locations:[{start:{line:550,column:21},end:{line:550,column:27}},{start:{line:550,column:31},end:{line:550,column:33}}],line:550},"15":{loc:{start:{line:555,column:16},end:{line:560,column:17}},type:"if",locations:[{start:{line:555,column:16},end:{line:560,column:17}},{start:{line:555,column:16},end:{line:560,column:17}}],line:555},"16":{loc:{start:{line:581,column:12},end:{line:584,column:13}},type:"if",locations:[{start:{line:581,column:12},end:{line:584,column:13}},{start:{line:581,column:12},end:{line:584,column:13}}],line:581},"17":{loc:{start:{line:581,column:16},end:{line:581,column:52}},type:"binary-expr",locations:[{start:{line:581,column:16},end:{line:581,column:25}},{start:{line:581,column:29},end:{line:581,column:52}}],line:581},"18":{loc:{start:{line:586,column:23},end:{line:586,column:48}},type:"binary-expr",locations:[{start:{line:586,column:23},end:{line:586,column:31}},{start:{line:586,column:35},end:{line:586,column:48}}],line:586},"19":{loc:{start:{line:588,column:23},end:{line:588,column:34}},type:"binary-expr",locations:[{start:{line:588,column:23},end:{line:588,column:28}},{start:{line:588,column:32},end:{line:588,column:34}}],line:588},"20":{loc:{start:{line:593,column:16},end:{line:599,column:17}},type:"if",locations:[{start:{line:593,column:16},end:{line:599,column:17}},{start:{line:593,column:16},end:{line:599,column:17}}],line:593},"21":{loc:{start:{line:597,column:35},end:{line:597,column:54}},type:"binary-expr",locations:[{start:{line:597,column:35},end:{line:597,column:48}},{start:{line:597,column:52},end:{line:597,column:54}}],line:597},"22":{loc:{start:{line:598,column:35},end:{line:598,column:48}},type:"binary-expr",locations:[{start:{line:598,column:35},end:{line:598,column:42}},{start:{line:598,column:46},end:{line:598,column:48}}],line:598},"23":{loc:{start:{line:625,column:12},end:{line:628,column:13}},type:"if",locations:[{start:{line:625,column:12},end:{line:628,column:13}},{start:{line:625,column:12},end:{line:628,column:13}}],line:625},"24":{loc:{start:{line:625,column:16},end:{line:625,column:53}},type:"binary-expr",locations:[{start:{line:625,column:16},end:{line:625,column:25}},{start:{line:625,column:29},end:{line:625,column:53}}],line:625},"25":{loc:{start:{line:630,column:23},end:{line:630,column:48}},type:"binary-expr",locations:[{start:{line:630,column:23},end:{line:630,column:31}},{start:{line:630,column:35},end:{line:630,column:48}}],line:630},"26":{loc:{start:{line:631,column:21},end:{line:631,column:33}},type:"binary-expr",locations:[{start:{line:631,column:21},end:{line:631,column:27}},{start:{line:631,column:31},end:{line:631,column:33}}],line:631},"27":{loc:{start:{line:634,column:12},end:{line:636,column:13}},type:"if",locations:[{start:{line:634,column:12},end:{line:636,column:13}},{start:{line:634,column:12},end:{line:636,column:13}}],line:634},"28":{loc:{start:{line:653,column:20},end:{line:658,column:21}},type:"if",locations:[{start:{line:653,column:20},end:{line:658,column:21}},{start:{line:653,column:20},end:{line:658,column:21}}],line:653},"29":{loc:{start:{line:686,column:12},end:{line:688,column:13}},type:"if",locations:[{start:{line:686,column:12},end:{line:688,column:13}},{start:{line:686,column:12},end:{line:688,column:13}}],line:686},"30":{loc:{start:{line:690,column:12},end:{line:692,column:13}},type:"if",locations:[{start:{line:690,column:12},end:{line:692,column:13}},{start:{line:690,column:12},end:{line:692,column:13}}],line:690},"31":{loc:{start:{line:726,column:12},end:{line:728,column:13}},type:"if",locations:[{start:{line:726,column:12},end:{line:728,column:13}},{start:{line:726,column:12},end:{line:728,column:13}}],line:726},"32":{loc:{start:{line:742,column:12},end:{line:744,column:13}},type:"if",locations:[{start:{line:742,column:12},end:{line:744,column:13}},{start:{line:742,column:12},end:{line:744,column:13}}],line:742},"33":{loc:{start:{line:773,column:12},end:{line:775,column:13}},type:"if",locations:[{start:{line:773,column:12},end:{line:775,column:13}},{start:{line:773,column:12},end:{line:775,column:13}}],line:773},"34":{loc:{start:{line:805,column:12},end:{line:807,column:13}},type:"if",locations:[{start:{line:805,column:12},end:{line:807,column:13}},{start:{line:805,column:12},end:{line:807,column:13}}],line:805},"35":{loc:{start:{line:878,column:31},end:{line:878,column:47}},type:"binary-expr",locations:[{start:{line:878,column:31},end:{line:878,column:41}},{start:{line:878,column:45},end:{line:878,column:47}}],line:878},"36":{loc:{start:{line:879,column:26},end:{line:879,column:42}},type:"binary-expr",locations:[{start:{line:879,column:26},end:{line:879,column:36}},{start:{line:879,column:40},end:{line:879,column:42}}],line:879},"37":{loc:{start:{line:988,column:25},end:{line:988,column:79}},type:"cond-expr",locations:[{start:{line:988,column:53},end:{line:988,column:66}},{start:{line:988,column:69},end:{line:988,column:79}}],line:988},"38":{loc:{start:{line:992,column:25},end:{line:997,column:13}},type:"binary-expr",locations:[{start:{line:992,column:25},end:{line:992,column:35}},{start:{line:992,column:39},end:{line:997,column:13}}],line:992},"39":{loc:{start:{line:1002,column:31},end:{line:1002,column:57}},type:"binary-expr",locations:[{start:{line:1002,column:31},end:{line:1002,column:49}},{start:{line:1002,column:55},end:{line:1002,column:57}}],line:1002},"40":{loc:{start:{line:1003,column:31},end:{line:1003,column:73}},type:"binary-expr",locations:[{start:{line:1003,column:31},end:{line:1003,column:48}},{start:{line:1003,column:55},end:{line:1003,column:67}},{start:{line:1003,column:71},end:{line:1003,column:73}}],line:1003},"41":{loc:{start:{line:1004,column:31},end:{line:1004,column:57}},type:"binary-expr",locations:[{start:{line:1004,column:31},end:{line:1004,column:45}},{start:{line:1004,column:55},end:{line:1004,column:57}}],line:1004},"42":{loc:{start:{line:1005,column:31},end:{line:1005,column:57}},type:"binary-expr",locations:[{start:{line:1005,column:31},end:{line:1005,column:47}},{start:{line:1005,column:55},end:{line:1005,column:57}}],line:1005},"43":{loc:{start:{line:1006,column:31},end:{line:1006,column:59}},type:"binary-expr",locations:[{start:{line:1006,column:31},end:{line:1006,column:48}},{start:{line:1006,column:55},end:{line:1006,column:59}}],line:1006},"44":{loc:{start:{line:1007,column:31},end:{line:1007,column:59}},type:"binary-expr",locations:[{start:{line:1007,column:31},end:{line:1007,column:49}},{start:{line:1007,column:55},end:{line:1007,column:59}}],line:1007},"45":{loc:{start:{line:1008,column:31},end:{line:1008,column:59}},type:"binary-expr",locations:[{start:{line:1008,column:31},end:{line:1008,column:51}},{start:{line:1008,column:55},end:{line:1008,column:59}}],line:1008},"46":{loc:{start:{line:1096,column:12},end:{line:1099,column:13}},type:"if",locations:[{start:{line:1096,column:12},end:{line:1099,column:13}},{start:{line:1096,column:12},end:{line:1099,column:13}}],line:1096},"47":{loc:{start:{line:1096,column:16},end:{line:1096,column:54}},type:"binary-expr",locations:[{start:{line:1096,column:16},end:{line:1096,column:25}},{start:{line:1096,column:29},end:{line:1096,column:54}}],line:1096},"48":{loc:{start:{line:1100,column:23},end:{line:1100,column:48}},type:"binary-expr",locations:[{start:{line:1100,column:23},end:{line:1100,column:31}},{start:{line:1100,column:35},end:{line:1100,column:48}}],line:1100},"49":{loc:{start:{line:1102,column:22},end:{line:1102,column:35}},type:"binary-expr",locations:[{start:{line:1102,column:22},end:{line:1102,column:29}},{start:{line:1102,column:33},end:{line:1102,column:35}}],line:1102},"50":{loc:{start:{line:1106,column:16},end:{line:1112,column:17}},type:"if",locations:[{start:{line:1106,column:16},end:{line:1112,column:17}},{start:{line:1106,column:16},end:{line:1112,column:17}}],line:1106},"51":{loc:{start:{line:1110,column:31},end:{line:1110,column:73}},type:"cond-expr",locations:[{start:{line:1110,column:47},end:{line:1110,column:66}},{start:{line:1110,column:69},end:{line:1110,column:73}}],line:1110},"52":{loc:{start:{line:1125,column:23},end:{line:1125,column:48}},type:"binary-expr",locations:[{start:{line:1125,column:23},end:{line:1125,column:31}},{start:{line:1125,column:35},end:{line:1125,column:48}}],line:1125},"53":{loc:{start:{line:1143,column:23},end:{line:1143,column:48}},type:"binary-expr",locations:[{start:{line:1143,column:23},end:{line:1143,column:31}},{start:{line:1143,column:35},end:{line:1143,column:48}}],line:1143},"54":{loc:{start:{line:1145,column:12},end:{line:1147,column:13}},type:"if",locations:[{start:{line:1145,column:12},end:{line:1147,column:13}},{start:{line:1145,column:12},end:{line:1147,column:13}}],line:1145},"55":{loc:{start:{line:1151,column:16},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1151,column:16},end:{line:1167,column:17}},{start:{line:1151,column:16},end:{line:1167,column:17}}],line:1151},"56":{loc:{start:{line:1151,column:20},end:{line:1151,column:47}},type:"binary-expr",locations:[{start:{line:1151,column:20},end:{line:1151,column:24}},{start:{line:1151,column:28},end:{line:1151,column:47}}],line:1151},"57":{loc:{start:{line:1155,column:21},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1155,column:21},end:{line:1167,column:17}},{start:{line:1155,column:21},end:{line:1167,column:17}}],line:1155},"58":{loc:{start:{line:1155,column:25},end:{line:1155,column:51}},type:"binary-expr",locations:[{start:{line:1155,column:25},end:{line:1155,column:29}},{start:{line:1155,column:33},end:{line:1155,column:51}}],line:1155},"59":{loc:{start:{line:1157,column:24},end:{line:1162,column:25}},type:"if",locations:[{start:{line:1157,column:24},end:{line:1162,column:25}},{start:{line:1157,column:24},end:{line:1162,column:25}}],line:1157},"60":{loc:{start:{line:1182,column:23},end:{line:1182,column:48}},type:"binary-expr",locations:[{start:{line:1182,column:23},end:{line:1182,column:31}},{start:{line:1182,column:35},end:{line:1182,column:48}}],line:1182},"61":{loc:{start:{line:1186,column:16},end:{line:1191,column:17}},type:"if",locations:[{start:{line:1186,column:16},end:{line:1191,column:17}},{start:{line:1186,column:16},end:{line:1191,column:17}}],line:1186},"62":{loc:{start:{line:1204,column:23},end:{line:1204,column:48}},type:"binary-expr",locations:[{start:{line:1204,column:23},end:{line:1204,column:31}},{start:{line:1204,column:35},end:{line:1204,column:48}}],line:1204},"63":{loc:{start:{line:1208,column:16},end:{line:1213,column:17}},type:"if",locations:[{start:{line:1208,column:16},end:{line:1213,column:17}},{start:{line:1208,column:16},end:{line:1213,column:17}}],line:1208},"64":{loc:{start:{line:1226,column:23},end:{line:1226,column:48}},type:"binary-expr",locations:[{start:{line:1226,column:23},end:{line:1226,column:31}},{start:{line:1226,column:35},end:{line:1226,column:48}}],line:1226},"65":{loc:{start:{line:1230,column:16},end:{line:1235,column:17}},type:"if",locations:[{start:{line:1230,column:16},end:{line:1235,column:17}},{start:{line:1230,column:16},end:{line:1235,column:17}}],line:1230},"66":{loc:{start:{line:1318,column:37},end:{line:1318,column:59}},type:"binary-expr",locations:[{start:{line:1318,column:37},end:{line:1318,column:53}},{start:{line:1318,column:57},end:{line:1318,column:59}}],line:1318},"67":{loc:{start:{line:1325,column:16},end:{line:1330,column:17}},type:"if",locations:[{start:{line:1325,column:16},end:{line:1330,column:17}},{start:{line:1325,column:16},end:{line:1330,column:17}}],line:1325},"68":{loc:{start:{line:1334,column:35},end:{line:1334,column:61}},type:"binary-expr",locations:[{start:{line:1334,column:35},end:{line:1334,column:52}},{start:{line:1334,column:59},end:{line:1334,column:61}}],line:1334},"69":{loc:{start:{line:1335,column:35},end:{line:1335,column:61}},type:"binary-expr",locations:[{start:{line:1335,column:35},end:{line:1335,column:51}},{start:{line:1335,column:59},end:{line:1335,column:61}}],line:1335},"70":{loc:{start:{line:1336,column:35},end:{line:1336,column:63}},type:"binary-expr",locations:[{start:{line:1336,column:35},end:{line:1336,column:53}},{start:{line:1336,column:59},end:{line:1336,column:63}}],line:1336},"71":{loc:{start:{line:1389,column:12},end:{line:1392,column:13}},type:"if",locations:[{start:{line:1389,column:12},end:{line:1392,column:13}},{start:{line:1389,column:12},end:{line:1392,column:13}}],line:1389},"72":{loc:{start:{line:1389,column:16},end:{line:1389,column:54}},type:"binary-expr",locations:[{start:{line:1389,column:16},end:{line:1389,column:25}},{start:{line:1389,column:29},end:{line:1389,column:54}}],line:1389},"73":{loc:{start:{line:1393,column:23},end:{line:1393,column:48}},type:"binary-expr",locations:[{start:{line:1393,column:23},end:{line:1393,column:31}},{start:{line:1393,column:35},end:{line:1393,column:48}}],line:1393},"74":{loc:{start:{line:1395,column:22},end:{line:1395,column:35}},type:"binary-expr",locations:[{start:{line:1395,column:22},end:{line:1395,column:29}},{start:{line:1395,column:33},end:{line:1395,column:35}}],line:1395},"75":{loc:{start:{line:1396,column:12},end:{line:1398,column:13}},type:"if",locations:[{start:{line:1396,column:12},end:{line:1398,column:13}},{start:{line:1396,column:12},end:{line:1398,column:13}}],line:1396},"76":{loc:{start:{line:1402,column:16},end:{line:1408,column:17}},type:"if",locations:[{start:{line:1402,column:16},end:{line:1408,column:17}},{start:{line:1402,column:16},end:{line:1408,column:17}}],line:1402},"77":{loc:{start:{line:1415,column:22},end:{line:1415,column:35}},type:"binary-expr",locations:[{start:{line:1415,column:22},end:{line:1415,column:29}},{start:{line:1415,column:33},end:{line:1415,column:35}}],line:1415},"78":{loc:{start:{line:1416,column:12},end:{line:1418,column:13}},type:"if",locations:[{start:{line:1416,column:12},end:{line:1418,column:13}},{start:{line:1416,column:12},end:{line:1418,column:13}}],line:1416},"79":{loc:{start:{line:1449,column:12},end:{line:1451,column:13}},type:"if",locations:[{start:{line:1449,column:12},end:{line:1451,column:13}},{start:{line:1449,column:12},end:{line:1451,column:13}}],line:1449},"80":{loc:{start:{line:1453,column:12},end:{line:1455,column:13}},type:"if",locations:[{start:{line:1453,column:12},end:{line:1455,column:13}},{start:{line:1453,column:12},end:{line:1455,column:13}}],line:1453},"81":{loc:{start:{line:1457,column:12},end:{line:1459,column:13}},type:"if",locations:[{start:{line:1457,column:12},end:{line:1459,column:13}},{start:{line:1457,column:12},end:{line:1459,column:13}}],line:1457},"82":{loc:{start:{line:1457,column:16},end:{line:1457,column:79}},type:"binary-expr",locations:[{start:{line:1457,column:16},end:{line:1457,column:25}},{start:{line:1457,column:30},end:{line:1457,column:51}},{start:{line:1457,column:55},end:{line:1457,column:78}}],line:1457},"83":{loc:{start:{line:1462,column:12},end:{line:1504,column:13}},type:"if",locations:[{start:{line:1462,column:12},end:{line:1504,column:13}},{start:{line:1462,column:12},end:{line:1504,column:13}}],line:1462},"84":{loc:{start:{line:1465,column:16},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1465,column:16},end:{line:1500,column:17}},{start:{line:1465,column:16},end:{line:1500,column:17}}],line:1465},"85":{loc:{start:{line:1465,column:20},end:{line:1465,column:55}},type:"binary-expr",locations:[{start:{line:1465,column:20},end:{line:1465,column:41}},{start:{line:1465,column:45},end:{line:1465,column:55}}],line:1465},"86":{loc:{start:{line:1472,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1472,column:21},end:{line:1500,column:17}},{start:{line:1472,column:21},end:{line:1500,column:17}}],line:1472},"87":{loc:{start:{line:1472,column:25},end:{line:1472,column:59}},type:"binary-expr",locations:[{start:{line:1472,column:25},end:{line:1472,column:46}},{start:{line:1472,column:50},end:{line:1472,column:59}}],line:1472},"88":{loc:{start:{line:1477,column:20},end:{line:1482,column:21}},type:"if",locations:[{start:{line:1477,column:20},end:{line:1482,column:21}},{start:{line:1477,column:20},end:{line:1482,column:21}}],line:1477},"89":{loc:{start:{line:1484,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1484,column:21},end:{line:1500,column:17}},{start:{line:1484,column:21},end:{line:1500,column:17}}],line:1484},"90":{loc:{start:{line:1484,column:25},end:{line:1484,column:58}},type:"binary-expr",locations:[{start:{line:1484,column:25},end:{line:1484,column:44}},{start:{line:1484,column:48},end:{line:1484,column:58}}],line:1484},"91":{loc:{start:{line:1496,column:24},end:{line:1498,column:25}},type:"if",locations:[{start:{line:1496,column:24},end:{line:1498,column:25}},{start:{line:1496,column:24},end:{line:1498,column:25}}],line:1496},"92":{loc:{start:{line:1525,column:23},end:{line:1525,column:48}},type:"binary-expr",locations:[{start:{line:1525,column:23},end:{line:1525,column:31}},{start:{line:1525,column:35},end:{line:1525,column:48}}],line:1525},"93":{loc:{start:{line:1528,column:16},end:{line:1553,column:17}},type:"if",locations:[{start:{line:1528,column:16},end:{line:1553,column:17}},{start:{line:1528,column:16},end:{line:1553,column:17}}],line:1528},"94":{loc:{start:{line:1533,column:20},end:{line:1535,column:21}},type:"if",locations:[{start:{line:1533,column:20},end:{line:1535,column:21}},{start:{line:1533,column:20},end:{line:1535,column:21}}],line:1533},"95":{loc:{start:{line:1540,column:20},end:{line:1552,column:21}},type:"if",locations:[{start:{line:1540,column:20},end:{line:1552,column:21}},{start:{line:1540,column:20},end:{line:1552,column:21}}],line:1540},"96":{loc:{start:{line:1542,column:28},end:{line:1547,column:29}},type:"if",locations:[{start:{line:1542,column:28},end:{line:1547,column:29}},{start:{line:1542,column:28},end:{line:1547,column:29}}],line:1542},"97":{loc:{start:{line:1575,column:23},end:{line:1575,column:48}},type:"binary-expr",locations:[{start:{line:1575,column:23},end:{line:1575,column:31}},{start:{line:1575,column:35},end:{line:1575,column:48}}],line:1575},"98":{loc:{start:{line:1637,column:19},end:{line:1637,column:77}},type:"binary-expr",locations:[{start:{line:1637,column:19},end:{line:1637,column:72}},{start:{line:1637,column:76},end:{line:1637,column:77}}],line:1637},"99":{loc:{start:{line:1657,column:23},end:{line:1657,column:48}},type:"binary-expr",locations:[{start:{line:1657,column:23},end:{line:1657,column:31}},{start:{line:1657,column:35},end:{line:1657,column:48}}],line:1657},"100":{loc:{start:{line:1689,column:12},end:{line:1692,column:13}},type:"if",locations:[{start:{line:1689,column:12},end:{line:1692,column:13}},{start:{line:1689,column:12},end:{line:1692,column:13}}],line:1689},"101":{loc:{start:{line:1689,column:16},end:{line:1689,column:54}},type:"binary-expr",locations:[{start:{line:1689,column:16},end:{line:1689,column:25}},{start:{line:1689,column:29},end:{line:1689,column:54}}],line:1689},"102":{loc:{start:{line:1694,column:23},end:{line:1694,column:48}},type:"binary-expr",locations:[{start:{line:1694,column:23},end:{line:1694,column:31}},{start:{line:1694,column:35},end:{line:1694,column:48}}],line:1694},"103":{loc:{start:{line:1695,column:22},end:{line:1695,column:35}},type:"binary-expr",locations:[{start:{line:1695,column:22},end:{line:1695,column:29}},{start:{line:1695,column:33},end:{line:1695,column:35}}],line:1695},"104":{loc:{start:{line:1699,column:16},end:{line:1702,column:17}},type:"if",locations:[{start:{line:1699,column:16},end:{line:1702,column:17}},{start:{line:1699,column:16},end:{line:1702,column:17}}],line:1699},"105":{loc:{start:{line:1749,column:12},end:{line:1752,column:13}},type:"if",locations:[{start:{line:1749,column:12},end:{line:1752,column:13}},{start:{line:1749,column:12},end:{line:1752,column:13}}],line:1749},"106":{loc:{start:{line:1749,column:16},end:{line:1749,column:54}},type:"binary-expr",locations:[{start:{line:1749,column:16},end:{line:1749,column:25}},{start:{line:1749,column:29},end:{line:1749,column:54}}],line:1749},"107":{loc:{start:{line:1754,column:23},end:{line:1754,column:48}},type:"binary-expr",locations:[{start:{line:1754,column:23},end:{line:1754,column:31}},{start:{line:1754,column:35},end:{line:1754,column:48}}],line:1754},"108":{loc:{start:{line:1755,column:22},end:{line:1755,column:35}},type:"binary-expr",locations:[{start:{line:1755,column:22},end:{line:1755,column:29}},{start:{line:1755,column:33},end:{line:1755,column:35}}],line:1755},"109":{loc:{start:{line:1759,column:16},end:{line:1762,column:17}},type:"if",locations:[{start:{line:1759,column:16},end:{line:1762,column:17}},{start:{line:1759,column:16},end:{line:1762,column:17}}],line:1759},"110":{loc:{start:{line:1765,column:27},end:{line:1765,column:52}},type:"binary-expr",locations:[{start:{line:1765,column:27},end:{line:1765,column:46}},{start:{line:1765,column:50},end:{line:1765,column:52}}],line:1765},"111":{loc:{start:{line:1795,column:23},end:{line:1795,column:48}},type:"binary-expr",locations:[{start:{line:1795,column:23},end:{line:1795,column:31}},{start:{line:1795,column:35},end:{line:1795,column:48}}],line:1795},"112":{loc:{start:{line:1816,column:21},end:{line:1816,column:33}},type:"binary-expr",locations:[{start:{line:1816,column:21},end:{line:1816,column:27}},{start:{line:1816,column:31},end:{line:1816,column:33}}],line:1816},"113":{loc:{start:{line:1818,column:12},end:{line:1841,column:13}},type:"if",locations:[{start:{line:1818,column:12},end:{line:1841,column:13}},{start:{line:1818,column:12},end:{line:1841,column:13}}],line:1818},"114":{loc:{start:{line:1821,column:20},end:{line:1834,column:21}},type:"if",locations:[{start:{line:1821,column:20},end:{line:1834,column:21}},{start:{line:1821,column:20},end:{line:1834,column:21}}],line:1821},"115":{loc:{start:{line:1827,column:28},end:{line:1832,column:29}},type:"if",locations:[{start:{line:1827,column:28},end:{line:1832,column:29}},{start:{line:1827,column:28},end:{line:1832,column:29}}],line:1827},"116":{loc:{start:{line:2021,column:19},end:{line:2021,column:50}},type:"binary-expr",locations:[{start:{line:2021,column:19},end:{line:2021,column:44}},{start:{line:2021,column:48},end:{line:2021,column:50}}],line:2021},"117":{loc:{start:{line:2031,column:19},end:{line:2031,column:55}},type:"binary-expr",locations:[{start:{line:2031,column:19},end:{line:2031,column:47}},{start:{line:2031,column:51},end:{line:2031,column:55}}],line:2031},"118":{loc:{start:{line:2057,column:19},end:{line:2057,column:69}},type:"binary-expr",locations:[{start:{line:2057,column:19},end:{line:2057,column:61}},{start:{line:2057,column:65},end:{line:2057,column:69}}],line:2057},"119":{loc:{start:{line:2067,column:19},end:{line:2067,column:61}},type:"binary-expr",locations:[{start:{line:2067,column:19},end:{line:2067,column:53}},{start:{line:2067,column:57},end:{line:2067,column:61}}],line:2067},"120":{loc:{start:{line:2078,column:19},end:{line:2078,column:65}},type:"binary-expr",locations:[{start:{line:2078,column:19},end:{line:2078,column:59}},{start:{line:2078,column:63},end:{line:2078,column:65}}],line:2078},"121":{loc:{start:{line:2088,column:19},end:{line:2088,column:48}},type:"binary-expr",locations:[{start:{line:2088,column:19},end:{line:2088,column:40}},{start:{line:2088,column:44},end:{line:2088,column:48}}],line:2088},"122":{loc:{start:{line:2098,column:19},end:{line:2098,column:57}},type:"binary-expr",locations:[{start:{line:2098,column:19},end:{line:2098,column:49}},{start:{line:2098,column:53},end:{line:2098,column:57}}],line:2098},"123":{loc:{start:{line:2110,column:19},end:{line:2110,column:66}},type:"binary-expr",locations:[{start:{line:2110,column:19},end:{line:2110,column:58}},{start:{line:2110,column:62},end:{line:2110,column:66}}],line:2110},"124":{loc:{start:{line:2122,column:19},end:{line:2122,column:73}},type:"binary-expr",locations:[{start:{line:2122,column:19},end:{line:2122,column:67}},{start:{line:2122,column:71},end:{line:2122,column:73}}],line:2122},"125":{loc:{start:{line:2173,column:19},end:{line:2173,column:77}},type:"binary-expr",locations:[{start:{line:2173,column:19},end:{line:2173,column:72}},{start:{line:2173,column:76},end:{line:2173,column:77}}],line:2173},"126":{loc:{start:{line:2194,column:12},end:{line:2197,column:13}},type:"if",locations:[{start:{line:2194,column:12},end:{line:2197,column:13}},{start:{line:2194,column:12},end:{line:2197,column:13}}],line:2194},"127":{loc:{start:{line:2194,column:16},end:{line:2194,column:54}},type:"binary-expr",locations:[{start:{line:2194,column:16},end:{line:2194,column:25}},{start:{line:2194,column:29},end:{line:2194,column:54}}],line:2194},"128":{loc:{start:{line:2199,column:23},end:{line:2199,column:48}},type:"binary-expr",locations:[{start:{line:2199,column:23},end:{line:2199,column:31}},{start:{line:2199,column:35},end:{line:2199,column:48}}],line:2199},"129":{loc:{start:{line:2200,column:22},end:{line:2200,column:35}},type:"binary-expr",locations:[{start:{line:2200,column:22},end:{line:2200,column:29}},{start:{line:2200,column:33},end:{line:2200,column:35}}],line:2200},"130":{loc:{start:{line:2204,column:16},end:{line:2207,column:17}},type:"if",locations:[{start:{line:2204,column:16},end:{line:2207,column:17}},{start:{line:2204,column:16},end:{line:2207,column:17}}],line:2204},"131":{loc:{start:{line:2210,column:27},end:{line:2210,column:52}},type:"binary-expr",locations:[{start:{line:2210,column:27},end:{line:2210,column:46}},{start:{line:2210,column:50},end:{line:2210,column:52}}],line:2210},"132":{loc:{start:{line:2368,column:23},end:{line:2368,column:48}},type:"binary-expr",locations:[{start:{line:2368,column:23},end:{line:2368,column:31}},{start:{line:2368,column:35},end:{line:2368,column:48}}],line:2368},"133":{loc:{start:{line:2372,column:16},end:{line:2377,column:17}},type:"if",locations:[{start:{line:2372,column:16},end:{line:2377,column:17}},{start:{line:2372,column:16},end:{line:2377,column:17}}],line:2372},"134":{loc:{start:{line:2397,column:23},end:{line:2397,column:48}},type:"binary-expr",locations:[{start:{line:2397,column:23},end:{line:2397,column:31}},{start:{line:2397,column:35},end:{line:2397,column:48}}],line:2397},"135":{loc:{start:{line:2401,column:16},end:{line:2406,column:17}},type:"if",locations:[{start:{line:2401,column:16},end:{line:2406,column:17}},{start:{line:2401,column:16},end:{line:2406,column:17}}],line:2401},"136":{loc:{start:{line:2593,column:23},end:{line:2593,column:48}},type:"binary-expr",locations:[{start:{line:2593,column:23},end:{line:2593,column:31}},{start:{line:2593,column:35},end:{line:2593,column:48}}],line:2593},"137":{loc:{start:{line:2597,column:16},end:{line:2613,column:17}},type:"if",locations:[{start:{line:2597,column:16},end:{line:2613,column:17}},{start:{line:2597,column:16},end:{line:2613,column:17}}],line:2597},"138":{loc:{start:{line:2606,column:24},end:{line:2611,column:25}},type:"if",locations:[{start:{line:2606,column:24},end:{line:2611,column:25}},{start:{line:2606,column:24},end:{line:2611,column:25}}],line:2606},"139":{loc:{start:{line:2767,column:12},end:{line:2770,column:13}},type:"if",locations:[{start:{line:2767,column:12},end:{line:2770,column:13}},{start:{line:2767,column:12},end:{line:2770,column:13}}],line:2767},"140":{loc:{start:{line:2767,column:16},end:{line:2767,column:53}},type:"binary-expr",locations:[{start:{line:2767,column:16},end:{line:2767,column:25}},{start:{line:2767,column:29},end:{line:2767,column:53}}],line:2767},"141":{loc:{start:{line:2772,column:23},end:{line:2772,column:48}},type:"binary-expr",locations:[{start:{line:2772,column:23},end:{line:2772,column:31}},{start:{line:2772,column:35},end:{line:2772,column:48}}],line:2772},"142":{loc:{start:{line:2773,column:21},end:{line:2773,column:33}},type:"binary-expr",locations:[{start:{line:2773,column:21},end:{line:2773,column:27}},{start:{line:2773,column:31},end:{line:2773,column:33}}],line:2773},"143":{loc:{start:{line:2785,column:12},end:{line:2790,column:13}},type:"if",locations:[{start:{line:2785,column:12},end:{line:2790,column:13}},{start:{line:2785,column:12},end:{line:2790,column:13}}],line:2785},"144":{loc:{start:{line:2862,column:12},end:{line:2866,column:13}},type:"if",locations:[{start:{line:2862,column:12},end:{line:2866,column:13}},{start:{line:2862,column:12},end:{line:2866,column:13}}],line:2862},"145":{loc:{start:{line:2862,column:16},end:{line:2862,column:77}},type:"binary-expr",locations:[{start:{line:2862,column:16},end:{line:2862,column:36}},{start:{line:2862,column:40},end:{line:2862,column:64}},{start:{line:2862,column:68},end:{line:2862,column:77}}],line:2862},"146":{loc:{start:{line:2868,column:21},end:{line:2868,column:33}},type:"binary-expr",locations:[{start:{line:2868,column:21},end:{line:2868,column:27}},{start:{line:2868,column:31},end:{line:2868,column:33}}],line:2868},"147":{loc:{start:{line:2890,column:23},end:{line:2890,column:67}},type:"cond-expr",locations:[{start:{line:2890,column:49},end:{line:2890,column:55}},{start:{line:2890,column:58},end:{line:2890,column:67}}],line:2890},"148":{loc:{start:{line:3001,column:12},end:{line:3005,column:13}},type:"if",locations:[{start:{line:3001,column:12},end:{line:3005,column:13}},{start:{line:3001,column:12},end:{line:3005,column:13}}],line:3001},"149":{loc:{start:{line:3001,column:16},end:{line:3001,column:83}},type:"binary-expr",locations:[{start:{line:3001,column:16},end:{line:3001,column:42}},{start:{line:3001,column:46},end:{line:3001,column:70}},{start:{line:3001,column:74},end:{line:3001,column:83}}],line:3001},"150":{loc:{start:{line:3007,column:12},end:{line:3010,column:13}},type:"if",locations:[{start:{line:3007,column:12},end:{line:3010,column:13}},{start:{line:3007,column:12},end:{line:3010,column:13}}],line:3007},"151":{loc:{start:{line:3007,column:16},end:{line:3007,column:53}},type:"binary-expr",locations:[{start:{line:3007,column:16},end:{line:3007,column:40}},{start:{line:3007,column:44},end:{line:3007,column:53}}],line:3007},"152":{loc:{start:{line:3012,column:21},end:{line:3012,column:33}},type:"binary-expr",locations:[{start:{line:3012,column:21},end:{line:3012,column:27}},{start:{line:3012,column:31},end:{line:3012,column:33}}],line:3012},"153":{loc:{start:{line:3072,column:12},end:{line:3074,column:13}},type:"if",locations:[{start:{line:3072,column:12},end:{line:3074,column:13}},{start:{line:3072,column:12},end:{line:3074,column:13}}],line:3072},"154":{loc:{start:{line:3072,column:16},end:{line:3072,column:78}},type:"binary-expr",locations:[{start:{line:3072,column:16},end:{line:3072,column:26}},{start:{line:3072,column:30},end:{line:3072,column:53}},{start:{line:3072,column:57},end:{line:3072,column:78}}],line:3072},"155":{loc:{start:{line:3098,column:12},end:{line:3100,column:13}},type:"if",locations:[{start:{line:3098,column:12},end:{line:3100,column:13}},{start:{line:3098,column:12},end:{line:3100,column:13}}],line:3098},"156":{loc:{start:{line:3102,column:23},end:{line:3102,column:48}},type:"binary-expr",locations:[{start:{line:3102,column:23},end:{line:3102,column:31}},{start:{line:3102,column:35},end:{line:3102,column:48}}],line:3102},"157":{loc:{start:{line:3106,column:16},end:{line:3119,column:17}},type:"if",locations:[{start:{line:3106,column:16},end:{line:3119,column:17}},{start:{line:3106,column:16},end:{line:3119,column:17}}],line:3106},"158":{loc:{start:{line:3112,column:24},end:{line:3117,column:25}},type:"if",locations:[{start:{line:3112,column:24},end:{line:3117,column:25}},{start:{line:3112,column:24},end:{line:3117,column:25}}],line:3112},"159":{loc:{start:{line:3136,column:16},end:{line:3138,column:17}},type:"if",locations:[{start:{line:3136,column:16},end:{line:3138,column:17}},{start:{line:3136,column:16},end:{line:3138,column:17}}],line:3136},"160":{loc:{start:{line:3136,column:19},end:{line:3136,column:45}},type:"binary-expr",locations:[{start:{line:3136,column:19},end:{line:3136,column:24}},{start:{line:3136,column:28},end:{line:3136,column:45}}],line:3136},"161":{loc:{start:{line:3159,column:16},end:{line:3164,column:17}},type:"if",locations:[{start:{line:3159,column:16},end:{line:3164,column:17}},{start:{line:3159,column:16},end:{line:3164,column:17}}],line:3159},"162":{loc:{start:{line:3172,column:23},end:{line:3172,column:48}},type:"binary-expr",locations:[{start:{line:3172,column:23},end:{line:3172,column:31}},{start:{line:3172,column:35},end:{line:3172,column:48}}],line:3172},"163":{loc:{start:{line:3180,column:12},end:{line:3189,column:13}},type:"if",locations:[{start:{line:3180,column:12},end:{line:3189,column:13}},{start:{line:3180,column:12},end:{line:3189,column:13}}],line:3180},"164":{loc:{start:{line:3196,column:12},end:{line:3211,column:13}},type:"if",locations:[{start:{line:3196,column:12},end:{line:3211,column:13}},{start:{line:3196,column:12},end:{line:3211,column:13}}],line:3196},"165":{loc:{start:{line:3308,column:23},end:{line:3308,column:48}},type:"binary-expr",locations:[{start:{line:3308,column:23},end:{line:3308,column:31}},{start:{line:3308,column:35},end:{line:3308,column:48}}],line:3308},"166":{loc:{start:{line:3334,column:23},end:{line:3334,column:48}},type:"binary-expr",locations:[{start:{line:3334,column:23},end:{line:3334,column:31}},{start:{line:3334,column:35},end:{line:3334,column:48}}],line:3334},"167":{loc:{start:{line:3361,column:23},end:{line:3361,column:48}},type:"binary-expr",locations:[{start:{line:3361,column:23},end:{line:3361,column:31}},{start:{line:3361,column:35},end:{line:3361,column:48}}],line:3361},"168":{loc:{start:{line:3362,column:21},end:{line:3362,column:33}},type:"binary-expr",locations:[{start:{line:3362,column:21},end:{line:3362,column:27}},{start:{line:3362,column:31},end:{line:3362,column:33}}],line:3362},"169":{loc:{start:{line:3363,column:33},end:{line:3363,column:66}},type:"binary-expr",locations:[{start:{line:3363,column:33},end:{line:3363,column:51}},{start:{line:3363,column:55},end:{line:3363,column:66}}],line:3363},"170":{loc:{start:{line:3367,column:16},end:{line:3372,column:17}},type:"if",locations:[{start:{line:3367,column:16},end:{line:3372,column:17}},{start:{line:3367,column:16},end:{line:3372,column:17}}],line:3367},"171":{loc:{start:{line:3392,column:23},end:{line:3392,column:48}},type:"binary-expr",locations:[{start:{line:3392,column:23},end:{line:3392,column:31}},{start:{line:3392,column:35},end:{line:3392,column:48}}],line:3392},"172":{loc:{start:{line:3433,column:23},end:{line:3433,column:48}},type:"binary-expr",locations:[{start:{line:3433,column:23},end:{line:3433,column:31}},{start:{line:3433,column:35},end:{line:3433,column:48}}],line:3433},"173":{loc:{start:{line:3460,column:23},end:{line:3460,column:48}},type:"binary-expr",locations:[{start:{line:3460,column:23},end:{line:3460,column:31}},{start:{line:3460,column:35},end:{line:3460,column:48}}],line:3460},"174":{loc:{start:{line:3461,column:21},end:{line:3461,column:33}},type:"binary-expr",locations:[{start:{line:3461,column:21},end:{line:3461,column:27}},{start:{line:3461,column:31},end:{line:3461,column:33}}],line:3461},"175":{loc:{start:{line:3462,column:33},end:{line:3462,column:66}},type:"binary-expr",locations:[{start:{line:3462,column:33},end:{line:3462,column:51}},{start:{line:3462,column:55},end:{line:3462,column:66}}],line:3462},"176":{loc:{start:{line:3466,column:16},end:{line:3471,column:17}},type:"if",locations:[{start:{line:3466,column:16},end:{line:3471,column:17}},{start:{line:3466,column:16},end:{line:3471,column:17}}],line:3466},"177":{loc:{start:{line:3497,column:23},end:{line:3497,column:48}},type:"binary-expr",locations:[{start:{line:3497,column:23},end:{line:3497,column:31}},{start:{line:3497,column:35},end:{line:3497,column:48}}],line:3497},"178":{loc:{start:{line:3498,column:21},end:{line:3498,column:33}},type:"binary-expr",locations:[{start:{line:3498,column:21},end:{line:3498,column:27}},{start:{line:3498,column:31},end:{line:3498,column:33}}],line:3498},"179":{loc:{start:{line:3499,column:33},end:{line:3499,column:66}},type:"binary-expr",locations:[{start:{line:3499,column:33},end:{line:3499,column:51}},{start:{line:3499,column:55},end:{line:3499,column:66}}],line:3499},"180":{loc:{start:{line:3503,column:16},end:{line:3508,column:17}},type:"if",locations:[{start:{line:3503,column:16},end:{line:3508,column:17}},{start:{line:3503,column:16},end:{line:3508,column:17}}],line:3503},"181":{loc:{start:{line:3528,column:23},end:{line:3528,column:48}},type:"binary-expr",locations:[{start:{line:3528,column:23},end:{line:3528,column:31}},{start:{line:3528,column:35},end:{line:3528,column:48}}],line:3528},"182":{loc:{start:{line:3532,column:16},end:{line:3537,column:17}},type:"if",locations:[{start:{line:3532,column:16},end:{line:3537,column:17}},{start:{line:3532,column:16},end:{line:3537,column:17}}],line:3532},"183":{loc:{start:{line:3558,column:23},end:{line:3558,column:48}},type:"binary-expr",locations:[{start:{line:3558,column:23},end:{line:3558,column:31}},{start:{line:3558,column:35},end:{line:3558,column:48}}],line:3558},"184":{loc:{start:{line:3586,column:23},end:{line:3586,column:48}},type:"binary-expr",locations:[{start:{line:3586,column:23},end:{line:3586,column:31}},{start:{line:3586,column:35},end:{line:3586,column:48}}],line:3586},"185":{loc:{start:{line:3613,column:23},end:{line:3613,column:48}},type:"binary-expr",locations:[{start:{line:3613,column:23},end:{line:3613,column:31}},{start:{line:3613,column:35},end:{line:3613,column:48}}],line:3613},"186":{loc:{start:{line:3617,column:16},end:{line:3622,column:17}},type:"if",locations:[{start:{line:3617,column:16},end:{line:3622,column:17}},{start:{line:3617,column:16},end:{line:3622,column:17}}],line:3617},"187":{loc:{start:{line:3643,column:23},end:{line:3643,column:48}},type:"binary-expr",locations:[{start:{line:3643,column:23},end:{line:3643,column:31}},{start:{line:3643,column:35},end:{line:3643,column:48}}],line:3643},"188":{loc:{start:{line:3647,column:16},end:{line:3652,column:17}},type:"if",locations:[{start:{line:3647,column:16},end:{line:3652,column:17}},{start:{line:3647,column:16},end:{line:3652,column:17}}],line:3647},"189":{loc:{start:{line:3673,column:23},end:{line:3673,column:48}},type:"binary-expr",locations:[{start:{line:3673,column:23},end:{line:3673,column:31}},{start:{line:3673,column:35},end:{line:3673,column:48}}],line:3673},"190":{loc:{start:{line:3700,column:25},end:{line:3700,column:46}},type:"binary-expr",locations:[{start:{line:3700,column:25},end:{line:3700,column:39}},{start:{line:3700,column:43},end:{line:3700,column:46}}],line:3700},"191":{loc:{start:{line:3702,column:12},end:{line:3706,column:13}},type:"if",locations:[{start:{line:3702,column:12},end:{line:3706,column:13}},{start:{line:3702,column:12},end:{line:3706,column:13}}],line:3702},"192":{loc:{start:{line:3709,column:16},end:{line:3712,column:32}},type:"binary-expr",locations:[{start:{line:3709,column:16},end:{line:3709,column:35}},{start:{line:3710,column:16},end:{line:3710,column:31}},{start:{line:3711,column:16},end:{line:3711,column:33}},{start:{line:3712,column:16},end:{line:3712,column:32}}],line:3709},"193":{loc:{start:{line:3715,column:30},end:{line:3715,column:62}},type:"binary-expr",locations:[{start:{line:3715,column:30},end:{line:3715,column:45}},{start:{line:3715,column:49},end:{line:3715,column:62}}],line:3715},"194":{loc:{start:{line:3716,column:33},end:{line:3716,column:68}},type:"binary-expr",locations:[{start:{line:3716,column:33},end:{line:3716,column:51}},{start:{line:3716,column:55},end:{line:3716,column:68}}],line:3716},"195":{loc:{start:{line:3717,column:29},end:{line:3717,column:60}},type:"binary-expr",locations:[{start:{line:3717,column:29},end:{line:3717,column:43}},{start:{line:3717,column:47},end:{line:3717,column:60}}],line:3717},"196":{loc:{start:{line:3718,column:31},end:{line:3718,column:64}},type:"binary-expr",locations:[{start:{line:3718,column:31},end:{line:3718,column:47}},{start:{line:3718,column:51},end:{line:3718,column:64}}],line:3718},"197":{loc:{start:{line:3719,column:30},end:{line:3719,column:62}},type:"binary-expr",locations:[{start:{line:3719,column:30},end:{line:3719,column:45}},{start:{line:3719,column:49},end:{line:3719,column:62}}],line:3719},"198":{loc:{start:{line:3722,column:34},end:{line:3722,column:70}},type:"binary-expr",locations:[{start:{line:3722,column:34},end:{line:3722,column:53}},{start:{line:3722,column:57},end:{line:3722,column:70}}],line:3722},"199":{loc:{start:{line:3723,column:43},end:{line:3723,column:88}},type:"binary-expr",locations:[{start:{line:3723,column:43},end:{line:3723,column:71}},{start:{line:3723,column:75},end:{line:3723,column:88}}],line:3723},"200":{loc:{start:{line:3732,column:24},end:{line:3735,column:25}},type:"if",locations:[{start:{line:3732,column:24},end:{line:3735,column:25}},{start:{line:3732,column:24},end:{line:3735,column:25}}],line:3732},"201":{loc:{start:{line:3738,column:39},end:{line:3738,column:96}},type:"binary-expr",locations:[{start:{line:3738,column:39},end:{line:3738,column:65}},{start:{line:3738,column:69},end:{line:3738,column:96}}],line:3738},"202":{loc:{start:{line:3739,column:24},end:{line:3776,column:25}},type:"if",locations:[{start:{line:3739,column:24},end:{line:3776,column:25}},{start:{line:3739,column:24},end:{line:3776,column:25}}],line:3739},"203":{loc:{start:{line:3743,column:28},end:{line:3756,column:29}},type:"if",locations:[{start:{line:3743,column:28},end:{line:3756,column:29}},{start:{line:3743,column:28},end:{line:3756,column:29}}],line:3743},"204":{loc:{start:{line:3749,column:32},end:{line:3755,column:33}},type:"if",locations:[{start:{line:3749,column:32},end:{line:3755,column:33}},{start:{line:3749,column:32},end:{line:3755,column:33}}],line:3749},"205":{loc:{start:{line:3762,column:28},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3762,column:28},end:{line:3775,column:29}},{start:{line:3762,column:28},end:{line:3775,column:29}}],line:3762},"206":{loc:{start:{line:3762,column:32},end:{line:3762,column:72}},type:"binary-expr",locations:[{start:{line:3762,column:32},end:{line:3762,column:56}},{start:{line:3762,column:60},end:{line:3762,column:72}}],line:3762},"207":{loc:{start:{line:3769,column:33},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3769,column:33},end:{line:3775,column:29}},{start:{line:3769,column:33},end:{line:3775,column:29}}],line:3769},"208":{loc:{start:{line:3769,column:37},end:{line:3769,column:81}},type:"binary-expr",locations:[{start:{line:3769,column:37},end:{line:3769,column:63}},{start:{line:3769,column:67},end:{line:3769,column:81}}],line:3769},"209":{loc:{start:{line:3782,column:20},end:{line:3784,column:21}},type:"if",locations:[{start:{line:3782,column:20},end:{line:3784,column:21}},{start:{line:3782,column:20},end:{line:3784,column:21}}],line:3782},"210":{loc:{start:{line:3805,column:23},end:{line:3805,column:48}},type:"binary-expr",locations:[{start:{line:3805,column:23},end:{line:3805,column:31}},{start:{line:3805,column:35},end:{line:3805,column:48}}],line:3805},"211":{loc:{start:{line:3889,column:12},end:{line:3893,column:13}},type:"if",locations:[{start:{line:3889,column:12},end:{line:3893,column:13}},{start:{line:3889,column:12},end:{line:3893,column:13}}],line:3889},"212":{loc:{start:{line:3889,column:16},end:{line:3889,column:78}},type:"binary-expr",locations:[{start:{line:3889,column:16},end:{line:3889,column:37}},{start:{line:3889,column:41},end:{line:3889,column:65}},{start:{line:3889,column:69},end:{line:3889,column:78}}],line:3889},"213":{loc:{start:{line:3895,column:23},end:{line:3895,column:48}},type:"binary-expr",locations:[{start:{line:3895,column:23},end:{line:3895,column:31}},{start:{line:3895,column:35},end:{line:3895,column:48}}],line:3895},"214":{loc:{start:{line:3896,column:21},end:{line:3896,column:33}},type:"binary-expr",locations:[{start:{line:3896,column:21},end:{line:3896,column:27}},{start:{line:3896,column:31},end:{line:3896,column:33}}],line:3896},"215":{loc:{start:{line:3899,column:12},end:{line:3901,column:13}},type:"if",locations:[{start:{line:3899,column:12},end:{line:3901,column:13}},{start:{line:3899,column:12},end:{line:3901,column:13}}],line:3899},"216":{loc:{start:{line:3899,column:17},end:{line:3899,column:39}},type:"binary-expr",locations:[{start:{line:3899,column:17},end:{line:3899,column:33}},{start:{line:3899,column:37},end:{line:3899,column:39}}],line:3899},"217":{loc:{start:{line:3903,column:12},end:{line:3906,column:13}},type:"if",locations:[{start:{line:3903,column:12},end:{line:3906,column:13}},{start:{line:3903,column:12},end:{line:3906,column:13}}],line:3903},"218":{loc:{start:{line:3909,column:16},end:{line:3915,column:17}},type:"if",locations:[{start:{line:3909,column:16},end:{line:3915,column:17}},{start:{line:3909,column:16},end:{line:3915,column:17}}],line:3909},"219":{loc:{start:{line:3972,column:12},end:{line:3976,column:13}},type:"if",locations:[{start:{line:3972,column:12},end:{line:3976,column:13}},{start:{line:3972,column:12},end:{line:3976,column:13}}],line:3972},"220":{loc:{start:{line:3972,column:16},end:{line:3972,column:78}},type:"binary-expr",locations:[{start:{line:3972,column:16},end:{line:3972,column:37}},{start:{line:3972,column:41},end:{line:3972,column:65}},{start:{line:3972,column:69},end:{line:3972,column:78}}],line:3972},"221":{loc:{start:{line:3978,column:23},end:{line:3978,column:48}},type:"binary-expr",locations:[{start:{line:3978,column:23},end:{line:3978,column:31}},{start:{line:3978,column:35},end:{line:3978,column:48}}],line:3978},"222":{loc:{start:{line:3979,column:21},end:{line:3979,column:33}},type:"binary-expr",locations:[{start:{line:3979,column:21},end:{line:3979,column:27}},{start:{line:3979,column:31},end:{line:3979,column:33}}],line:3979},"223":{loc:{start:{line:3983,column:12},end:{line:3985,column:13}},type:"if",locations:[{start:{line:3983,column:12},end:{line:3985,column:13}},{start:{line:3983,column:12},end:{line:3985,column:13}}],line:3983},"224":{loc:{start:{line:3987,column:29},end:{line:3987,column:62}},type:"binary-expr",locations:[{start:{line:3987,column:29},end:{line:3987,column:47}},{start:{line:3987,column:51},end:{line:3987,column:62}}],line:3987},"225":{loc:{start:{line:4004,column:20},end:{line:4009,column:21}},type:"if",locations:[{start:{line:4004,column:20},end:{line:4009,column:21}},{start:{line:4004,column:20},end:{line:4009,column:21}}],line:4004},"226":{loc:{start:{line:4072,column:20},end:{line:4072,column:31}},type:"binary-expr",locations:[{start:{line:4072,column:20},end:{line:4072,column:25}},{start:{line:4072,column:29},end:{line:4072,column:31}}],line:4072},"227":{loc:{start:{line:4073,column:26},end:{line:4073,column:43}},type:"binary-expr",locations:[{start:{line:4073,column:26},end:{line:4073,column:37}},{start:{line:4073,column:41},end:{line:4073,column:43}}],line:4073},"228":{loc:{start:{line:4082,column:34},end:{line:4082,column:55}},type:"binary-expr",locations:[{start:{line:4082,column:34},end:{line:4082,column:47}},{start:{line:4082,column:51},end:{line:4082,column:55}}],line:4082},"229":{loc:{start:{line:4192,column:20},end:{line:4192,column:31}},type:"binary-expr",locations:[{start:{line:4192,column:20},end:{line:4192,column:25}},{start:{line:4192,column:29},end:{line:4192,column:31}}],line:4192},"230":{loc:{start:{line:4193,column:26},end:{line:4193,column:43}},type:"binary-expr",locations:[{start:{line:4193,column:26},end:{line:4193,column:37}},{start:{line:4193,column:41},end:{line:4193,column:43}}],line:4193},"231":{loc:{start:{line:4258,column:20},end:{line:4258,column:31}},type:"binary-expr",locations:[{start:{line:4258,column:20},end:{line:4258,column:25}},{start:{line:4258,column:29},end:{line:4258,column:31}}],line:4258},"232":{loc:{start:{line:4259,column:26},end:{line:4259,column:43}},type:"binary-expr",locations:[{start:{line:4259,column:26},end:{line:4259,column:37}},{start:{line:4259,column:41},end:{line:4259,column:43}}],line:4259},"233":{loc:{start:{line:4263,column:34},end:{line:4263,column:55}},type:"binary-expr",locations:[{start:{line:4263,column:34},end:{line:4263,column:47}},{start:{line:4263,column:51},end:{line:4263,column:55}}],line:4263},"234":{loc:{start:{line:4273,column:12},end:{line:4275,column:13}},type:"if",locations:[{start:{line:4273,column:12},end:{line:4275,column:13}},{start:{line:4273,column:12},end:{line:4275,column:13}}],line:4273},"235":{loc:{start:{line:4273,column:16},end:{line:4273,column:59}},type:"binary-expr",locations:[{start:{line:4273,column:16},end:{line:4273,column:36}},{start:{line:4273,column:40},end:{line:4273,column:59}}],line:4273},"236":{loc:{start:{line:4276,column:12},end:{line:4278,column:13}},type:"if",locations:[{start:{line:4276,column:12},end:{line:4278,column:13}},{start:{line:4276,column:12},end:{line:4278,column:13}}],line:4276},"237":{loc:{start:{line:4276,column:16},end:{line:4276,column:60}},type:"binary-expr",locations:[{start:{line:4276,column:16},end:{line:4276,column:37}},{start:{line:4276,column:41},end:{line:4276,column:60}}],line:4276},"238":{loc:{start:{line:4279,column:12},end:{line:4282,column:13}},type:"if",locations:[{start:{line:4279,column:12},end:{line:4282,column:13}},{start:{line:4279,column:12},end:{line:4282,column:13}}],line:4279},"239":{loc:{start:{line:4388,column:32},end:{line:4388,column:59}},type:"binary-expr",locations:[{start:{line:4388,column:32},end:{line:4388,column:51}},{start:{line:4388,column:55},end:{line:4388,column:59}}],line:4388},"240":{loc:{start:{line:4402,column:12},end:{line:4405,column:13}},type:"if",locations:[{start:{line:4402,column:12},end:{line:4405,column:13}},{start:{line:4402,column:12},end:{line:4405,column:13}}],line:4402},"241":{loc:{start:{line:4406,column:12},end:{line:4408,column:13}},type:"if",locations:[{start:{line:4406,column:12},end:{line:4408,column:13}},{start:{line:4406,column:12},end:{line:4408,column:13}}],line:4406},"242":{loc:{start:{line:4406,column:16},end:{line:4406,column:55}},type:"binary-expr",locations:[{start:{line:4406,column:16},end:{line:4406,column:21}},{start:{line:4406,column:25},end:{line:4406,column:55}}],line:4406},"243":{loc:{start:{line:4411,column:32},end:{line:4411,column:69}},type:"binary-expr",locations:[{start:{line:4411,column:32},end:{line:4411,column:49}},{start:{line:4411,column:53},end:{line:4411,column:69}}],line:4411},"244":{loc:{start:{line:4550,column:41},end:{line:4551,column:53}},type:"cond-expr",locations:[{start:{line:4551,column:16},end:{line:4551,column:46}},{start:{line:4551,column:49},end:{line:4551,column:53}}],line:4550},"245":{loc:{start:{line:4570,column:12},end:{line:4572,column:13}},type:"if",locations:[{start:{line:4570,column:12},end:{line:4572,column:13}},{start:{line:4570,column:12},end:{line:4572,column:13}}],line:4570},"246":{loc:{start:{line:4570,column:16},end:{line:4570,column:49}},type:"binary-expr",locations:[{start:{line:4570,column:16},end:{line:4570,column:19}},{start:{line:4570,column:23},end:{line:4570,column:49}}],line:4570},"247":{loc:{start:{line:4574,column:12},end:{line:4576,column:13}},type:"if",locations:[{start:{line:4574,column:12},end:{line:4576,column:13}},{start:{line:4574,column:12},end:{line:4576,column:13}}],line:4574},"248":{loc:{start:{line:4595,column:12},end:{line:4597,column:13}},type:"if",locations:[{start:{line:4595,column:12},end:{line:4597,column:13}},{start:{line:4595,column:12},end:{line:4597,column:13}}],line:4595},"249":{loc:{start:{line:4598,column:12},end:{line:4604,column:13}},type:"if",locations:[{start:{line:4598,column:12},end:{line:4604,column:13}},{start:{line:4598,column:12},end:{line:4604,column:13}}],line:4598},"250":{loc:{start:{line:4605,column:12},end:{line:4610,column:13}},type:"if",locations:[{start:{line:4605,column:12},end:{line:4610,column:13}},{start:{line:4605,column:12},end:{line:4610,column:13}}],line:4605},"251":{loc:{start:{line:4618,column:12},end:{line:4623,column:13}},type:"if",locations:[{start:{line:4618,column:12},end:{line:4623,column:13}},{start:{line:4618,column:12},end:{line:4623,column:13}}],line:4618},"252":{loc:{start:{line:4643,column:12},end:{line:4645,column:13}},type:"if",locations:[{start:{line:4643,column:12},end:{line:4645,column:13}},{start:{line:4643,column:12},end:{line:4645,column:13}}],line:4643},"253":{loc:{start:{line:4649,column:12},end:{line:4651,column:13}},type:"if",locations:[{start:{line:4649,column:12},end:{line:4651,column:13}},{start:{line:4649,column:12},end:{line:4651,column:13}}],line:4649},"254":{loc:{start:{line:4653,column:12},end:{line:4656,column:13}},type:"if",locations:[{start:{line:4653,column:12},end:{line:4656,column:13}},{start:{line:4653,column:12},end:{line:4656,column:13}}],line:4653},"255":{loc:{start:{line:4653,column:16},end:{line:4653,column:86}},type:"binary-expr",locations:[{start:{line:4653,column:16},end:{line:4653,column:35}},{start:{line:4653,column:39},end:{line:4653,column:86}}],line:4653},"256":{loc:{start:{line:4658,column:12},end:{line:4661,column:13}},type:"if",locations:[{start:{line:4658,column:12},end:{line:4661,column:13}},{start:{line:4658,column:12},end:{line:4661,column:13}}],line:4658},"257":{loc:{start:{line:4658,column:16},end:{line:4658,column:104}},type:"binary-expr",locations:[{start:{line:4658,column:16},end:{line:4658,column:35}},{start:{line:4658,column:39},end:{line:4658,column:104}}],line:4658},"258":{loc:{start:{line:4663,column:12},end:{line:4665,column:13}},type:"if",locations:[{start:{line:4663,column:12},end:{line:4665,column:13}},{start:{line:4663,column:12},end:{line:4665,column:13}}],line:4663},"259":{loc:{start:{line:4663,column:16},end:{line:4663,column:85}},type:"binary-expr",locations:[{start:{line:4663,column:16},end:{line:4663,column:40}},{start:{line:4663,column:44},end:{line:4663,column:85}}],line:4663},"260":{loc:{start:{line:4678,column:31},end:{line:4678,column:83}},type:"cond-expr",locations:[{start:{line:4678,column:63},end:{line:4678,column:71}},{start:{line:4678,column:74},end:{line:4678,column:83}}],line:4678},"261":{loc:{start:{line:4694,column:12},end:{line:4696,column:13}},type:"if",locations:[{start:{line:4694,column:12},end:{line:4696,column:13}},{start:{line:4694,column:12},end:{line:4696,column:13}}],line:4694},"262":{loc:{start:{line:4698,column:12},end:{line:4700,column:13}},type:"if",locations:[{start:{line:4698,column:12},end:{line:4700,column:13}},{start:{line:4698,column:12},end:{line:4700,column:13}}],line:4698},"263":{loc:{start:{line:4709,column:12},end:{line:4711,column:13}},type:"if",locations:[{start:{line:4709,column:12},end:{line:4711,column:13}},{start:{line:4709,column:12},end:{line:4711,column:13}}],line:4709},"264":{loc:{start:{line:4738,column:12},end:{line:4740,column:13}},type:"if",locations:[{start:{line:4738,column:12},end:{line:4740,column:13}},{start:{line:4738,column:12},end:{line:4740,column:13}}],line:4738},"265":{loc:{start:{line:4742,column:12},end:{line:4744,column:13}},type:"if",locations:[{start:{line:4742,column:12},end:{line:4744,column:13}},{start:{line:4742,column:12},end:{line:4744,column:13}}],line:4742},"266":{loc:{start:{line:4746,column:12},end:{line:4748,column:13}},type:"if",locations:[{start:{line:4746,column:12},end:{line:4748,column:13}},{start:{line:4746,column:12},end:{line:4748,column:13}}],line:4746},"267":{loc:{start:{line:4746,column:16},end:{line:4746,column:73}},type:"binary-expr",locations:[{start:{line:4746,column:16},end:{line:4746,column:48}},{start:{line:4746,column:52},end:{line:4746,column:73}}],line:4746},"268":{loc:{start:{line:4749,column:12},end:{line:4751,column:13}},type:"if",locations:[{start:{line:4749,column:12},end:{line:4751,column:13}},{start:{line:4749,column:12},end:{line:4751,column:13}}],line:4749},"269":{loc:{start:{line:4749,column:16},end:{line:4749,column:69}},type:"binary-expr",locations:[{start:{line:4749,column:16},end:{line:4749,column:46}},{start:{line:4749,column:50},end:{line:4749,column:69}}],line:4749},"270":{loc:{start:{line:4752,column:12},end:{line:4754,column:13}},type:"if",locations:[{start:{line:4752,column:12},end:{line:4754,column:13}},{start:{line:4752,column:12},end:{line:4754,column:13}}],line:4752},"271":{loc:{start:{line:4752,column:16},end:{line:4752,column:71}},type:"binary-expr",locations:[{start:{line:4752,column:16},end:{line:4752,column:47}},{start:{line:4752,column:51},end:{line:4752,column:71}}],line:4752},"272":{loc:{start:{line:4755,column:12},end:{line:4757,column:13}},type:"if",locations:[{start:{line:4755,column:12},end:{line:4757,column:13}},{start:{line:4755,column:12},end:{line:4757,column:13}}],line:4755},"273":{loc:{start:{line:4755,column:16},end:{line:4755,column:73}},type:"binary-expr",locations:[{start:{line:4755,column:16},end:{line:4755,column:48}},{start:{line:4755,column:52},end:{line:4755,column:73}}],line:4755},"274":{loc:{start:{line:4783,column:12},end:{line:4785,column:13}},type:"if",locations:[{start:{line:4783,column:12},end:{line:4785,column:13}},{start:{line:4783,column:12},end:{line:4785,column:13}}],line:4783},"275":{loc:{start:{line:4787,column:12},end:{line:4789,column:13}},type:"if",locations:[{start:{line:4787,column:12},end:{line:4789,column:13}},{start:{line:4787,column:12},end:{line:4789,column:13}}],line:4787},"276":{loc:{start:{line:4814,column:12},end:{line:4816,column:13}},type:"if",locations:[{start:{line:4814,column:12},end:{line:4816,column:13}},{start:{line:4814,column:12},end:{line:4816,column:13}}],line:4814},"277":{loc:{start:{line:4818,column:12},end:{line:4820,column:13}},type:"if",locations:[{start:{line:4818,column:12},end:{line:4820,column:13}},{start:{line:4818,column:12},end:{line:4820,column:13}}],line:4818},"278":{loc:{start:{line:4821,column:12},end:{line:4823,column:13}},type:"if",locations:[{start:{line:4821,column:12},end:{line:4823,column:13}},{start:{line:4821,column:12},end:{line:4823,column:13}}],line:4821},"279":{loc:{start:{line:4846,column:12},end:{line:4848,column:13}},type:"if",locations:[{start:{line:4846,column:12},end:{line:4848,column:13}},{start:{line:4846,column:12},end:{line:4848,column:13}}],line:4846},"280":{loc:{start:{line:4850,column:12},end:{line:4852,column:13}},type:"if",locations:[{start:{line:4850,column:12},end:{line:4852,column:13}},{start:{line:4850,column:12},end:{line:4852,column:13}}],line:4850},"281":{loc:{start:{line:4860,column:12},end:{line:4862,column:13}},type:"if",locations:[{start:{line:4860,column:12},end:{line:4862,column:13}},{start:{line:4860,column:12},end:{line:4862,column:13}}],line:4860},"282":{loc:{start:{line:4883,column:12},end:{line:4885,column:13}},type:"if",locations:[{start:{line:4883,column:12},end:{line:4885,column:13}},{start:{line:4883,column:12},end:{line:4885,column:13}}],line:4883},"283":{loc:{start:{line:4887,column:12},end:{line:4889,column:13}},type:"if",locations:[{start:{line:4887,column:12},end:{line:4889,column:13}},{start:{line:4887,column:12},end:{line:4889,column:13}}],line:4887},"284":{loc:{start:{line:4894,column:12},end:{line:4896,column:13}},type:"if",locations:[{start:{line:4894,column:12},end:{line:4896,column:13}},{start:{line:4894,column:12},end:{line:4896,column:13}}],line:4894},"285":{loc:{start:{line:4894,column:16},end:{line:4894,column:73}},type:"binary-expr",locations:[{start:{line:4894,column:16},end:{line:4894,column:48}},{start:{line:4894,column:52},end:{line:4894,column:73}}],line:4894},"286":{loc:{start:{line:4897,column:12},end:{line:4899,column:13}},type:"if",locations:[{start:{line:4897,column:12},end:{line:4899,column:13}},{start:{line:4897,column:12},end:{line:4899,column:13}}],line:4897},"287":{loc:{start:{line:4897,column:16},end:{line:4897,column:69}},type:"binary-expr",locations:[{start:{line:4897,column:16},end:{line:4897,column:46}},{start:{line:4897,column:50},end:{line:4897,column:69}}],line:4897},"288":{loc:{start:{line:4900,column:12},end:{line:4902,column:13}},type:"if",locations:[{start:{line:4900,column:12},end:{line:4902,column:13}},{start:{line:4900,column:12},end:{line:4902,column:13}}],line:4900},"289":{loc:{start:{line:4900,column:16},end:{line:4900,column:71}},type:"binary-expr",locations:[{start:{line:4900,column:16},end:{line:4900,column:47}},{start:{line:4900,column:51},end:{line:4900,column:71}}],line:4900},"290":{loc:{start:{line:4903,column:12},end:{line:4905,column:13}},type:"if",locations:[{start:{line:4903,column:12},end:{line:4905,column:13}},{start:{line:4903,column:12},end:{line:4905,column:13}}],line:4903},"291":{loc:{start:{line:4903,column:16},end:{line:4903,column:73}},type:"binary-expr",locations:[{start:{line:4903,column:16},end:{line:4903,column:48}},{start:{line:4903,column:52},end:{line:4903,column:73}}],line:4903},"292":{loc:{start:{line:4929,column:12},end:{line:4931,column:13}},type:"if",locations:[{start:{line:4929,column:12},end:{line:4931,column:13}},{start:{line:4929,column:12},end:{line:4931,column:13}}],line:4929},"293":{loc:{start:{line:4933,column:12},end:{line:4935,column:13}},type:"if",locations:[{start:{line:4933,column:12},end:{line:4935,column:13}},{start:{line:4933,column:12},end:{line:4935,column:13}}],line:4933},"294":{loc:{start:{line:4958,column:12},end:{line:4960,column:13}},type:"if",locations:[{start:{line:4958,column:12},end:{line:4960,column:13}},{start:{line:4958,column:12},end:{line:4960,column:13}}],line:4958},"295":{loc:{start:{line:4962,column:12},end:{line:4964,column:13}},type:"if",locations:[{start:{line:4962,column:12},end:{line:4964,column:13}},{start:{line:4962,column:12},end:{line:4964,column:13}}],line:4962},"296":{loc:{start:{line:4965,column:12},end:{line:4967,column:13}},type:"if",locations:[{start:{line:4965,column:12},end:{line:4967,column:13}},{start:{line:4965,column:12},end:{line:4967,column:13}}],line:4965},"297":{loc:{start:{line:4990,column:12},end:{line:4992,column:13}},type:"if",locations:[{start:{line:4990,column:12},end:{line:4992,column:13}},{start:{line:4990,column:12},end:{line:4992,column:13}}],line:4990},"298":{loc:{start:{line:4995,column:12},end:{line:5047,column:13}},type:"if",locations:[{start:{line:4995,column:12},end:{line:5047,column:13}},{start:{line:4995,column:12},end:{line:5047,column:13}}],line:4995},"299":{loc:{start:{line:4995,column:16},end:{line:5002,column:41}},type:"binary-expr",locations:[{start:{line:4995,column:16},end:{line:4995,column:58}},{start:{line:4996,column:16},end:{line:5002,column:41}}],line:4995},"300":{loc:{start:{line:5008,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5008,column:17},end:{line:5047,column:13}},{start:{line:5008,column:17},end:{line:5047,column:13}}],line:5008},"301":{loc:{start:{line:5008,column:21},end:{line:5018,column:37}},type:"binary-expr",locations:[{start:{line:5008,column:21},end:{line:5008,column:40}},{start:{line:5009,column:16},end:{line:5018,column:37}}],line:5008},"302":{loc:{start:{line:5025,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5025,column:17},end:{line:5047,column:13}},{start:{line:5025,column:17},end:{line:5047,column:13}}],line:5025},"303":{loc:{start:{line:5025,column:21},end:{line:5032,column:37}},type:"binary-expr",locations:[{start:{line:5025,column:21},end:{line:5025,column:43}},{start:{line:5026,column:16},end:{line:5032,column:37}}],line:5025},"304":{loc:{start:{line:5039,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5039,column:17},end:{line:5047,column:13}},{start:{line:5039,column:17},end:{line:5047,column:13}}],line:5039},"305":{loc:{start:{line:5039,column:21},end:{line:5040,column:41}},type:"binary-expr",locations:[{start:{line:5039,column:21},end:{line:5039,column:74}},{start:{line:5040,column:16},end:{line:5040,column:41}}],line:5039},"306":{loc:{start:{line:5045,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5045,column:17},end:{line:5047,column:13}},{start:{line:5045,column:17},end:{line:5047,column:13}}],line:5045},"307":{loc:{start:{line:5108,column:12},end:{line:5110,column:13}},type:"if",locations:[{start:{line:5108,column:12},end:{line:5110,column:13}},{start:{line:5108,column:12},end:{line:5110,column:13}}],line:5108},"308":{loc:{start:{line:5113,column:16},end:{line:5116,column:17}},type:"if",locations:[{start:{line:5113,column:16},end:{line:5116,column:17}},{start:{line:5113,column:16},end:{line:5116,column:17}}],line:5113},"309":{loc:{start:{line:5118,column:16},end:{line:5123,column:17}},type:"if",locations:[{start:{line:5118,column:16},end:{line:5123,column:17}},{start:{line:5118,column:16},end:{line:5123,column:17}}],line:5118},"310":{loc:{start:{line:5118,column:20},end:{line:5118,column:65}},type:"binary-expr",locations:[{start:{line:5118,column:20},end:{line:5118,column:39}},{start:{line:5118,column:43},end:{line:5118,column:65}}],line:5118},"311":{loc:{start:{line:5154,column:12},end:{line:5157,column:13}},type:"if",locations:[{start:{line:5154,column:12},end:{line:5157,column:13}},{start:{line:5154,column:12},end:{line:5157,column:13}}],line:5154},"312":{loc:{start:{line:5158,column:19},end:{line:5158,column:29}},type:"binary-expr",locations:[{start:{line:5158,column:19},end:{line:5158,column:23}},{start:{line:5158,column:27},end:{line:5158,column:29}}],line:5158},"313":{loc:{start:{line:5161,column:16},end:{line:5166,column:17}},type:"if",locations:[{start:{line:5161,column:16},end:{line:5166,column:17}},{start:{line:5161,column:16},end:{line:5166,column:17}}],line:5161},"314":{loc:{start:{line:5225,column:20},end:{line:5225,column:31}},type:"binary-expr",locations:[{start:{line:5225,column:20},end:{line:5225,column:25}},{start:{line:5225,column:29},end:{line:5225,column:31}}],line:5225},"315":{loc:{start:{line:5226,column:26},end:{line:5226,column:43}},type:"binary-expr",locations:[{start:{line:5226,column:26},end:{line:5226,column:37}},{start:{line:5226,column:41},end:{line:5226,column:43}}],line:5226},"316":{loc:{start:{line:5235,column:12},end:{line:5237,column:13}},type:"if",locations:[{start:{line:5235,column:12},end:{line:5237,column:13}},{start:{line:5235,column:12},end:{line:5237,column:13}}],line:5235},"317":{loc:{start:{line:5238,column:12},end:{line:5240,column:13}},type:"if",locations:[{start:{line:5238,column:12},end:{line:5240,column:13}},{start:{line:5238,column:12},end:{line:5240,column:13}}],line:5238},"318":{loc:{start:{line:5241,column:12},end:{line:5243,column:13}},type:"if",locations:[{start:{line:5241,column:12},end:{line:5243,column:13}},{start:{line:5241,column:12},end:{line:5243,column:13}}],line:5241},"319":{loc:{start:{line:5244,column:12},end:{line:5246,column:13}},type:"if",locations:[{start:{line:5244,column:12},end:{line:5246,column:13}},{start:{line:5244,column:12},end:{line:5246,column:13}}],line:5244},"320":{loc:{start:{line:5249,column:12},end:{line:5251,column:13}},type:"if",locations:[{start:{line:5249,column:12},end:{line:5251,column:13}},{start:{line:5249,column:12},end:{line:5251,column:13}}],line:5249},"321":{loc:{start:{line:5317,column:19},end:{line:5317,column:77}},type:"binary-expr",locations:[{start:{line:5317,column:19},end:{line:5317,column:48}},{start:{line:5317,column:52},end:{line:5317,column:69}},{start:{line:5317,column:73},end:{line:5317,column:77}}],line:5317},"322":{loc:{start:{line:5335,column:16},end:{line:5337,column:17}},type:"if",locations:[{start:{line:5335,column:16},end:{line:5337,column:17}},{start:{line:5335,column:16},end:{line:5337,column:17}}],line:5335},"323":{loc:{start:{line:5342,column:16},end:{line:5344,column:17}},type:"if",locations:[{start:{line:5342,column:16},end:{line:5344,column:17}},{start:{line:5342,column:16},end:{line:5344,column:17}}],line:5342},"324":{loc:{start:{line:5454,column:12},end:{line:5457,column:13}},type:"if",locations:[{start:{line:5454,column:12},end:{line:5457,column:13}},{start:{line:5454,column:12},end:{line:5457,column:13}}],line:5454},"325":{loc:{start:{line:5454,column:16},end:{line:5454,column:59}},type:"binary-expr",locations:[{start:{line:5454,column:16},end:{line:5454,column:25}},{start:{line:5454,column:29},end:{line:5454,column:59}}],line:5454},"326":{loc:{start:{line:5460,column:23},end:{line:5460,column:72}},type:"cond-expr",locations:[{start:{line:5460,column:38},end:{line:5460,column:67}},{start:{line:5460,column:70},end:{line:5460,column:72}}],line:5460},"327":{loc:{start:{line:5487,column:26},end:{line:5487,column:68}},type:"cond-expr",locations:[{start:{line:5487,column:43},end:{line:5487,column:60}},{start:{line:5487,column:65},end:{line:5487,column:67}}],line:5487},"328":{loc:{start:{line:5556,column:12},end:{line:5559,column:13}},type:"if",locations:[{start:{line:5556,column:12},end:{line:5559,column:13}},{start:{line:5556,column:12},end:{line:5559,column:13}}],line:5556},"329":{loc:{start:{line:5564,column:32},end:{line:5564,column:76}},type:"binary-expr",locations:[{start:{line:5564,column:32},end:{line:5564,column:70}},{start:{line:5564,column:74},end:{line:5564,column:76}}],line:5564},"330":{loc:{start:{line:5565,column:12},end:{line:5568,column:13}},type:"if",locations:[{start:{line:5565,column:12},end:{line:5568,column:13}},{start:{line:5565,column:12},end:{line:5568,column:13}}],line:5565},"331":{loc:{start:{line:5572,column:12},end:{line:5574,column:13}},type:"if",locations:[{start:{line:5572,column:12},end:{line:5574,column:13}},{start:{line:5572,column:12},end:{line:5574,column:13}}],line:5572},"332":{loc:{start:{line:5572,column:16},end:{line:5572,column:84}},type:"binary-expr",locations:[{start:{line:5572,column:16},end:{line:5572,column:48}},{start:{line:5572,column:52},end:{line:5572,column:84}}],line:5572},"333":{loc:{start:{line:5614,column:16},end:{line:5616,column:17}},type:"if",locations:[{start:{line:5614,column:16},end:{line:5616,column:17}},{start:{line:5614,column:16},end:{line:5616,column:17}}],line:5614},"334":{loc:{start:{line:5645,column:12},end:{line:5648,column:13}},type:"if",locations:[{start:{line:5645,column:12},end:{line:5648,column:13}},{start:{line:5645,column:12},end:{line:5648,column:13}}],line:5645},"335":{loc:{start:{line:5649,column:23},end:{line:5649,column:48}},type:"binary-expr",locations:[{start:{line:5649,column:23},end:{line:5649,column:31}},{start:{line:5649,column:35},end:{line:5649,column:48}}],line:5649},"336":{loc:{start:{line:5651,column:12},end:{line:5654,column:13}},type:"if",locations:[{start:{line:5651,column:12},end:{line:5654,column:13}},{start:{line:5651,column:12},end:{line:5654,column:13}}],line:5651},"337":{loc:{start:{line:5655,column:12},end:{line:5658,column:13}},type:"if",locations:[{start:{line:5655,column:12},end:{line:5658,column:13}},{start:{line:5655,column:12},end:{line:5658,column:13}}],line:5655},"338":{loc:{start:{line:5662,column:29},end:{line:5662,column:107}},type:"binary-expr",locations:[{start:{line:5662,column:29},end:{line:5662,column:48}},{start:{line:5662,column:52},end:{line:5662,column:78}},{start:{line:5662,column:82},end:{line:5662,column:107}}],line:5662},"339":{loc:{start:{line:5663,column:35},end:{line:5663,column:123}},type:"binary-expr",locations:[{start:{line:5663,column:35},end:{line:5663,column:54}},{start:{line:5663,column:58},end:{line:5663,column:89}},{start:{line:5663,column:93},end:{line:5663,column:123}}],line:5663},"340":{loc:{start:{line:5664,column:35},end:{line:5664,column:123}},type:"binary-expr",locations:[{start:{line:5664,column:35},end:{line:5664,column:54}},{start:{line:5664,column:58},end:{line:5664,column:89}},{start:{line:5664,column:93},end:{line:5664,column:123}}],line:5664},"341":{loc:{start:{line:5670,column:16},end:{line:5676,column:17}},type:"if",locations:[{start:{line:5670,column:16},end:{line:5676,column:17}},{start:{line:5670,column:16},end:{line:5676,column:17}}],line:5670},"342":{loc:{start:{line:5713,column:24},end:{line:5713,column:39}},type:"binary-expr",locations:[{start:{line:5713,column:24},end:{line:5713,column:33}},{start:{line:5713,column:37},end:{line:5713,column:39}}],line:5713},"343":{loc:{start:{line:5733,column:12},end:{line:5736,column:13}},type:"if",locations:[{start:{line:5733,column:12},end:{line:5736,column:13}},{start:{line:5733,column:12},end:{line:5736,column:13}}],line:5733},"344":{loc:{start:{line:5733,column:16},end:{line:5733,column:53}},type:"binary-expr",locations:[{start:{line:5733,column:16},end:{line:5733,column:40}},{start:{line:5733,column:44},end:{line:5733,column:53}}],line:5733},"345":{loc:{start:{line:5738,column:21},end:{line:5738,column:33}},type:"binary-expr",locations:[{start:{line:5738,column:21},end:{line:5738,column:27}},{start:{line:5738,column:31},end:{line:5738,column:33}}],line:5738},"346":{loc:{start:{line:5739,column:23},end:{line:5739,column:47}},type:"binary-expr",locations:[{start:{line:5739,column:23},end:{line:5739,column:31}},{start:{line:5739,column:35},end:{line:5739,column:47}}],line:5739},"347":{loc:{start:{line:5744,column:16},end:{line:5750,column:17}},type:"if",locations:[{start:{line:5744,column:16},end:{line:5750,column:17}},{start:{line:5744,column:16},end:{line:5750,column:17}}],line:5744},"348":{loc:{start:{line:5774,column:21},end:{line:5774,column:33}},type:"binary-expr",locations:[{start:{line:5774,column:21},end:{line:5774,column:27}},{start:{line:5774,column:31},end:{line:5774,column:33}}],line:5774},"349":{loc:{start:{line:5777,column:29},end:{line:5777,column:49}},type:"binary-expr",locations:[{start:{line:5777,column:29},end:{line:5777,column:44}},{start:{line:5777,column:48},end:{line:5777,column:49}}],line:5777},"350":{loc:{start:{line:5783,column:23},end:{line:5783,column:48}},type:"binary-expr",locations:[{start:{line:5783,column:23},end:{line:5783,column:31}},{start:{line:5783,column:35},end:{line:5783,column:48}}],line:5783},"351":{loc:{start:{line:5791,column:16},end:{line:5799,column:17}},type:"if",locations:[{start:{line:5791,column:16},end:{line:5799,column:17}},{start:{line:5791,column:16},end:{line:5799,column:17}}],line:5791},"352":{loc:{start:{line:5795,column:38},end:{line:5795,column:76}},type:"cond-expr",locations:[{start:{line:5795,column:53},end:{line:5795,column:72}},{start:{line:5795,column:75},end:{line:5795,column:76}}],line:5795}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0},b:{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,0],"53":[0,0],"54":[0,0],"55":[0,0],"56":[0,0],"57":[0,0],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,0],"63":[0,0],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0,0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0,0],"83":[0,0],"84":[0,0],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0,0],"89":[0,0],"90":[0,0],"91":[0,0],"92":[0,0],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0,0],"97":[0,0],"98":[0,0],"99":[0,0],"100":[0,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[0,0],"105":[0,0],"106":[0,0],"107":[0,0],"108":[0,0],"109":[0,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[0,0],"114":[0,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[0,0],"119":[0,0],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[0,0],"127":[0,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[0,0],"134":[0,0],"135":[0,0],"136":[0,0],"137":[0,0],"138":[0,0],"139":[0,0],"140":[0,0],"141":[0,0],"142":[0,0],"143":[0,0],"144":[0,0],"145":[0,0,0],"146":[0,0],"147":[0,0],"148":[0,0],"149":[0,0,0],"150":[0,0],"151":[0,0],"152":[0,0],"153":[0,0],"154":[0,0,0],"155":[0,0],"156":[0,0],"157":[0,0],"158":[0,0],"159":[0,0],"160":[0,0],"161":[0,0],"162":[0,0],"163":[0,0],"164":[0,0],"165":[0,0],"166":[0,0],"167":[0,0],"168":[0,0],"169":[0,0],"170":[0,0],"171":[0,0],"172":[0,0],"173":[0,0],"174":[0,0],"175":[0,0],"176":[0,0],"177":[0,0],"178":[0,0],"179":[0,0],"180":[0,0],"181":[0,0],"182":[0,0],"183":[0,0],"184":[0,0],"185":[0,0],"186":[0,0],"187":[0,0],"188":[0,0],"189":[0,0],"190":[0,0],"191":[0,0],"192":[0,0,0,0],"193":[0,0],"194":[0,0],"195":[0,0],"196":[0,0],"197":[0,0],"198":[0,0],"199":[0,0],"200":[0,0],"201":[0,0],"202":[0,0],"203":[0,0],"204":[0,0],"205":[0,0],"206":[0,0],"207":[0,0],"208":[0,0],"209":[0,0],"210":[0,0],"211":[0,0],"212":[0,0,0],"213":[0,0],"214":[0,0],"215":[0,0],"216":[0,0],"217":[0,0],"218":[0,0],"219":[0,0],"220":[0,0,0],"221":[0,0],"222":[0,0],"223":[0,0],"224":[0,0],"225":[0,0],"226":[0,0],"227":[0,0],"228":[0,0],"229":[0,0],"230":[0,0],"231":[0,0],"232":[0,0],"233":[0,0],"234":[0,0],"235":[0,0],"236":[0,0],"237":[0,0],"238":[0,0],"239":[0,0],"240":[0,0],"241":[0,0],"242":[0,0],"243":[0,0],"244":[0,0],"245":[0,0],"246":[0,0],"247":[0,0],"248":[0,0],"249":[0,0],"250":[0,0],"251":[0,0],"252":[0,0],"253":[0,0],"254":[0,0],"255":[0,0],"256":[0,0],"257":[0,0],"258":[0,0],"259":[0,0],"260":[0,0],"261":[0,0],"262":[0,0],"263":[0,0],"264":[0,0],"265":[0,0],"266":[0,0],"267":[0,0],"268":[0,0],"269":[0,0],"270":[0,0],"271":[0,0],"272":[0,0],"273":[0,0],"274":[0,0],"275":[0,0],"276":[0,0],"277":[0,0],"278":[0,0],"279":[0,0],"280":[0,0],"281":[0,0],"282":[0,0],"283":[0,0],"284":[0,0],"285":[0,0],"286":[0,0],"287":[0,0],"288":[0,0],"289":[0,0],"290":[0,0],"291":[0,0],"292":[0,0],"293":[0,0],"294":[0,0],"295":[0,0],"296":[0,0],"297":[0,0],"298":[0,0],"299":[0,0],"300":[0,0],"301":[0,0],"302":[0,0],"303":[0,0],"304":[0,0],"305":[0,0],"306":[0,0],"307":[0,0],"308":[0,0],"309":[0,0],"310":[0,0],"311":[0,0],"312":[0,0],"313":[0,0],"314":[0,0],"315":[0,0],"316":[0,0],"317":[0,0],"318":[0,0],"319":[0,0],"320":[0,0],"321":[0,0,0],"322":[0,0],"323":[0,0],"324":[0,0],"325":[0,0],"326":[0,0],"327":[0,0],"328":[0,0],"329":[0,0],"330":[0,0],"331":[0,0],"332":[0,0],"333":[0,0],"334":[0,0],"335":[0,0],"336":[0,0],"337":[0,0],"338":[0,0,0],"339":[0,0,0],"340":[0,0,0],"341":[0,0],"342":[0,0],"343":[0,0],"344":[0,0],"345":[0,0],"346":[0,0],"347":[0,0],"348":[0,0],"349":[0,0],"350":[0,0],"351":[0,0],"352":[0,0]},_coverageSchema:"1a1c01bbd47fc00a2c39e90264f33305004495a9",hash:"b527bc3bbffe3a4fee511c63590269cdc3ea500f"};var coverage=global[gcv]||(global[gcv]={});if(!coverage[path]||coverage[path].hash!==hash){coverage[path]=coverageData;}var actualCoverage=coverage[path];{// @ts-ignore -cov_1ks4ntaci2=function(){return actualCoverage;};}return actualCoverage;}cov_1ks4ntaci2();cov_1ks4ntaci2().s[0]++;/*!*/ // Copyright 2014 Splunk, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. -(function(){"use strict";cov_1ks4ntaci2().f[0]++;var Context=(cov_1ks4ntaci2().s[1]++,require('./context'));var Http=(cov_1ks4ntaci2().s[2]++,require('./http'));var Async=(cov_1ks4ntaci2().s[3]++,require('./async'));var Paths=(cov_1ks4ntaci2().s[4]++,require('./paths').Paths);var Class=(cov_1ks4ntaci2().s[5]++,require('./jquery.class').Class);var utils=(cov_1ks4ntaci2().s[6]++,require('./utils'));var root=(cov_1ks4ntaci2().s[7]++,(cov_1ks4ntaci2().b[0][0]++,exports)||(cov_1ks4ntaci2().b[0][1]++,this));var Service=(cov_1ks4ntaci2().s[8]++,null);/** - * Contains functionality common to Splunk Enterprise and Splunk Storm. - * - * This class is an implementation detail and is therefore SDK-private. - * - * @class splunkjs.private.BaseService - * @extends splunkjs.Context - */var BaseService=(cov_1ks4ntaci2().s[9]++,Context.extend({init:function(){cov_1ks4ntaci2().f[1]++;cov_1ks4ntaci2().s[10]++;this._super.apply(this,arguments);}}));/** - * Provides a root access point to Splunk functionality with typed access to - * Splunk resources such as searches, indexes, inputs, and more. Provides - * methods to authenticate and create specialized instances of the service. - * - * @class splunkjs.Service - * @extends splunkjs.private.BaseService - */cov_1ks4ntaci2().s[11]++;module.exports=root=Service=BaseService.extend({/** - * Constructor for `splunkjs.Service`. - * - * @constructor - * @param {splunkjs.Http} http An instance of a `splunkjs.Http` class. - * @param {Object} params A dictionary of optional parameters: - * - `scheme` (_string_): The scheme ("http" or "https") for accessing Splunk. - * - `host` (_string_): The host name (the default is "localhost"). - * - `port` (_integer_): The port number (the default is 8089). - * - `username` (_string_): The Splunk account username, which is used to authenticate the Splunk instance. - * - `password` (_string_): The password, which is used to authenticate the Splunk instance. - * - `owner` (_string_): The owner (username) component of the namespace. - * - `app` (_string_): The app component of the namespace. - * - `sessionKey` (_string_): The current session token. - * - `autologin` (_boolean_): `true` to automatically try to log in again if the session terminates, `false` if not (`true` by default). - * - `version` (_string_): The version string for Splunk, for example "4.3.2" (the default is "5.0"). - * @return {splunkjs.Service} A new `splunkjs.Service` instance. - * - * @method splunkjs.Service - */init:function(){cov_1ks4ntaci2().f[2]++;cov_1ks4ntaci2().s[12]++;this._super.apply(this,arguments);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[13]++;this.specialize=utils.bind(this,this.specialize);cov_1ks4ntaci2().s[14]++;this.apps=utils.bind(this,this.apps);cov_1ks4ntaci2().s[15]++;this.configurations=utils.bind(this,this.configurations);cov_1ks4ntaci2().s[16]++;this.indexes=utils.bind(this,this.indexes);cov_1ks4ntaci2().s[17]++;this.savedSearches=utils.bind(this,this.savedSearches);cov_1ks4ntaci2().s[18]++;this.jobs=utils.bind(this,this.jobs);cov_1ks4ntaci2().s[19]++;this.users=utils.bind(this,this.users);cov_1ks4ntaci2().s[20]++;this.currentUser=utils.bind(this,this.currentUser);cov_1ks4ntaci2().s[21]++;this.views=utils.bind(this,this.views);cov_1ks4ntaci2().s[22]++;this.firedAlertGroups=utils.bind(this,this.firedAlertGroups);cov_1ks4ntaci2().s[23]++;this.dataModels=utils.bind(this,this.dataModels);},/** - * Creates a specialized version of the current `Service` instance for - * a specific namespace context. - * - * @example - * - * var svc = ...; - * var newService = svc.specialize("myuser", "unix"); - * - * @param {String} owner The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * @param {String} app The app context for this resource (such as "search"). The "-" wildcard means all apps. - * @return {splunkjs.Service} The specialized `Service` instance. - * - * @method splunkjs.Service - */specialize:function(owner,app){cov_1ks4ntaci2().f[3]++;cov_1ks4ntaci2().s[24]++;return new Service(this.http,{scheme:this.scheme,host:this.host,port:this.port,username:this.username,password:this.password,owner:owner,app:app,sessionKey:this.sessionKey,version:this.version});},/** - * Gets the `Applications` collection, which allows you to - * list installed apps and retrieve information about them. - * - * @example - * - * // List installed apps - * var apps = svc.apps(); - * apps.fetch(function(err) { console.log(apps.list()); }); - * - * @return {splunkjs.Service.Collection} The `Applications` collection. - * - * @endpoint apps/local - * @method splunkjs.Service - * @see splunkjs.Service.Applications - */apps:function(){cov_1ks4ntaci2().f[4]++;cov_1ks4ntaci2().s[25]++;return new root.Applications(this);},/** - * Gets the `Configurations` collection, which lets you - * create, list, and retrieve configuration (.conf) files. - * - * @example - * - * // List all properties in the 'props.conf' file - * var files = svc.configurations(); - * files.item("props", function(err, propsFile) { - * propsFile.fetch(function(err, props) { - * console.log(props.properties()); - * }); - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Configurations} The `Configurations` collection. - * - * @endpoint configs - * @method splunkjs.Service - * @see splunkjs.Service.Configurations - */configurations:function(namespace){cov_1ks4ntaci2().f[5]++;cov_1ks4ntaci2().s[26]++;return new root.Configurations(this,namespace);},/** - * Gets the `Indexes` collection, which lets you create, - * list, and update indexes. - * - * @example - * - * // Check if we have an _internal index - * var indexes = svc.indexes(); - * indexes.fetch(function(err, indexes) { - * var index = indexes.item("_internal"); - * console.log("Was index found: " + !!index); - * // `index` is an Index object. - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Indexes} The `Indexes` collection. - * - * @endpoint data/indexes - * @method splunkjs.Service - * @see splunkjs.Service.Indexes - */indexes:function(namespace){cov_1ks4ntaci2().f[6]++;cov_1ks4ntaci2().s[27]++;return new root.Indexes(this,namespace);},/** - * Gets the `SavedSearches` collection, which lets you - * create, list, and update saved searches. - * - * @example - * - * // List all # of saved searches - * var savedSearches = svc.savedSearches(); - * savedSearches.fetch(function(err, savedSearches) { - * console.log("# Of Saved Searches: " + savedSearches.list().length); - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.SavedSearches} The `SavedSearches` collection. - * - * @endpoint saved/searches - * @method splunkjs.Service - * @see splunkjs.Service.SavedSearches - */savedSearches:function(namespace){cov_1ks4ntaci2().f[7]++;cov_1ks4ntaci2().s[28]++;return new root.SavedSearches(this,namespace);},/** - * Gets the `StoragePasswords` collection, which lets you - * create, list, and update storage passwords. - * - * @example - * - * // List all # of storage passwords - * var storagePasswords = svc.storagePasswords(); - * storagePasswords.fetch(function(err, storagePasswords) { - * console.log("# of Storage Passwords: " + storagePasswords.list().length); - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.StoragePasswords} The `StoragePasswords` collection. - * - * @endpoint storage/passwords - * @method splunkjs.Service - * @see splunkjs.Service.StoragePasswords - */storagePasswords:function(namespace){cov_1ks4ntaci2().f[8]++;cov_1ks4ntaci2().s[29]++;return new root.StoragePasswords(this,namespace);},/** - * Gets the `FiredAlertGroupCollection` collection, which lets you - * list alert groups. - * - * @example - * - * // List all # of fired alert groups - * var firedAlertGroups = svc.firedAlertGroups(); - * firedAlertGroups.fetch(function(err, firedAlertGroups) { - * console.log("# of alert groups: " + firedAlertGroups.list().length); - * }); - * - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.FiredAlertGroupCollection} The `FiredAlertGroupCollection` collection. - * - * @endpoint saved/searches - * @method splunkjs.Service - * @see splunkjs.Service.FiredAlertGroupCollection - */firedAlertGroups:function(namespace){cov_1ks4ntaci2().f[9]++;cov_1ks4ntaci2().s[30]++;return new root.FiredAlertGroupCollection(this,namespace);},/** - * Gets the `Jobs` collection, which lets you create, list, - * and retrieve search jobs. - * - * @example - * - * // List all job IDs - * var jobs = svc.jobs(); - * jobs.fetch(function(err, jobs) { - * var list = jobs.list(); - * for(var i = 0; i < list.length; i++) { - * console.log("Job " + (i+1) + ": " + list[i].sid); - * } - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Jobs} The `Jobs` collection. - * - * @endpoint search/jobs - * @method splunkjs.Service - * @see splunkjs.Service.Jobs - */jobs:function(namespace){cov_1ks4ntaci2().f[10]++;cov_1ks4ntaci2().s[31]++;return new root.Jobs(this,namespace);},/** - * Gets the `DataModels` collection, which lets you create, list, - * and retrieve data models. - * - * @endpoint datamodel/model - * @method splunkjs.Service - * @see splunkjs.Service.DataModels - */dataModels:function(namespace){cov_1ks4ntaci2().f[11]++;cov_1ks4ntaci2().s[32]++;return new root.DataModels(this,namespace);},/** - * Gets the `Users` collection, which lets you create, - * list, and retrieve users. - * - * @example - * - * // List all usernames - * var users = svc.users(); - * users.fetch(function(err, users) { - * var list = users.list(); - * for(var i = 0; i < list.length; i++) { - * console.log("User " + (i+1) + ": " + list[i].properties().name); - * } - * }); - * - * @return {splunkjs.Service.Users} The `Users` collection. - * - * @endpoint authorization/users - * @method splunkjs.Service - * @see splunkjs.Service.Users - */users:function(){cov_1ks4ntaci2().f[12]++;cov_1ks4ntaci2().s[33]++;return new root.Users(this);},/** - * Gets the `Views` collection, which lets you create, - * list, and retrieve views (custom UIs built in Splunk's app framework). - * - * @example - * - * // List all views - * var views = svc.views(); - * views.fetch(function(err, views) { - * var list = views.list(); - * for(var i = 0; i < list.length; i++) { - * console.log("View " + (i+1) + ": " + list[i].properties().name); - * } - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Views} The `Views` collection. - * - * @endpoint data/ui/views - * @method splunkjs.Service - * @see splunkjs.Service.Views - */views:function(namespace){cov_1ks4ntaci2().f[13]++;cov_1ks4ntaci2().s[34]++;return new root.Views(this,namespace);},/** - * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: - * - * - Use `exec_mode=normal` to return a search job ID immediately (default). - * Poll for completion to find out when you can retrieve search results. - * - * - Use `exec_mode=blocking` to return the search job ID when the search has finished. - * - * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.oneshotSearch`. - * - * @example - * - * service.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { - * console.log("CREATED": newJob.sid); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Function} callback A function to call with the created job: `(err, createdJob)`. - * - * @endpoint search/jobs - * @method splunkjs.Service - */search:function(query,params,namespace,callback){cov_1ks4ntaci2().f[14]++;cov_1ks4ntaci2().s[35]++;if((cov_1ks4ntaci2().b[2][0]++,!callback)&&(cov_1ks4ntaci2().b[2][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[1][0]++;cov_1ks4ntaci2().s[36]++;callback=namespace;cov_1ks4ntaci2().s[37]++;namespace=null;}else{cov_1ks4ntaci2().b[1][1]++;}var jobs=(cov_1ks4ntaci2().s[38]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[39]++;return jobs.search(query,params,callback);},/** - * A convenience method to get a `Job` by its sid. - * - * @param {String} sid The search ID for a search job. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Function} callback A function to call with the created job: `(err, job)`. - * - * @endpoint search/jobs - * @method splunkjs.Service - */getJob:function(sid,namespace,callback){cov_1ks4ntaci2().f[15]++;cov_1ks4ntaci2().s[40]++;if((cov_1ks4ntaci2().b[4][0]++,!callback)&&(cov_1ks4ntaci2().b[4][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[3][0]++;cov_1ks4ntaci2().s[41]++;callback=namespace;cov_1ks4ntaci2().s[42]++;namespace=null;}else{cov_1ks4ntaci2().b[3][1]++;}var job=(cov_1ks4ntaci2().s[43]++,new root.Job(this,sid,namespace));cov_1ks4ntaci2().s[44]++;return job.fetch({},callback);},/** - * Creates a oneshot search from a given search query and optional parameters. - * - * @example - * - * service.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { - * console.log("RESULT FIELDS": results.fields); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search: - * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). - * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `rf` (_string_): Specifies one or more fields to add to the search. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Function} callback A function to call with the results of the search: `(err, results)`. - * - * @endpoint search/jobs - * @method splunkjs.Service - */oneshotSearch:function(query,params,namespace,callback){cov_1ks4ntaci2().f[16]++;cov_1ks4ntaci2().s[45]++;if((cov_1ks4ntaci2().b[6][0]++,!callback)&&(cov_1ks4ntaci2().b[6][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[5][0]++;cov_1ks4ntaci2().s[46]++;callback=namespace;cov_1ks4ntaci2().s[47]++;namespace=null;}else{cov_1ks4ntaci2().b[5][1]++;}var jobs=(cov_1ks4ntaci2().s[48]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[49]++;return jobs.oneshotSearch(query,params,callback);},/** - * Gets the user that is currently logged in. - * - * @example - * - * service.currentUser(function(err, user) { - * console.log("Real name: ", user.properties().realname); - * }); - * - * @param {Function} callback A function to call with the user instance: `(err, user)`. - * @return {splunkjs.Service.currentUser} The `User`. - * - * @endpoint authorization/current-context - * @method splunkjs.Service - */currentUser:function(callback){cov_1ks4ntaci2().f[17]++;cov_1ks4ntaci2().s[50]++;callback=(cov_1ks4ntaci2().b[7][0]++,callback)||(cov_1ks4ntaci2().b[7][1]++,function(){cov_1ks4ntaci2().f[18]++;});var that=(cov_1ks4ntaci2().s[51]++,this);var req=(cov_1ks4ntaci2().s[52]++,this.get(Paths.currentUser,{},function(err,response){cov_1ks4ntaci2().f[19]++;cov_1ks4ntaci2().s[53]++;if(err){cov_1ks4ntaci2().b[8][0]++;cov_1ks4ntaci2().s[54]++;callback(err);}else{cov_1ks4ntaci2().b[8][1]++;var username=(cov_1ks4ntaci2().s[55]++,response.data.entry[0].content.username);var user=(cov_1ks4ntaci2().s[56]++,new root.User(that,username));cov_1ks4ntaci2().s[57]++;user.fetch(function(){cov_1ks4ntaci2().f[20]++;cov_1ks4ntaci2().s[58]++;if(req.wasAborted){cov_1ks4ntaci2().b[9][0]++;cov_1ks4ntaci2().s[59]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[9][1]++;cov_1ks4ntaci2().s[60]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[61]++;return req;},/** - * Gets configuration information about the server. - * - * @example - * - * service.serverInfo(function(err, info) { - * console.log("Splunk Version: ", info.properties().version); - * }); - * - * @param {Function} callback A function to call with the server info: `(err, info)`. - * - * @endpoint server/info - * @method splunkjs.Service - */serverInfo:function(callback){cov_1ks4ntaci2().f[21]++;cov_1ks4ntaci2().s[62]++;callback=(cov_1ks4ntaci2().b[10][0]++,callback)||(cov_1ks4ntaci2().b[10][1]++,function(){cov_1ks4ntaci2().f[22]++;});var serverInfo=(cov_1ks4ntaci2().s[63]++,new root.ServerInfo(this));cov_1ks4ntaci2().s[64]++;return serverInfo.fetch(callback);},/** - * Parses a search query. - * - * @example - * - * service.parse("search index=_internal | head 1", function(err, parse) { - * console.log("Commands: ", parse.commands); - * }); - * - * @param {String} query The search query to parse. - * @param {Object} params An object of options for the parser: - * - `enable_lookups` (_boolean_): If `true`, performs reverse lookups to expand the search expression. - * - `output_mode` (_string_): The output format (XML or JSON). - * - `parse_only` (_boolean_): If `true`, disables the expansion of search due to evaluation of subsearches, time term expansion, lookups, tags, eventtypes, and sourcetype alias. - * - `reload_macros` (_boolean_): If `true`, reloads macro definitions from macros.conf. - * @param {Function} callback A function to call with the parse info: `(err, parse)`. - * - * @endpoint search/parser - * @method splunkjs.Service - */parse:function(query,params,callback){cov_1ks4ntaci2().f[23]++;cov_1ks4ntaci2().s[65]++;if((cov_1ks4ntaci2().b[12][0]++,!callback)&&(cov_1ks4ntaci2().b[12][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[11][0]++;cov_1ks4ntaci2().s[66]++;callback=params;cov_1ks4ntaci2().s[67]++;params={};}else{cov_1ks4ntaci2().b[11][1]++;}cov_1ks4ntaci2().s[68]++;callback=(cov_1ks4ntaci2().b[13][0]++,callback)||(cov_1ks4ntaci2().b[13][1]++,function(){cov_1ks4ntaci2().f[24]++;});cov_1ks4ntaci2().s[69]++;params=(cov_1ks4ntaci2().b[14][0]++,params)||(cov_1ks4ntaci2().b[14][1]++,{});cov_1ks4ntaci2().s[70]++;params.q=query;cov_1ks4ntaci2().s[71]++;return this.get(Paths.parser,params,function(err,response){cov_1ks4ntaci2().f[25]++;cov_1ks4ntaci2().s[72]++;if(err){cov_1ks4ntaci2().b[15][0]++;cov_1ks4ntaci2().s[73]++;callback(err);}else{cov_1ks4ntaci2().b[15][1]++;cov_1ks4ntaci2().s[74]++;callback(null,response.data);}});},/** - * Provides auto-complete suggestions for search queries. - * - * @example - * - * service.typeahead("index=", 10, function(err, options) { - * console.log("Autocompletion options: ", options); - * }); - * - * @param {String} prefix The query fragment to autocomplete. - * @param {Number} count The number of options to return (optional). - * @param {Function} callback A function to call with the autocompletion info: `(err, options)`. - * - * @endpoint search/typeahead - * @method splunkjs.Service - */typeahead:function(prefix,count,callback){cov_1ks4ntaci2().f[26]++;cov_1ks4ntaci2().s[75]++;if((cov_1ks4ntaci2().b[17][0]++,!callback)&&(cov_1ks4ntaci2().b[17][1]++,utils.isFunction(count))){cov_1ks4ntaci2().b[16][0]++;cov_1ks4ntaci2().s[76]++;callback=count;cov_1ks4ntaci2().s[77]++;count=10;}else{cov_1ks4ntaci2().b[16][1]++;}cov_1ks4ntaci2().s[78]++;callback=(cov_1ks4ntaci2().b[18][0]++,callback)||(cov_1ks4ntaci2().b[18][1]++,function(){cov_1ks4ntaci2().f[27]++;});var params=(cov_1ks4ntaci2().s[79]++,{count:(cov_1ks4ntaci2().b[19][0]++,count)||(cov_1ks4ntaci2().b[19][1]++,10),prefix:prefix});cov_1ks4ntaci2().s[80]++;return this.get(Paths.typeahead,params,function(err,response){cov_1ks4ntaci2().f[28]++;cov_1ks4ntaci2().s[81]++;if(err){cov_1ks4ntaci2().b[20][0]++;cov_1ks4ntaci2().s[82]++;callback(err);}else{cov_1ks4ntaci2().b[20][1]++;var results=(cov_1ks4ntaci2().s[83]++,((cov_1ks4ntaci2().b[21][0]++,response.data)||(cov_1ks4ntaci2().b[21][1]++,{})).results);cov_1ks4ntaci2().s[84]++;callback(null,(cov_1ks4ntaci2().b[22][0]++,results)||(cov_1ks4ntaci2().b[22][1]++,[]));}});},/** - * Logs an event to Splunk. - * - * @example - * - * service.log("A new event", {index: "_internal", sourcetype: "mysourcetype"}, function(err, result) { - * console.log("Submitted event: ", result); - * }); - * - * @param {String|Object} event The text for this event, or a JSON object. - * @param {Object} params A dictionary of parameters for indexing: - * - `index` (_string_): The index to send events from this input to. - * - `host` (_string_): The value to populate in the Host field for events from this data input. - * - `host_regex` (_string_): A regular expression used to extract the host value from each event. - * - `source` (_string_): The value to populate in the Source field for events from this data input. - * - `sourcetype` (_string_): The value to populate in the Sourcetype field for events from this data input. - * @param {Function} callback A function to call when the event is submitted: `(err, result)`. - * - * @endpoint receivers/simple - * @method splunkjs.Service - */log:function(event,params,callback){cov_1ks4ntaci2().f[29]++;cov_1ks4ntaci2().s[85]++;if((cov_1ks4ntaci2().b[24][0]++,!callback)&&(cov_1ks4ntaci2().b[24][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[23][0]++;cov_1ks4ntaci2().s[86]++;callback=params;cov_1ks4ntaci2().s[87]++;params={};}else{cov_1ks4ntaci2().b[23][1]++;}cov_1ks4ntaci2().s[88]++;callback=(cov_1ks4ntaci2().b[25][0]++,callback)||(cov_1ks4ntaci2().b[25][1]++,function(){cov_1ks4ntaci2().f[30]++;});cov_1ks4ntaci2().s[89]++;params=(cov_1ks4ntaci2().b[26][0]++,params)||(cov_1ks4ntaci2().b[26][1]++,{});// If the event is a JSON object, convert it to a string. -cov_1ks4ntaci2().s[90]++;if(utils.isObject(event)){cov_1ks4ntaci2().b[27][0]++;cov_1ks4ntaci2().s[91]++;event=JSON.stringify(event);}else{cov_1ks4ntaci2().b[27][1]++;}var path=(cov_1ks4ntaci2().s[92]++,this.paths.submitEvent);var method=(cov_1ks4ntaci2().s[93]++,"POST");var headers=(cov_1ks4ntaci2().s[94]++,{"Content-Type":"text/plain"});var body=(cov_1ks4ntaci2().s[95]++,event);var get=(cov_1ks4ntaci2().s[96]++,params);var post=(cov_1ks4ntaci2().s[97]++,{});var req=(cov_1ks4ntaci2().s[98]++,this.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[31]++;cov_1ks4ntaci2().s[99]++;if(err){cov_1ks4ntaci2().b[28][0]++;cov_1ks4ntaci2().s[100]++;callback(err);}else{cov_1ks4ntaci2().b[28][1]++;cov_1ks4ntaci2().s[101]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[102]++;return req;}});/** - * Provides a base definition for a Splunk endpoint, which is a combination of - * a specific service and path. Provides convenience methods for GET, POST, and - * DELETE operations used in splunkjs, automatically preparing the path correctly - * and allowing for relative calls. - * - * @class splunkjs.Service.Endpoint - */cov_1ks4ntaci2().s[103]++;root.Endpoint=Class.extend({/** - * Constructor for `splunkjs.Service.Endpoint`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} qualifiedPath A fully-qualified relative endpoint path (for example, "/services/search/jobs"). - * @return {splunkjs.Service.Endpoint} A new `splunkjs.Service.Endpoint` instance. - * - * @method splunkjs.Service.Endpoint - */init:function(service,qualifiedPath){cov_1ks4ntaci2().f[32]++;cov_1ks4ntaci2().s[104]++;if(!service){cov_1ks4ntaci2().b[29][0]++;cov_1ks4ntaci2().s[105]++;throw new Error("Passed in a null Service.");}else{cov_1ks4ntaci2().b[29][1]++;}cov_1ks4ntaci2().s[106]++;if(!qualifiedPath){cov_1ks4ntaci2().b[30][0]++;cov_1ks4ntaci2().s[107]++;throw new Error("Passed in an empty path.");}else{cov_1ks4ntaci2().b[30][1]++;}cov_1ks4ntaci2().s[108]++;this.service=service;cov_1ks4ntaci2().s[109]++;this.qualifiedPath=qualifiedPath;// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[110]++;this.get=utils.bind(this,this.get);// this.get_v2 = utils.bind(this, this.get_v2); -cov_1ks4ntaci2().s[111]++;this.post=utils.bind(this,this.post);cov_1ks4ntaci2().s[112]++;this.del=utils.bind(this,this.del);},/** - * Performs a relative GET request on an endpoint's path, - * combined with the parameters and a relative path if specified. - * - * @example - * - * // Will make a request to {service.prefix}/search/jobs/123456/results?offset=1 - * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); - * endpoint.get("results", {offset: 1}, function() { console.log("DONE"))}); - * - * @param {String} relpath A relative path to append to the endpoint path. - * @param {Object} params A dictionary of entity-specific parameters to add to the query string. - * @param {Function} callback A function to call when the request is complete: `(err, response)`. - * - * @method splunkjs.Service.Endpoint - */get:function(relpath,params,callback){cov_1ks4ntaci2().f[33]++;var url=(cov_1ks4ntaci2().s[113]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[114]++;if(relpath){cov_1ks4ntaci2().b[31][0]++;cov_1ks4ntaci2().s[115]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[31][1]++;}cov_1ks4ntaci2().s[116]++;return this.service.get(url,params,callback);},get_v2:function(relpath,params){cov_1ks4ntaci2().f[34]++;var url=(cov_1ks4ntaci2().s[117]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[118]++;if(relpath){cov_1ks4ntaci2().b[32][0]++;cov_1ks4ntaci2().s[119]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[32][1]++;}cov_1ks4ntaci2().s[120]++;return this.service.get_v2(url,params);},/** - * Performs a relative POST request on an endpoint's path, - * combined with the parameters and a relative path if specified. - * - * @example - * - * // Will make a request to {service.prefix}/search/jobs/123456/control - * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); - * endpoint.post("control", {action: "cancel"}, function() { console.log("CANCELLED"))}); - * - * @param {String} relpath A relative path to append to the endpoint path. - * @param {Object} params A dictionary of entity-specific parameters to add to the body. - * @param {Function} callback A function to call when the request is complete: `(err, response)`. - * - * @method splunkjs.Service.Endpoint - */post:function(relpath,params,callback){cov_1ks4ntaci2().f[35]++;var url=(cov_1ks4ntaci2().s[121]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[122]++;if(relpath){cov_1ks4ntaci2().b[33][0]++;cov_1ks4ntaci2().s[123]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[33][1]++;}cov_1ks4ntaci2().s[124]++;return this.service.post(url,params,callback);},/** - * Performs a relative DELETE request on an endpoint's path, - * combined with the parameters and a relative path if specified. - * - * @example - * - * // Will make a request to {service.prefix}/search/jobs/123456 - * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); - * endpoint.delete("", {}, function() { console.log("DELETED"))}); - * - * @param {String} relpath A relative path to append to the endpoint path. - * @param {Object} params A dictionary of entity-specific parameters to add to the query string. - * @param {Function} callback A function to call when the request is complete: `(err, response)`. - * - * @method splunkjs.Service.Endpoint - */del:function(relpath,params,callback){cov_1ks4ntaci2().f[36]++;var url=(cov_1ks4ntaci2().s[125]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[126]++;if(relpath){cov_1ks4ntaci2().b[34][0]++;cov_1ks4ntaci2().s[127]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[34][1]++;}cov_1ks4ntaci2().s[128]++;return this.service.del(url,params,callback);}});/** - * Provides a base definition for a Splunk resource (for example, an entity - * such as an index or search job, or a collection of entities). Provides - * basic methods for handling Splunk resources, such as validation and - * accessing properties. - * - * This class should not be used directly because most methods are meant to be overridden. - * - * @class splunkjs.Service.Resource - * @extends splunkjs.Service.Endpoint - */cov_1ks4ntaci2().s[129]++;root.Resource=root.Endpoint.extend({/** - * Constructor for `splunkjs.Service.Resource`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} path A relative endpoint path (for example, "search/jobs"). - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Resource} A new `splunkjs.Service.Resource` instance. - * - * @method splunkjs.Service.Resource - */init:function(service,path,namespace){cov_1ks4ntaci2().f[37]++;var fullpath=(cov_1ks4ntaci2().s[130]++,service.fullpath(path,namespace));cov_1ks4ntaci2().s[131]++;this._super(service,fullpath);cov_1ks4ntaci2().s[132]++;this.namespace=namespace;cov_1ks4ntaci2().s[133]++;this._properties={};cov_1ks4ntaci2().s[134]++;this._state={};// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[135]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[136]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[137]++;this.properties=utils.bind(this,this.properties);cov_1ks4ntaci2().s[138]++;this.state=utils.bind(this,this.state);cov_1ks4ntaci2().s[139]++;this.path=utils.bind(this,this.path);},/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Resource - */path:function(){cov_1ks4ntaci2().f[38]++;cov_1ks4ntaci2().s[140]++;throw new Error("MUST BE OVERRIDDEN");},/** - * Loads the resource and stores the properties. - * - * @param {Object} properties The properties for this resource. - * - * @method splunkjs.Service.Resource - * @protected - */_load:function(properties){cov_1ks4ntaci2().f[39]++;cov_1ks4ntaci2().s[141]++;this._properties=(cov_1ks4ntaci2().b[35][0]++,properties)||(cov_1ks4ntaci2().b[35][1]++,{});cov_1ks4ntaci2().s[142]++;this._state=(cov_1ks4ntaci2().b[36][0]++,properties)||(cov_1ks4ntaci2().b[36][1]++,{});},/** - * Refreshes the resource by fetching the object from the server - * and loading it. - * - * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. - * - * @method splunkjs.Service.Resource - * @protected - */fetch:function(callback){cov_1ks4ntaci2().f[40]++;cov_1ks4ntaci2().s[143]++;throw new Error("MUST BE OVERRIDDEN");},/** - * Retrieves the current properties for this resource. - * - * @return {Object} The properties. - * - * @method splunkjs.Service.Resource - */properties:function(){cov_1ks4ntaci2().f[41]++;cov_1ks4ntaci2().s[144]++;return this._properties;},/** - * Retrieves the current full state (properties and metadata) of this resource. - * - * @return {Object} The current full state of this resource. - * - * @method splunkjs.Service.Resource - */state:function(){cov_1ks4ntaci2().f[42]++;cov_1ks4ntaci2().s[145]++;return this._state;}});/** - * Defines a base class for a Splunk entity, which is a well-defined construct - * with certain operations (such as "properties", "update", and "delete"). - * Entities include search jobs, indexes, inputs, apps, and more. - * - * Provides basic methods for working with Splunk entities, such as fetching and - * updating them. - * - * @class splunkjs.Service.Entity - * @extends splunkjs.Service.Resource - */cov_1ks4ntaci2().s[146]++;root.Entity=root.Resource.extend({/** - * A static property that indicates whether to call `fetch` after an - * update to get the updated entity. By default, the entity is not - * fetched because the endpoint returns (echoes) the updated entity. - * - * @method splunkjs.Service.Entity - */fetchOnUpdate:false,/** - * Constructor for `splunkjs.Service.Entity`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} path A relative endpoint path (for example, "search/jobs"). - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. - * - * @method splunkjs.Service.Entity - */init:function(service,path,namespace){cov_1ks4ntaci2().f[43]++;cov_1ks4ntaci2().s[147]++;this._super(service,path,namespace);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[148]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[149]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[150]++;this.remove=utils.bind(this,this.remove);cov_1ks4ntaci2().s[151]++;this.update=utils.bind(this,this.update);cov_1ks4ntaci2().s[152]++;this.fields=utils.bind(this,this.fields);cov_1ks4ntaci2().s[153]++;this.links=utils.bind(this,this.links);cov_1ks4ntaci2().s[154]++;this.acl=utils.bind(this,this.acl);cov_1ks4ntaci2().s[155]++;this.author=utils.bind(this,this.author);cov_1ks4ntaci2().s[156]++;this.updated=utils.bind(this,this.updated);cov_1ks4ntaci2().s[157]++;this.published=utils.bind(this,this.published);cov_1ks4ntaci2().s[158]++;this.enable=utils.bind(this,this.enable);cov_1ks4ntaci2().s[159]++;this.disable=utils.bind(this,this.disable);cov_1ks4ntaci2().s[160]++;this.reload=utils.bind(this,this.reload);// Initial values -cov_1ks4ntaci2().s[161]++;this._properties={};cov_1ks4ntaci2().s[162]++;this._fields={};cov_1ks4ntaci2().s[163]++;this._acl={};cov_1ks4ntaci2().s[164]++;this._links={};},/** - * Loads the entity and stores the properties. - * - * @param {Object} properties The properties for this entity. - * - * @method splunkjs.Service.Entity - * @protected - */_load:function(properties){cov_1ks4ntaci2().f[44]++;cov_1ks4ntaci2().s[165]++;properties=utils.isArray(properties)?(cov_1ks4ntaci2().b[37][0]++,properties[0]):(cov_1ks4ntaci2().b[37][1]++,properties);// Initialize the properties to -// empty values -cov_1ks4ntaci2().s[166]++;properties=(cov_1ks4ntaci2().b[38][0]++,properties)||(cov_1ks4ntaci2().b[38][1]++,{content:{},fields:{},acl:{},links:{}});cov_1ks4ntaci2().s[167]++;this._super(properties);// Take out the entity-specific content -cov_1ks4ntaci2().s[168]++;this._properties=(cov_1ks4ntaci2().b[39][0]++,properties.content)||(cov_1ks4ntaci2().b[39][1]++,{});cov_1ks4ntaci2().s[169]++;this._fields=(cov_1ks4ntaci2().b[40][0]++,properties.fields)||(cov_1ks4ntaci2().b[40][1]++,this._fields)||(cov_1ks4ntaci2().b[40][2]++,{});cov_1ks4ntaci2().s[170]++;this._acl=(cov_1ks4ntaci2().b[41][0]++,properties.acl)||(cov_1ks4ntaci2().b[41][1]++,{});cov_1ks4ntaci2().s[171]++;this._links=(cov_1ks4ntaci2().b[42][0]++,properties.links)||(cov_1ks4ntaci2().b[42][1]++,{});cov_1ks4ntaci2().s[172]++;this._author=(cov_1ks4ntaci2().b[43][0]++,properties.author)||(cov_1ks4ntaci2().b[43][1]++,null);cov_1ks4ntaci2().s[173]++;this._updated=(cov_1ks4ntaci2().b[44][0]++,properties.updated)||(cov_1ks4ntaci2().b[44][1]++,null);cov_1ks4ntaci2().s[174]++;this._published=(cov_1ks4ntaci2().b[45][0]++,properties.published)||(cov_1ks4ntaci2().b[45][1]++,null);},/** - * Retrieves the fields information for this entity, indicating which - * fields are wildcards, required, and optional. - * - * @return {Object} The fields information. - * - * @method splunkjs.Service.Entity - */fields:function(){cov_1ks4ntaci2().f[45]++;cov_1ks4ntaci2().s[175]++;return this._fields;},/** - * Retrieves the access control list (ACL) information for this entity, - * which contains the permissions for accessing the entity. - * - * @return {Object} The ACL. - * - * @method splunkjs.Service.Entity - */acl:function(){cov_1ks4ntaci2().f[46]++;cov_1ks4ntaci2().s[176]++;return this._acl;},/** - * Retrieves the links information for this entity, which is the URI of - * the entity relative to the management port of a Splunk instance. - * - * @return {Object} The links information. - * - * @method splunkjs.Service.Entity - */links:function(){cov_1ks4ntaci2().f[47]++;cov_1ks4ntaci2().s[177]++;return this._links;},/** - * Retrieves the author information for this entity. - * - * @return {String} The author. - * - * @method splunkjs.Service.Entity - */author:function(){cov_1ks4ntaci2().f[48]++;cov_1ks4ntaci2().s[178]++;return this._author;},/** - * Retrieves the updated time for this entity. - * - * @return {String} The updated time. - * - * @method splunkjs.Service.Entity - */updated:function(){cov_1ks4ntaci2().f[49]++;cov_1ks4ntaci2().s[179]++;return this._updated;},/** - * Retrieves the published time for this entity. - * - * @return {String} The published time. - * - * @method splunkjs.Service.Entity - */published:function(){cov_1ks4ntaci2().f[50]++;cov_1ks4ntaci2().s[180]++;return this._published;},/** - * Refreshes the entity by fetching the object from the server and - * loading it. - * - * @param {Object} options An optional dictionary of collection filtering and pagination options: - * - `count` (_integer_): The maximum number of items to return. - * - `offset` (_integer_): The offset of the first item to return. - * - `search` (_string_): The search query to filter responses. - * - `sort_dir` (_string_): The direction to sort returned items: “asc” or “desc”. - * - `sort_key` (_string_): The field to use for sorting (optional). - * - `sort_mode` (_string_): The collating sequence for sorting returned items: “auto”, “alpha”, “alpha_case”, or “num”. - * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. - * - * @method splunkjs.Service.Entity - */fetch:function(options,callback){cov_1ks4ntaci2().f[51]++;cov_1ks4ntaci2().s[181]++;if((cov_1ks4ntaci2().b[47][0]++,!callback)&&(cov_1ks4ntaci2().b[47][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[46][0]++;cov_1ks4ntaci2().s[182]++;callback=options;cov_1ks4ntaci2().s[183]++;options={};}else{cov_1ks4ntaci2().b[46][1]++;}cov_1ks4ntaci2().s[184]++;callback=(cov_1ks4ntaci2().b[48][0]++,callback)||(cov_1ks4ntaci2().b[48][1]++,function(){cov_1ks4ntaci2().f[52]++;});cov_1ks4ntaci2().s[185]++;options=(cov_1ks4ntaci2().b[49][0]++,options)||(cov_1ks4ntaci2().b[49][1]++,{});var that=(cov_1ks4ntaci2().s[186]++,this);cov_1ks4ntaci2().s[187]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[53]++;cov_1ks4ntaci2().s[188]++;if(err){cov_1ks4ntaci2().b[50][0]++;cov_1ks4ntaci2().s[189]++;callback(err);}else{cov_1ks4ntaci2().b[50][1]++;cov_1ks4ntaci2().s[190]++;that._load(response.data?(cov_1ks4ntaci2().b[51][0]++,response.data.entry):(cov_1ks4ntaci2().b[51][1]++,null));cov_1ks4ntaci2().s[191]++;callback(null,that);}});},/** - * Deletes the entity from the server. - * - * @param {Function} callback A function to call when the object is deleted: `(err)`. - * - * @method splunkjs.Service.Entity - * @protected - */remove:function(callback){cov_1ks4ntaci2().f[54]++;cov_1ks4ntaci2().s[192]++;callback=(cov_1ks4ntaci2().b[52][0]++,callback)||(cov_1ks4ntaci2().b[52][1]++,function(){cov_1ks4ntaci2().f[55]++;});var that=(cov_1ks4ntaci2().s[193]++,this);cov_1ks4ntaci2().s[194]++;return this.del("",{},function(err){cov_1ks4ntaci2().f[56]++;cov_1ks4ntaci2().s[195]++;callback(err);});},/** - * Updates the entity on the server. - * - * @param {Object} props The properties to update the object with. - * @param {Function} callback A function to call when the object is updated: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */update:function(props,callback){cov_1ks4ntaci2().f[57]++;cov_1ks4ntaci2().s[196]++;callback=(cov_1ks4ntaci2().b[53][0]++,callback)||(cov_1ks4ntaci2().b[53][1]++,function(){cov_1ks4ntaci2().f[58]++;});cov_1ks4ntaci2().s[197]++;if(props.hasOwnProperty("name")){cov_1ks4ntaci2().b[54][0]++;cov_1ks4ntaci2().s[198]++;throw new Error("Cannot set 'name' field in 'update'");}else{cov_1ks4ntaci2().b[54][1]++;}var that=(cov_1ks4ntaci2().s[199]++,this);var req=(cov_1ks4ntaci2().s[200]++,this.post("",props,function(err,response){cov_1ks4ntaci2().f[59]++;cov_1ks4ntaci2().s[201]++;if((cov_1ks4ntaci2().b[56][0]++,!err)&&(cov_1ks4ntaci2().b[56][1]++,!that.fetchOnUpdate)){cov_1ks4ntaci2().b[55][0]++;cov_1ks4ntaci2().s[202]++;that._load(response.data.entry);cov_1ks4ntaci2().s[203]++;callback(err,that);}else{cov_1ks4ntaci2().b[55][1]++;cov_1ks4ntaci2().s[204]++;if((cov_1ks4ntaci2().b[58][0]++,!err)&&(cov_1ks4ntaci2().b[58][1]++,that.fetchOnUpdate)){cov_1ks4ntaci2().b[57][0]++;cov_1ks4ntaci2().s[205]++;that.fetch(function(){cov_1ks4ntaci2().f[60]++;cov_1ks4ntaci2().s[206]++;if(req.wasAborted){cov_1ks4ntaci2().b[59][0]++;cov_1ks4ntaci2().s[207]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[59][1]++;cov_1ks4ntaci2().s[208]++;callback.apply(null,arguments);}});}else{cov_1ks4ntaci2().b[57][1]++;cov_1ks4ntaci2().s[209]++;callback(err,that);}}}));cov_1ks4ntaci2().s[210]++;return req;},/** - * Disables the entity on the server. - * - * @param {Function} callback A function to call when the object is disabled: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */disable:function(callback){cov_1ks4ntaci2().f[61]++;cov_1ks4ntaci2().s[211]++;callback=(cov_1ks4ntaci2().b[60][0]++,callback)||(cov_1ks4ntaci2().b[60][1]++,function(){cov_1ks4ntaci2().f[62]++;});var that=(cov_1ks4ntaci2().s[212]++,this);cov_1ks4ntaci2().s[213]++;this.post("disable",{},function(err,response){cov_1ks4ntaci2().f[63]++;cov_1ks4ntaci2().s[214]++;if(err){cov_1ks4ntaci2().b[61][0]++;cov_1ks4ntaci2().s[215]++;callback(err);}else{cov_1ks4ntaci2().b[61][1]++;cov_1ks4ntaci2().s[216]++;callback(null,that);}});},/** - * Enables the entity on the server. - * - * @param {Function} callback A function to call when the object is enabled: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */enable:function(callback){cov_1ks4ntaci2().f[64]++;cov_1ks4ntaci2().s[217]++;callback=(cov_1ks4ntaci2().b[62][0]++,callback)||(cov_1ks4ntaci2().b[62][1]++,function(){cov_1ks4ntaci2().f[65]++;});var that=(cov_1ks4ntaci2().s[218]++,this);cov_1ks4ntaci2().s[219]++;this.post("enable",{},function(err,response){cov_1ks4ntaci2().f[66]++;cov_1ks4ntaci2().s[220]++;if(err){cov_1ks4ntaci2().b[63][0]++;cov_1ks4ntaci2().s[221]++;callback(err);}else{cov_1ks4ntaci2().b[63][1]++;cov_1ks4ntaci2().s[222]++;callback(null,that);}});},/** - * Reloads the entity on the server. - * - * @param {Function} callback A function to call when the object is reloaded: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */reload:function(callback){cov_1ks4ntaci2().f[67]++;cov_1ks4ntaci2().s[223]++;callback=(cov_1ks4ntaci2().b[64][0]++,callback)||(cov_1ks4ntaci2().b[64][1]++,function(){cov_1ks4ntaci2().f[68]++;});var that=(cov_1ks4ntaci2().s[224]++,this);cov_1ks4ntaci2().s[225]++;this.post("_reload",{},function(err,response){cov_1ks4ntaci2().f[69]++;cov_1ks4ntaci2().s[226]++;if(err){cov_1ks4ntaci2().b[65][0]++;cov_1ks4ntaci2().s[227]++;callback(err);}else{cov_1ks4ntaci2().b[65][1]++;cov_1ks4ntaci2().s[228]++;callback(null,that);}});}});/** - * Defines a base class for a Splunk collection, which is a well-defined construct - * that provides basic methods for working with collections of entities, such as - * creating and listing entities. - * - * @class splunkjs.Service.Collection - * @extends splunkjs.Service.Resource - */cov_1ks4ntaci2().s[229]++;root.Collection=root.Resource.extend({/** - * A static property that indicates whether to call `fetch` after an - * entity has been created. By default, the entity is not fetched - * because the endpoint returns (echoes) the new entity. - - * @method splunkjs.Service.Collection - */fetchOnEntityCreation:false,/** - * Constructor for `splunkjs.Service.Collection`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} path A relative endpoint path (for example, "search/jobs"). - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Collection} A new `splunkjs.Service.Collection` instance. - * - * @method splunkjs.Service.Collection - */init:function(service,path,namespace){cov_1ks4ntaci2().f[70]++;cov_1ks4ntaci2().s[230]++;this._super(service,path,namespace);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[231]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[232]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[233]++;this.create=utils.bind(this,this.create);cov_1ks4ntaci2().s[234]++;this.list=utils.bind(this,this.list);cov_1ks4ntaci2().s[235]++;this.item=utils.bind(this,this.item);cov_1ks4ntaci2().s[236]++;this.instantiateEntity=utils.bind(this,this.instantiateEntity);// Initial values -cov_1ks4ntaci2().s[237]++;this._entities=[];cov_1ks4ntaci2().s[238]++;this._entitiesByName={};cov_1ks4ntaci2().s[239]++;this._properties={};cov_1ks4ntaci2().s[240]++;this._paging={};cov_1ks4ntaci2().s[241]++;this._links={};},/** - * Creates a local instance of an entity. - * - * @param {Object} props The properties for this entity. - * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. - * - * @method splunkjs.Service.Collection - */instantiateEntity:function(props){cov_1ks4ntaci2().f[71]++;cov_1ks4ntaci2().s[242]++;throw new Error("MUST BE OVERRIDDEN");},/** - * Loads the collection and properties, and creates a map of entity - * names to entity IDs (for retrieval purposes). - * - * @param {Object} properties The properties for this collection. - * - * @method splunkjs.Service.Collection - * @private - */_load:function(properties){cov_1ks4ntaci2().f[72]++;cov_1ks4ntaci2().s[243]++;this._super(properties);var entities=(cov_1ks4ntaci2().s[244]++,[]);var entitiesByName=(cov_1ks4ntaci2().s[245]++,{});var entityPropertyList=(cov_1ks4ntaci2().s[246]++,(cov_1ks4ntaci2().b[66][0]++,properties.entry)||(cov_1ks4ntaci2().b[66][1]++,[]));cov_1ks4ntaci2().s[247]++;for(var i=(cov_1ks4ntaci2().s[248]++,0);i1)&&(cov_1ks4ntaci2().b[90][1]++,!namespace)){cov_1ks4ntaci2().b[89][0]++;cov_1ks4ntaci2().s[302]++;// If there is more than one entity and we didn't -// specify a namespace, then we return an error -// saying the match is ambiguous -throw new Error("Ambiguous match for name '"+id+"'");}else{cov_1ks4ntaci2().b[89][1]++;cov_1ks4ntaci2().s[303]++;// There is more than one entity, and we do have -// a namespace, so we try and find it -for(var i=(cov_1ks4ntaci2().s[304]++,0);iPagination and Filtering options in the REST API documentation. - * @param {Function} callback A function to call when the history is retrieved: `(err, job, savedSearch)`. - * - * @endpoint saved/searches/{name}/history - * @method splunkjs.Service.SavedSearch - */history:function(options,callback){cov_1ks4ntaci2().f[97]++;cov_1ks4ntaci2().s[358]++;if((cov_1ks4ntaci2().b[106][0]++,!callback)&&(cov_1ks4ntaci2().b[106][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[105][0]++;cov_1ks4ntaci2().s[359]++;callback=options;cov_1ks4ntaci2().s[360]++;options={};}else{cov_1ks4ntaci2().b[105][1]++;}cov_1ks4ntaci2().s[361]++;callback=(cov_1ks4ntaci2().b[107][0]++,callback)||(cov_1ks4ntaci2().b[107][1]++,function(){cov_1ks4ntaci2().f[98]++;});cov_1ks4ntaci2().s[362]++;options=(cov_1ks4ntaci2().b[108][0]++,options)||(cov_1ks4ntaci2().b[108][1]++,{});var that=(cov_1ks4ntaci2().s[363]++,this);cov_1ks4ntaci2().s[364]++;return this.get("history",options,function(err,response){cov_1ks4ntaci2().f[99]++;cov_1ks4ntaci2().s[365]++;if(err){cov_1ks4ntaci2().b[109][0]++;cov_1ks4ntaci2().s[366]++;callback(err);cov_1ks4ntaci2().s[367]++;return;}else{cov_1ks4ntaci2().b[109][1]++;}var jobs=(cov_1ks4ntaci2().s[368]++,[]);var data=(cov_1ks4ntaci2().s[369]++,(cov_1ks4ntaci2().b[110][0]++,response.data.entry)||(cov_1ks4ntaci2().b[110][1]++,[]));cov_1ks4ntaci2().s[370]++;for(var i=(cov_1ks4ntaci2().s[371]++,0);iSaved search parameters on Splunk Developer Portal. - * @param {Function} callback A function to call when the object is updated: `(err, entity)`. - * - * @method splunkjs.Service.SavedSearch - */update:function(params,callback){cov_1ks4ntaci2().f[103]++;cov_1ks4ntaci2().s[382]++;params=(cov_1ks4ntaci2().b[112][0]++,params)||(cov_1ks4ntaci2().b[112][1]++,{});cov_1ks4ntaci2().s[383]++;if(!params.search){cov_1ks4ntaci2().b[113][0]++;var update=(cov_1ks4ntaci2().s[384]++,this._super);var req=(cov_1ks4ntaci2().s[385]++,this.fetch(function(err,search){cov_1ks4ntaci2().f[104]++;cov_1ks4ntaci2().s[386]++;if(err){cov_1ks4ntaci2().b[114][0]++;cov_1ks4ntaci2().s[387]++;callback(err);}else{cov_1ks4ntaci2().b[114][1]++;cov_1ks4ntaci2().s[388]++;params.search=search.properties().search;cov_1ks4ntaci2().s[389]++;update.call(search,params,function(){cov_1ks4ntaci2().f[105]++;cov_1ks4ntaci2().s[390]++;if(req.wasAborted){cov_1ks4ntaci2().b[115][0]++;cov_1ks4ntaci2().s[391]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[115][1]++;cov_1ks4ntaci2().s[392]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[393]++;return req;}else{cov_1ks4ntaci2().b[113][1]++;cov_1ks4ntaci2().s[394]++;return this._super(params,callback);}}});/** - * Represents a collection of saved searches. You can create and list saved - * searches using this collection container, or get a specific saved search. - * - * - * @endpoint saved/searches - * @class splunkjs.Service.SavedSearches - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[395]++;root.SavedSearches=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.SavedSearches - */path:function(){cov_1ks4ntaci2().f[106]++;cov_1ks4ntaci2().s[396]++;return Paths.savedSearches;},/** - * Creates a local instance of a saved search. - * - * @param {Object} props The properties for the new saved search. For a list of available parameters, see Saved search parameters on Splunk Developer Portal. - * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.SavedSearch` instance. - * - * @method splunkjs.Service.SavedSearches - */instantiateEntity:function(props){cov_1ks4ntaci2().f[107]++;var entityNamespace=(cov_1ks4ntaci2().s[397]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[398]++;return new root.SavedSearch(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.SavedSearches`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.SavedSearches} A new `splunkjs.Service.SavedSearches` instance. - * - * @method splunkjs.Service.SavedSearches - */init:function(service,namespace){cov_1ks4ntaci2().f[108]++;cov_1ks4ntaci2().s[399]++;this._super(service,this.path(),namespace);}});/** - * Represents a specific storage password, which you can then view, modify, and - * remove. - * - * @endpoint storage/passwords/{name} - * @class splunkjs.Service.StoragePassword - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[400]++;root.StoragePassword=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.StoragePassword - */path:function(){cov_1ks4ntaci2().f[109]++;cov_1ks4ntaci2().s[401]++;return Paths.storagePasswords+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.StoragePassword`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name for the new storage password. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.StoragePassword} A new `splunkjs.Service.StoragePassword` instance. - * - * @method splunkjs.Service.StoragePassword - */init:function(service,name,namespace){cov_1ks4ntaci2().f[110]++;cov_1ks4ntaci2().s[402]++;this.name=name;cov_1ks4ntaci2().s[403]++;this._super(service,this.path(),namespace);}});/** - * Represents a collection of storage passwords. You can create and list storage - * passwords using this collection container, or get a specific storage password. - * - * @endpoint storage/passwords - * @class splunkjs.Service.StoragePasswords - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[404]++;root.StoragePasswords=root.Collection.extend({/** - * Indicates whether to call `fetch` after an entity has been created. By - * default, the entity is not fetched because the endpoint returns - * (echoes) the new entity. - * - * @method splunkjs.Service.StoragePasswords - */fetchOnEntityCreation:true,/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.StoragePasswords - */path:function(){cov_1ks4ntaci2().f[111]++;cov_1ks4ntaci2().s[405]++;return Paths.storagePasswords;},/** - * Creates a local instance of a storage password. - * - * @param {Object} props The properties for the new storage password. For a list of available parameters, - * see - * POST storage/passwords on Splunk Developer Portal. - * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.StoragePassword` instance. - * - * @method splunkjs.Service.StoragePasswords - */instantiateEntity:function(props){cov_1ks4ntaci2().f[112]++;var entityNamespace=(cov_1ks4ntaci2().s[406]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[407]++;return new root.StoragePassword(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.StoragePasswords`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.StoragePasswords} A new `splunkjs.Service.StoragePasswords` instance. - * - * @method splunkjs.Service.StoragePasswords - */init:function(service,namespace){cov_1ks4ntaci2().f[113]++;cov_1ks4ntaci2().s[408]++;this._super(service,this.path(),namespace);}});/** - * Represents a fired alert. - * You can retrieve several of the fired alert's properties by - * the corresponding function name. - * - * @endpoint alerts/fired_alerts/{name} - * @class splunkjs.Service.FiredAlert - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[409]++;root.FiredAlert=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.FiredAlert - */path:function(){cov_1ks4ntaci2().f[114]++;cov_1ks4ntaci2().s[410]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** - * Returns this alert's actions (such as notifying by email, running a - * script, adding to RSS, tracking in Alert Manager, and enabling - * summary indexing). - * - * @return {Array} of actions, an empty {Array} if no actions - * @method splunkjs.Service.FiredAlert - */actions:function(){cov_1ks4ntaci2().f[115]++;cov_1ks4ntaci2().s[411]++;return(cov_1ks4ntaci2().b[116][0]++,this.properties().actions)||(cov_1ks4ntaci2().b[116][1]++,[]);},/** - * Returns this alert's type. - * - * @return {String} the alert's type. - * @method splunkjs.Service.FiredAlert - */alertType:function(){cov_1ks4ntaci2().f[116]++;cov_1ks4ntaci2().s[412]++;return(cov_1ks4ntaci2().b[117][0]++,this.properties().alert_type)||(cov_1ks4ntaci2().b[117][1]++,null);},/** - * Indicates whether the result is a set of events (digest) or a single - * event (per result). - * - * This method is available in Splunk 4.3 and later. - * - * @return {Boolean} true if the result is a digest, false if per result - * @method splunkjs.Service.FiredAlert - */isDigestMode:function(){cov_1ks4ntaci2().f[117]++;cov_1ks4ntaci2().s[413]++;// Convert this property to a Boolean -return!!this.properties().digest_mode;},/** - * Returns the rendered expiration time for this alert. - * - * This method is available in Splunk 4.3 and later. - * - * @return {String} - * @method splunkjs.Service.FiredAlert - */expirationTime:function(){cov_1ks4ntaci2().f[118]++;cov_1ks4ntaci2().s[414]++;return(cov_1ks4ntaci2().b[118][0]++,this.properties().expiration_time_rendered)||(cov_1ks4ntaci2().b[118][1]++,null);},/** - * Returns the saved search for this alert. - * - * @return {String} The saved search name, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */savedSearchName:function(){cov_1ks4ntaci2().f[119]++;cov_1ks4ntaci2().s[415]++;return(cov_1ks4ntaci2().b[119][0]++,this.properties().savedsearch_name)||(cov_1ks4ntaci2().b[119][1]++,null);},/** - * Returns this alert's severity on a scale of 1 to 10, with 1 being the - * highest severity. - * - * @return {Number} this alert's severity, -1 if not specified - * @method splunkjs.Service.FiredAlert - */severity:function(){cov_1ks4ntaci2().f[120]++;cov_1ks4ntaci2().s[416]++;return(cov_1ks4ntaci2().b[120][0]++,parseInt(this.properties().severity,10))||(cov_1ks4ntaci2().b[120][1]++,-1);},/** - * Returns this alert's search ID (SID). - * - * @return {String} This alert's SID, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */sid:function(){cov_1ks4ntaci2().f[121]++;cov_1ks4ntaci2().s[417]++;return(cov_1ks4ntaci2().b[121][0]++,this.properties().sid)||(cov_1ks4ntaci2().b[121][1]++,null);},/** - * Returns the time this alert was triggered. - * - * @return {Number} This alert's trigger time, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */triggerTime:function(){cov_1ks4ntaci2().f[122]++;cov_1ks4ntaci2().s[418]++;return(cov_1ks4ntaci2().b[122][0]++,this.properties().trigger_time)||(cov_1ks4ntaci2().b[122][1]++,null);},/** - * Returns this alert's rendered trigger time. - * - * This method is available in Splunk 4.3 and later. - * - * @return {String} This alert's rendered trigger time, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */triggerTimeRendered:function(){cov_1ks4ntaci2().f[123]++;cov_1ks4ntaci2().s[419]++;return(cov_1ks4ntaci2().b[123][0]++,this.properties().trigger_time_rendered)||(cov_1ks4ntaci2().b[123][1]++,null);},/** - * Returns the count of triggered alerts. - * - * This method is available in Splunk 4.3 and later. - * - * @return {Number} The number of triggered alerts, or -1 if not specified. - * @method splunkjs.Service.FiredAlert - */triggeredAlertCount:function(){cov_1ks4ntaci2().f[124]++;cov_1ks4ntaci2().s[420]++;return(cov_1ks4ntaci2().b[124][0]++,parseInt(this.properties().triggered_alerts,10))||(cov_1ks4ntaci2().b[124][1]++,-1);},/** - * Constructor for `splunkjs.Service.FiredAlert`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name for the new alert group. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.FiredAlert} A new `splunkjs.Service.FiredAlert` instance. - * - * @method splunkjs.Service.FiredAlert - */init:function(service,name,namespace){cov_1ks4ntaci2().f[125]++;cov_1ks4ntaci2().s[421]++;this.name=name;cov_1ks4ntaci2().s[422]++;this._super(service,this.path(),namespace);}});/** - * Represents a specific alert group, which you can then view and - * remove. - * - * @endpoint alerts/fired_alerts/{name} - * @class splunkjs.Service.FiredAlertGroup - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[423]++;root.FiredAlertGroup=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.FiredAlertGroup - */path:function(){cov_1ks4ntaci2().f[126]++;cov_1ks4ntaci2().s[424]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** - * Returns the `triggered_alert_count` property, the count - * of triggered alerts. - * - * @return {Number} the count of triggered alerts - * - * @method splunkjs.Service.FiredAlertGroup - */count:function(){cov_1ks4ntaci2().f[127]++;cov_1ks4ntaci2().s[425]++;return(cov_1ks4ntaci2().b[125][0]++,parseInt(this.properties().triggered_alert_count,10))||(cov_1ks4ntaci2().b[125][1]++,0);},/** - * Returns fired instances of this alert, which is - * a list of `splunkjs.Service.FiredAlert` instances. - * - * @example - * - * var alertGroup = service.firedAlertGroups().item("MyAlert"); - * alertGroup.list(function(err, firedAlerts, alert) { - * for(var i = 0; i < firedAlerts.length; i++) { - * console.log("Fired alert", i, ":", firedAlerts[i].sid); - * } - * }); - * - * @param {Function} callback A function to call when the fired alerts are retrieved: `(err, firedAlerts, alertGroup)`. - * - * @method splunkjs.Service.FiredAlertGroup - */list:function(options,callback){cov_1ks4ntaci2().f[128]++;cov_1ks4ntaci2().s[426]++;if((cov_1ks4ntaci2().b[127][0]++,!callback)&&(cov_1ks4ntaci2().b[127][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[126][0]++;cov_1ks4ntaci2().s[427]++;callback=options;cov_1ks4ntaci2().s[428]++;options={};}else{cov_1ks4ntaci2().b[126][1]++;}cov_1ks4ntaci2().s[429]++;callback=(cov_1ks4ntaci2().b[128][0]++,callback)||(cov_1ks4ntaci2().b[128][1]++,function(){cov_1ks4ntaci2().f[129]++;});cov_1ks4ntaci2().s[430]++;options=(cov_1ks4ntaci2().b[129][0]++,options)||(cov_1ks4ntaci2().b[129][1]++,{});var that=(cov_1ks4ntaci2().s[431]++,this);cov_1ks4ntaci2().s[432]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[130]++;cov_1ks4ntaci2().s[433]++;if(err){cov_1ks4ntaci2().b[130][0]++;cov_1ks4ntaci2().s[434]++;callback(err);cov_1ks4ntaci2().s[435]++;return;}else{cov_1ks4ntaci2().b[130][1]++;}var firedAlerts=(cov_1ks4ntaci2().s[436]++,[]);var data=(cov_1ks4ntaci2().s[437]++,(cov_1ks4ntaci2().b[131][0]++,response.data.entry)||(cov_1ks4ntaci2().b[131][1]++,[]));cov_1ks4ntaci2().s[438]++;for(var i=(cov_1ks4ntaci2().s[439]++,0);iPOST apps/local endpoint in the REST API documentation. - * @return {splunkjs.Service.Application} A new `splunkjs.Service.Application` instance. - * - * @method splunkjs.Service.Applications - */instantiateEntity:function(props){cov_1ks4ntaci2().f[145]++;cov_1ks4ntaci2().s[477]++;return new root.Application(this.service,props.name,{});},/** - * Constructor for `splunkjs.Service.Applications`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @return {splunkjs.Service.Applications} A new `splunkjs.Service.Applications` instance. - * - * @method splunkjs.Service.Applications - */init:function(service){cov_1ks4ntaci2().f[146]++;cov_1ks4ntaci2().s[478]++;this._super(service,this.path(),{});}});/** - * Provides access to configuration information about the server. - * - * @endpoint server/info - * @class splunkjs.Service.ServerInfo - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[479]++;root.ServerInfo=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.ServerInfo - */path:function(){cov_1ks4ntaci2().f[147]++;cov_1ks4ntaci2().s[480]++;return Paths.info;},/** - * Constructor for `splunkjs.Service.ServerInfo`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @return {splunkjs.Service.ServerInfo} A new `splunkjs.Service.ServerInfo` instance. - * - * @method splunkjs.Service.ServerInfo - */init:function(service){cov_1ks4ntaci2().f[148]++;cov_1ks4ntaci2().s[481]++;this.name="server-info";cov_1ks4ntaci2().s[482]++;this._super(service,this.path(),{});}});/** - * Represents a specific Splunk user, which you can view, modify, and - * remove. - * - * @endpoint authentication/users/{name} - * @class splunkjs.Service.User - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[483]++;root.User=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.User - */path:function(){cov_1ks4ntaci2().f[149]++;cov_1ks4ntaci2().s[484]++;return Paths.users+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.User`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The Splunk username. - * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. - * - * @method splunkjs.Service.User - */init:function(service,name){cov_1ks4ntaci2().f[150]++;cov_1ks4ntaci2().s[485]++;this.name=name;cov_1ks4ntaci2().s[486]++;this._super(service,this.path(),{});}});/** - * Represents a collection of users. You can create and list users using - * this collection container, or get a specific user. - * - * @endpoint authentication/users - * @class splunkjs.Service.Users - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[487]++;root.Users=root.Collection.extend({/** - * Indicates whether to call `fetch` after an entity has been created. By - * default, the entity is not fetched because the endpoint returns - * (echoes) the new entity. - * - * @method splunkjs.Service.Users - */fetchOnEntityCreation:true,/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Users - */path:function(){cov_1ks4ntaci2().f[151]++;cov_1ks4ntaci2().s[488]++;return Paths.users;},/** - * Creates a local instance of a user. - * - * @param {Object} props The properties for this new user. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. - * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. - * - * @method splunkjs.Service.Users - */instantiateEntity:function(props){cov_1ks4ntaci2().f[152]++;cov_1ks4ntaci2().s[489]++;return new root.User(this.service,props.name,{});},/** - * Constructor for `splunkjs.Service.Users`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @return {splunkjs.Service.Users} A new `splunkjs.Service.Users` instance. - * - * @method splunkjs.Service.Users - */init:function(service){cov_1ks4ntaci2().f[153]++;cov_1ks4ntaci2().s[490]++;this._super(service,this.path(),{});},/** - * Creates a new user. - * - * **Note:** This endpoint requires a special implementation. - * - * @param {Object} params A dictionary of properties. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. - * @param {Function} callback A function to call with the new entity: `(err, createdEntity)`. - * - * @method splunkjs.Service.Users - */create:function(params,callback){cov_1ks4ntaci2().f[154]++;cov_1ks4ntaci2().s[491]++;callback=(cov_1ks4ntaci2().b[136][0]++,callback)||(cov_1ks4ntaci2().b[136][1]++,function(){cov_1ks4ntaci2().f[155]++;});var that=(cov_1ks4ntaci2().s[492]++,this);var req=(cov_1ks4ntaci2().s[493]++,this.post("",params,function(err,response){cov_1ks4ntaci2().f[156]++;cov_1ks4ntaci2().s[494]++;if(err){cov_1ks4ntaci2().b[137][0]++;cov_1ks4ntaci2().s[495]++;callback(err);}else{cov_1ks4ntaci2().b[137][1]++;// This endpoint requires us to use the passed-in name -var props=(cov_1ks4ntaci2().s[496]++,{name:params.name});var entity=(cov_1ks4ntaci2().s[497]++,that.instantiateEntity(props));cov_1ks4ntaci2().s[498]++;entity.fetch(function(){cov_1ks4ntaci2().f[157]++;cov_1ks4ntaci2().s[499]++;if(req.wasAborted){cov_1ks4ntaci2().b[138][0]++;cov_1ks4ntaci2().s[500]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[138][1]++;cov_1ks4ntaci2().s[501]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[502]++;return req;}});/** - * Represents a specific Splunk view, which you can view, modify, and - * remove. - * - * @endpoint data/ui/views/{name} - * @class splunkjs.Service.View - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[503]++;root.View=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.View - */path:function(){cov_1ks4ntaci2().f[158]++;cov_1ks4ntaci2().s[504]++;return Paths.views+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.View`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name of the view. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. - * - * @method splunkjs.Service.View - */init:function(service,name,namespace){cov_1ks4ntaci2().f[159]++;cov_1ks4ntaci2().s[505]++;this.name=name;cov_1ks4ntaci2().s[506]++;this._super(service,this.path(),namespace);}});/** - * Represents a collection of views. You can create and list views using - * this collection container, or get a specific view. - * - * @endpoint data/ui/views - * @class splunkjs.Service.Views - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[507]++;root.Views=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Views - */path:function(){cov_1ks4ntaci2().f[160]++;cov_1ks4ntaci2().s[508]++;return Paths.views;},/** - * Creates a local instance of a view. - * - * @param {Object} props The properties for the new view. For a list of available parameters, see the POST scheduled/views/{name} endpoint in the REST API documentation. - * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. - * - * @method splunkjs.Service.Views - */instantiateEntity:function(props){cov_1ks4ntaci2().f[161]++;var entityNamespace=(cov_1ks4ntaci2().s[509]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[510]++;return new root.View(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.Views`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Views} A new `splunkjs.Service.Views` instance. - * - * @method splunkjs.Service.Views - */init:function(service,namespace){cov_1ks4ntaci2().f[162]++;cov_1ks4ntaci2().s[511]++;this._super(service,this.path(),namespace);}});/** - * Represents an index, which you can update and submit events to. - * - * @endpoint data/indexes/name - * @class splunkjs.Service.Index - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[512]++;root.Index=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Index - */path:function(){cov_1ks4ntaci2().f[163]++;cov_1ks4ntaci2().s[513]++;return Paths.indexes+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.Index`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name of the index. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. - * - * @method splunkjs.Service.Index - */init:function(service,name,namespace){cov_1ks4ntaci2().f[164]++;cov_1ks4ntaci2().s[514]++;this.name=name;cov_1ks4ntaci2().s[515]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[516]++;this.submitEvent=utils.bind(this,this.submitEvent);},/** - * Submits an event to this index. - * - * @example - * - * var index = service.indexes().item("_internal"); - * index.submitEvent("A new event", {sourcetype: "mysourcetype"}, function(err, result, index) { - * console.log("Submitted event: ", result); - * }); - * - * @param {String} event The text for this event. - * @param {Object} params A dictionary of parameters for indexing: - * - `host` (_string_): The value to populate in the host field for events from this data input. - * - `host_regex` (_string_): A regular expression used to extract the host value from each event. - * - `source` (_string_): The source value to fill in the metadata for this input's events. - * - `sourcetype` (_string_): The sourcetype to apply to events from this input. - * @param {Function} callback A function to call when the event is submitted: `(err, result, index)`. - * - * @endpoint receivers/simple?index={name} - * @method splunkjs.Service.Index - */submitEvent:function(event,params,callback){cov_1ks4ntaci2().f[165]++;cov_1ks4ntaci2().s[517]++;if((cov_1ks4ntaci2().b[140][0]++,!callback)&&(cov_1ks4ntaci2().b[140][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[139][0]++;cov_1ks4ntaci2().s[518]++;callback=params;cov_1ks4ntaci2().s[519]++;params={};}else{cov_1ks4ntaci2().b[139][1]++;}cov_1ks4ntaci2().s[520]++;callback=(cov_1ks4ntaci2().b[141][0]++,callback)||(cov_1ks4ntaci2().b[141][1]++,function(){cov_1ks4ntaci2().f[166]++;});cov_1ks4ntaci2().s[521]++;params=(cov_1ks4ntaci2().b[142][0]++,params)||(cov_1ks4ntaci2().b[142][1]++,{});// Add the index name -cov_1ks4ntaci2().s[522]++;params["index"]=this.name;var that=(cov_1ks4ntaci2().s[523]++,this);cov_1ks4ntaci2().s[524]++;return this.service.log(event,params,function(err,result){cov_1ks4ntaci2().f[167]++;cov_1ks4ntaci2().s[525]++;callback(err,result,that);});},remove:function(callback){cov_1ks4ntaci2().f[168]++;cov_1ks4ntaci2().s[526]++;if(this.service.versionCompare("5.0")<0){cov_1ks4ntaci2().b[143][0]++;cov_1ks4ntaci2().s[527]++;throw new Error("Indexes cannot be removed in Splunk 4.x");}else{cov_1ks4ntaci2().b[143][1]++;cov_1ks4ntaci2().s[528]++;return this._super(callback);}}});/** - * Represents a collection of indexes. You can create and list indexes using - * this collection container, or get a specific index. - * - * @endpoint data/indexes - * @class splunkjs.Service.Indexes - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[529]++;root.Indexes=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Indexes - */path:function(){cov_1ks4ntaci2().f[169]++;cov_1ks4ntaci2().s[530]++;return Paths.indexes;},/** - * Creates a local instance of an index. - * - * @param {Object} props The properties for the new index. For a list of available parameters, see Index parameters on Splunk Developer Portal. - * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. - * - * @method splunkjs.Service.Indexes - */instantiateEntity:function(props){cov_1ks4ntaci2().f[170]++;var entityNamespace=(cov_1ks4ntaci2().s[531]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[532]++;return new root.Index(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.Indexes`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Indexes} A new `splunkjs.Service.Indexes` instance. - * - * @method splunkjs.Service.Indexes - */init:function(service,namespace){cov_1ks4ntaci2().f[171]++;cov_1ks4ntaci2().s[533]++;this._super(service,this.path(),namespace);},/** - * Creates an index with the given name and parameters. - * - * @example - * - * var indexes = service.indexes(); - * indexes.create("NewIndex", {assureUTF8: true}, function(err, newIndex) { - * console.log("CREATED"); - * }); - * - * @param {String} name A name for this index. - * @param {Object} params A dictionary of properties. For a list of available parameters, see Index parameters on Splunk Developer Portal. - * @param {Function} callback A function to call with the new index: `(err, createdIndex)`. - * - * @endpoint data/indexes - * @method splunkjs.Service.Indexes - */create:function(name,params,callback){cov_1ks4ntaci2().f[172]++;cov_1ks4ntaci2().s[534]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[145][0]++,utils.isObject(name))&&(cov_1ks4ntaci2().b[145][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[145][2]++,!callback)){cov_1ks4ntaci2().b[144][0]++;cov_1ks4ntaci2().s[535]++;callback=params;cov_1ks4ntaci2().s[536]++;params=name;cov_1ks4ntaci2().s[537]++;name=params.name;}else{cov_1ks4ntaci2().b[144][1]++;}cov_1ks4ntaci2().s[538]++;params=(cov_1ks4ntaci2().b[146][0]++,params)||(cov_1ks4ntaci2().b[146][1]++,{});cov_1ks4ntaci2().s[539]++;params["name"]=name;cov_1ks4ntaci2().s[540]++;return this._super(params,callback);}});/** - * Represents a specific stanza, which you can update and remove, from a - * configuration file. - * - * @endpoint configs/conf-{file}/{name}` - * @class splunkjs.Service.ConfigurationStanza - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[541]++;root.ConfigurationStanza=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.ConfigurationStanza - */path:function(){cov_1ks4ntaci2().f[173]++;var name=(cov_1ks4ntaci2().s[542]++,this.name==="default"?(cov_1ks4ntaci2().b[147][0]++,"_new"):(cov_1ks4ntaci2().b[147][1]++,this.name));cov_1ks4ntaci2().s[543]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.file)+"/"+encodeURIComponent(name);},/** - * Constructor for `splunkjs.Service.ConfigurationStanza`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} file The name of the configuration file. - * @param {String} name The name of the new stanza. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. - * - * @method splunkjs.Service.ConfigurationStanza - */init:function(service,file,name,namespace){cov_1ks4ntaci2().f[174]++;cov_1ks4ntaci2().s[544]++;this.name=name;cov_1ks4ntaci2().s[545]++;this.file=file;cov_1ks4ntaci2().s[546]++;this._super(service,this.path(),namespace);}});/** - * Represents a collection of stanzas for a specific property file. You can - * create and list stanzas using this collection container, or get a specific - * stanza. - * - * @endpoint configs/conf-{file} - * @class splunkjs.Service.ConfigurationFile - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[547]++;root.ConfigurationFile=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.ConfigurationFile - */path:function(){cov_1ks4ntaci2().f[175]++;cov_1ks4ntaci2().s[548]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.name);},/** - * Creates a local instance of the default stanza in a configuration file. - * You cannot directly update the `ConfigurationStanza` returned by this function. - * - * This is equivalent to viewing `configs/conf-{file}/_new`. - * - * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. - * - * @method splunkjs.Service.ConfigurationFile - */getDefaultStanza:function(){cov_1ks4ntaci2().f[176]++;cov_1ks4ntaci2().s[549]++;return new root.ConfigurationStanza(this.service,this.name,"default",this.namespace);},/** - * Creates a local instance of a stanza in a configuration file. - * - * @param {Object} props The key-value properties for the new stanza. - * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. - * - * @method splunkjs.Service.ConfigurationFile - */instantiateEntity:function(props){cov_1ks4ntaci2().f[177]++;var entityNamespace=(cov_1ks4ntaci2().s[550]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[551]++;return new root.ConfigurationStanza(this.service,this.name,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.ConfigurationFile`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name of the configuration file. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. - * - * @method splunkjs.Service.ConfigurationFile - */init:function(service,name,namespace){cov_1ks4ntaci2().f[178]++;cov_1ks4ntaci2().s[552]++;this.name=name;cov_1ks4ntaci2().s[553]++;this._super(service,this.path(),namespace);},/** - * Creates a stanza in this configuration file. - * - * @example - * - * var file = service.configurations().item("props"); - * file.create("my_stanza", function(err, newStanza) { - * console.log("CREATED"); - * }); - * - * @param {String} stanzaName A name for this stanza. - * @param {Object} values A dictionary of key-value pairs to put in this stanza. - * @param {Function} callback A function to call with the created stanza: `(err, createdStanza)`. - * - * @endpoint configs/conf-{file} - * @method splunkjs.Service.ConfigurationFile - */create:function(stanzaName,values,callback){cov_1ks4ntaci2().f[179]++;cov_1ks4ntaci2().s[554]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[149][0]++,utils.isObject(stanzaName))&&(cov_1ks4ntaci2().b[149][1]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[149][2]++,!callback)){cov_1ks4ntaci2().b[148][0]++;cov_1ks4ntaci2().s[555]++;callback=values;cov_1ks4ntaci2().s[556]++;values=stanzaName;cov_1ks4ntaci2().s[557]++;stanzaName=values.name;}else{cov_1ks4ntaci2().b[148][1]++;}cov_1ks4ntaci2().s[558]++;if((cov_1ks4ntaci2().b[151][0]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[151][1]++,!callback)){cov_1ks4ntaci2().b[150][0]++;cov_1ks4ntaci2().s[559]++;callback=values;cov_1ks4ntaci2().s[560]++;values={};}else{cov_1ks4ntaci2().b[150][1]++;}cov_1ks4ntaci2().s[561]++;values=(cov_1ks4ntaci2().b[152][0]++,values)||(cov_1ks4ntaci2().b[152][1]++,{});cov_1ks4ntaci2().s[562]++;values["name"]=stanzaName;cov_1ks4ntaci2().s[563]++;return this._super(values,callback);}});/** - * Represents a collection of configuration files. You can create and list - * configuration files using this collection container, or get a specific file. - * - * @endpoint properties - * @class splunkjs.Service.Configurations - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[564]++;root.Configurations=root.Collection.extend({/** - * Indicates whether to call `fetch` after an entity has been created. By - * default, the entity is not fetched because the endpoint returns - * (echoes) the new entity. - * - * @method splunkjs.Service.Configurations - */fetchOnEntityCreation:true,/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Configurations - */path:function(){cov_1ks4ntaci2().f[180]++;cov_1ks4ntaci2().s[565]++;return Paths.properties;},/** - * Creates a local instance of a configuration file. - * - * @param {Object} props The properties for this configuration file. - * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. - * - * @method splunkjs.Service.Configurations - */instantiateEntity:function(props){cov_1ks4ntaci2().f[181]++;cov_1ks4ntaci2().s[566]++;return new root.ConfigurationFile(this.service,props.name,this.namespace);},/** - * Constructor for `splunkjs.Service.Configurations`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Configurations} A new `splunkjs.Service.Configurations` instance. - * - * @method splunkjs.Service.Configurations - */init:function(service,namespace){cov_1ks4ntaci2().f[182]++;cov_1ks4ntaci2().s[567]++;if((cov_1ks4ntaci2().b[154][0]++,!namespace)||(cov_1ks4ntaci2().b[154][1]++,namespace.owner==="-")||(cov_1ks4ntaci2().b[154][2]++,namespace.app==="-")){cov_1ks4ntaci2().b[153][0]++;cov_1ks4ntaci2().s[568]++;throw new Error("Configurations requires a non-wildcard owner/app");}else{cov_1ks4ntaci2().b[153][1]++;}cov_1ks4ntaci2().s[569]++;this._super(service,this.path(),namespace);},/** - * Creates a configuration file. - * - * @example - * - * var configurations = service.configurations(); - * configurations.create("myprops", function(err, newFile) { - * console.log("CREATED"); - * }); - * - * @param {String} filename A name for this configuration file. - * @param {Function} callback A function to call with the new configuration file: `(err, createdFile)`. - * - * @endpoint properties - * @method splunkjs.Service.Configurations - */create:function(filename,callback){cov_1ks4ntaci2().f[183]++;cov_1ks4ntaci2().s[570]++;// If someone called us with the default style of (params, callback), -// lets make it work -if(utils.isObject(filename)){cov_1ks4ntaci2().b[155][0]++;cov_1ks4ntaci2().s[571]++;filename=filename["__conf"];}else{cov_1ks4ntaci2().b[155][1]++;}cov_1ks4ntaci2().s[572]++;callback=(cov_1ks4ntaci2().b[156][0]++,callback)||(cov_1ks4ntaci2().b[156][1]++,function(){cov_1ks4ntaci2().f[184]++;});var that=(cov_1ks4ntaci2().s[573]++,this);var req=(cov_1ks4ntaci2().s[574]++,this.post("",{__conf:filename},function(err,response){cov_1ks4ntaci2().f[185]++;cov_1ks4ntaci2().s[575]++;if(err){cov_1ks4ntaci2().b[157][0]++;cov_1ks4ntaci2().s[576]++;callback(err);}else{cov_1ks4ntaci2().b[157][1]++;var entity=(cov_1ks4ntaci2().s[577]++,new root.ConfigurationFile(that.service,filename));cov_1ks4ntaci2().s[578]++;entity.fetch(function(){cov_1ks4ntaci2().f[186]++;cov_1ks4ntaci2().s[579]++;if(req.wasAborted){cov_1ks4ntaci2().b[158][0]++;cov_1ks4ntaci2().s[580]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[158][1]++;cov_1ks4ntaci2().s[581]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[582]++;return req;},doesFileExist:async function(filename){cov_1ks4ntaci2().f[187]++;cov_1ks4ntaci2().s[583]++;try{var that=(cov_1ks4ntaci2().s[584]++,this);// 1. Fetch files list -var response=(cov_1ks4ntaci2().s[585]++,await this.get_v2("",{__conf:filename}));// 2. Filter the files -var files=(cov_1ks4ntaci2().s[586]++,response?.body?.entry?.filter(f=>{cov_1ks4ntaci2().f[188]++;cov_1ks4ntaci2().s[587]++;return f.name===filename;}));// 2. Check if the file exists -cov_1ks4ntaci2().s[588]++;if((cov_1ks4ntaci2().b[160][0]++,files)&&(cov_1ks4ntaci2().b[160][1]++,files.length==0)){cov_1ks4ntaci2().b[159][0]++;cov_1ks4ntaci2().s[589]++;return{code:"FILE_NOT_FOUND",message:`File with the name '${filename}' does not exist.`};}else{cov_1ks4ntaci2().b[159][1]++;}// 3. Create a local instance -var configurationFile=(cov_1ks4ntaci2().s[590]++,new root.ConfigurationFile(that.service,filename));// 4. Load the file content -var fetchedFile=(cov_1ks4ntaci2().s[591]++,await configurationFile.fetch_v2());cov_1ks4ntaci2().s[592]++;return{file:fetchedFile};}catch(error){cov_1ks4ntaci2().s[593]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},doesStanzaExist:async function(file,stanza){cov_1ks4ntaci2().f[189]++;cov_1ks4ntaci2().s[594]++;try{// 1. check if the stanza exists -var fetchedStanza=(cov_1ks4ntaci2().s[595]++,file.item(stanza));cov_1ks4ntaci2().s[596]++;if(!fetchedStanza){cov_1ks4ntaci2().b[161][0]++;cov_1ks4ntaci2().s[597]++;return{code:"STANZA_NOT_FOUND",message:`Stanza with the name '${stanza}' does not exist.`};}else{cov_1ks4ntaci2().b[161][1]++;cov_1ks4ntaci2().s[598]++;return{stanza:fetchedStanza};}}catch(error){cov_1ks4ntaci2().s[599]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},create_v2:async function(configs,svc,filename,stanza,keyValueMap,callback){cov_1ks4ntaci2().f[190]++;cov_1ks4ntaci2().s[600]++;callback=(cov_1ks4ntaci2().b[162][0]++,callback)||(cov_1ks4ntaci2().b[162][1]++,function(){cov_1ks4ntaci2().f[191]++;});var that=(cov_1ks4ntaci2().s[601]++,this);// 1. Check if the file exists -var doesFileExistResponse=(cov_1ks4ntaci2().s[602]++,await this.doesFileExist(filename));var configFile=(cov_1ks4ntaci2().s[603]++,doesFileExistResponse.file);// 2. If the file doesn't exist, create a new file -cov_1ks4ntaci2().s[604]++;if(!configFile){cov_1ks4ntaci2().b[163][0]++;cov_1ks4ntaci2().s[605]++;console.log(doesFileExistResponse);cov_1ks4ntaci2().s[606]++;console.log("Creating a new configuration file...");cov_1ks4ntaci2().s[607]++;that.create({__conf:filename},(err,newFile)=>{cov_1ks4ntaci2().f[192]++;cov_1ks4ntaci2().s[608]++;return console.log(`Configuration File created: ${filename}`);});cov_1ks4ntaci2().s[609]++;configFile=new root.ConfigurationFile(that.service,filename);cov_1ks4ntaci2().s[610]++;configFile=await configFile.fetch_v2();}else{cov_1ks4ntaci2().b[163][1]++;}// 2. Check if the stanza exists -var doesStanzaExistResponse=(cov_1ks4ntaci2().s[611]++,await this.doesStanzaExist(configFile,stanza));var configStanza=(cov_1ks4ntaci2().s[612]++,doesStanzaExistResponse.stanza);// 3. If the stanza doesn't exist, create a new stanza with given keyValueMap -cov_1ks4ntaci2().s[613]++;if(!configStanza){cov_1ks4ntaci2().b[164][0]++;cov_1ks4ntaci2().s[614]++;console.log(doesStanzaExistResponse);cov_1ks4ntaci2().s[615]++;console.log("Creating a new configuration stanza...");cov_1ks4ntaci2().s[616]++;configFile.create(stanza,keyValueMap,function(err,newStanza){cov_1ks4ntaci2().f[193]++;cov_1ks4ntaci2().s[617]++;console.log(`Configuration Stanza created: ${stanza}`);cov_1ks4ntaci2().s[618]++;callback();});}// 4. If the stanza exists, update it with the keyValueMap -else{cov_1ks4ntaci2().b[164][1]++;cov_1ks4ntaci2().s[619]++;configStanza.update(keyValueMap,(err,updatedStanza)=>{cov_1ks4ntaci2().f[194]++;cov_1ks4ntaci2().s[620]++;console.log(`Configuration Stanza updated: ${stanza}`);cov_1ks4ntaci2().s[621]++;callback();});}}});/** - * Represents a specific search job. You can perform different operations - * on this job, such as reading its status, canceling it, and getting results. - * - * @endpoint search/jobs/{search_id} - * @class splunkjs.Service.Job - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[622]++;root.Job=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Job - */path:function(){cov_1ks4ntaci2().f[195]++;cov_1ks4ntaci2().s[623]++;return Paths.jobs+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.Job`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} sid The search ID for this search job. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. - * - * @method splunkjs.Service.Job - */init:function(service,sid,namespace){cov_1ks4ntaci2().f[196]++;cov_1ks4ntaci2().s[624]++;this.name=sid;cov_1ks4ntaci2().s[625]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[626]++;this.sid=sid;// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[627]++;this.cancel=utils.bind(this,this.cancel);cov_1ks4ntaci2().s[628]++;this.disablePreview=utils.bind(this,this.disablePreview);cov_1ks4ntaci2().s[629]++;this.enablePreview=utils.bind(this,this.enablePreview);cov_1ks4ntaci2().s[630]++;this.events=utils.bind(this,this.events);cov_1ks4ntaci2().s[631]++;this.finalize=utils.bind(this,this.finalize);cov_1ks4ntaci2().s[632]++;this.pause=utils.bind(this,this.pause);cov_1ks4ntaci2().s[633]++;this.preview=utils.bind(this,this.preview);cov_1ks4ntaci2().s[634]++;this.results=utils.bind(this,this.results);cov_1ks4ntaci2().s[635]++;this.searchlog=utils.bind(this,this.searchlog);cov_1ks4ntaci2().s[636]++;this.setPriority=utils.bind(this,this.setPriority);cov_1ks4ntaci2().s[637]++;this.setTTL=utils.bind(this,this.setTTL);cov_1ks4ntaci2().s[638]++;this.summary=utils.bind(this,this.summary);cov_1ks4ntaci2().s[639]++;this.timeline=utils.bind(this,this.timeline);cov_1ks4ntaci2().s[640]++;this.touch=utils.bind(this,this.touch);cov_1ks4ntaci2().s[641]++;this.unpause=utils.bind(this,this.unpause);},/** - * Cancels a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.cancel(function(err) { - * console.log("CANCELLED"); - * }); - * - * @param {Function} callback A function to call when the search is done: `(err)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */cancel:function(callback){cov_1ks4ntaci2().f[197]++;var req=(cov_1ks4ntaci2().s[642]++,this.post("control",{action:"cancel"},callback));cov_1ks4ntaci2().s[643]++;return req;},/** - * Disables preview generation for a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.disablePreview(function(err, job) { - * console.log("PREVIEW DISABLED"); - * }); - * - * @param {Function} callback A function to call with this search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */disablePreview:function(callback){cov_1ks4ntaci2().f[198]++;cov_1ks4ntaci2().s[644]++;callback=(cov_1ks4ntaci2().b[165][0]++,callback)||(cov_1ks4ntaci2().b[165][1]++,function(){cov_1ks4ntaci2().f[199]++;});var that=(cov_1ks4ntaci2().s[645]++,this);var req=(cov_1ks4ntaci2().s[646]++,this.post("control",{action:"disablepreview"},function(err){cov_1ks4ntaci2().f[200]++;cov_1ks4ntaci2().s[647]++;callback(err,that);}));cov_1ks4ntaci2().s[648]++;return req;},/** - * Enables preview generation for a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.disablePreview(function(err, job) { - * console.log("PREVIEW ENABLED"); - * }); - * - * @param {Function} callback A function to call with this search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */enablePreview:function(callback){cov_1ks4ntaci2().f[201]++;cov_1ks4ntaci2().s[649]++;callback=(cov_1ks4ntaci2().b[166][0]++,callback)||(cov_1ks4ntaci2().b[166][1]++,function(){cov_1ks4ntaci2().f[202]++;});var that=(cov_1ks4ntaci2().s[650]++,this);var req=(cov_1ks4ntaci2().s[651]++,this.post("control",{action:"enablepreview"},function(err){cov_1ks4ntaci2().f[203]++;cov_1ks4ntaci2().s[652]++;callback(err,that);}));cov_1ks4ntaci2().s[653]++;return req;},/** - * Returns the events of a search job with given parameters. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.events({count: 10}, function(err, events, job) { - * console.log("Fields: ", events.fields); - * }); - * - * @param {Object} params The parameters for retrieving events. For a list of available parameters, see the GET search/jobs/{search_id}/events endpoint in the REST API documentation. - * @param {Function} callback A function to call when the events are retrieved: `(err, events, job)`. - * - * @endpoint search/jobs/{search_id}/events - * @method splunkjs.Service.Job - */events:function(params,callback){cov_1ks4ntaci2().f[204]++;cov_1ks4ntaci2().s[654]++;callback=(cov_1ks4ntaci2().b[167][0]++,callback)||(cov_1ks4ntaci2().b[167][1]++,function(){cov_1ks4ntaci2().f[205]++;});cov_1ks4ntaci2().s[655]++;params=(cov_1ks4ntaci2().b[168][0]++,params)||(cov_1ks4ntaci2().b[168][1]++,{});cov_1ks4ntaci2().s[656]++;params.output_mode=(cov_1ks4ntaci2().b[169][0]++,params.output_mode)||(cov_1ks4ntaci2().b[169][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[657]++,this);cov_1ks4ntaci2().s[658]++;return this.get("events",params,function(err,response){cov_1ks4ntaci2().f[206]++;cov_1ks4ntaci2().s[659]++;if(err){cov_1ks4ntaci2().b[170][0]++;cov_1ks4ntaci2().s[660]++;callback(err);}else{cov_1ks4ntaci2().b[170][1]++;cov_1ks4ntaci2().s[661]++;callback(null,response.data,that);}});},/** - * Finalizes a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.finalize(function(err, job) { - * console.log("JOB FINALIZED"); - * }); - * - * @param {Function} callback A function to call with the job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */finalize:function(callback){cov_1ks4ntaci2().f[207]++;cov_1ks4ntaci2().s[662]++;callback=(cov_1ks4ntaci2().b[171][0]++,callback)||(cov_1ks4ntaci2().b[171][1]++,function(){cov_1ks4ntaci2().f[208]++;});var that=(cov_1ks4ntaci2().s[663]++,this);var req=(cov_1ks4ntaci2().s[664]++,this.post("control",{action:"finalize"},function(err){cov_1ks4ntaci2().f[209]++;cov_1ks4ntaci2().s[665]++;callback(err,that);}));cov_1ks4ntaci2().s[666]++;return req;},/** - * Returns an iterator over this search job's events or results. - * - * @param {String} type One of {"events", "preview", "results"}. - * @param {Object} params A dictionary of optional parameters: - * - `pagesize` (_integer_): The number of items to return on each request. Defaults to as many as possible. - * @return {Object} An iterator object with a `next(callback)` method, where `callback` is of the form `(err, results, hasMoreResults)`. - * - * @endpoint search/jobs/{search_id}/results - * @method splunkjs.Service.Job - */iterator:function(type,params){cov_1ks4ntaci2().f[210]++;cov_1ks4ntaci2().s[667]++;return new root.PaginatedEndpointIterator(this[type],params);},/** - * Pauses a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.pause(function(err, job) { - * console.log("JOB PAUSED"); - * }); - * - * @param {Function} callback A function to call with the job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */pause:function(callback){cov_1ks4ntaci2().f[211]++;cov_1ks4ntaci2().s[668]++;callback=(cov_1ks4ntaci2().b[172][0]++,callback)||(cov_1ks4ntaci2().b[172][1]++,function(){cov_1ks4ntaci2().f[212]++;});var that=(cov_1ks4ntaci2().s[669]++,this);var req=(cov_1ks4ntaci2().s[670]++,this.post("control",{action:"pause"},function(err){cov_1ks4ntaci2().f[213]++;cov_1ks4ntaci2().s[671]++;callback(err,that);}));cov_1ks4ntaci2().s[672]++;return req;},/* - * Gets the preview results for a search job with given parameters. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.preview({count: 10}, function(err, results, job) { - * console.log("Fields: ", results.fields); - * }); - * - * @param {Object} params The parameters for retrieving preview results. For a list of available parameters, see the GET search/jobs/{search_id}/results_preview endpoint in the REST API documentation. - * @param {Function} callback A function to call when the preview results are retrieved : `(err, results, job)`. - * - * @endpoint search/jobs/{search_id}/results_preview - * @method splunkjs.Service.Job - */preview:function(params,callback){cov_1ks4ntaci2().f[214]++;cov_1ks4ntaci2().s[673]++;callback=(cov_1ks4ntaci2().b[173][0]++,callback)||(cov_1ks4ntaci2().b[173][1]++,function(){cov_1ks4ntaci2().f[215]++;});cov_1ks4ntaci2().s[674]++;params=(cov_1ks4ntaci2().b[174][0]++,params)||(cov_1ks4ntaci2().b[174][1]++,{});cov_1ks4ntaci2().s[675]++;params.output_mode=(cov_1ks4ntaci2().b[175][0]++,params.output_mode)||(cov_1ks4ntaci2().b[175][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[676]++,this);cov_1ks4ntaci2().s[677]++;return this.get("results_preview",params,function(err,response){cov_1ks4ntaci2().f[216]++;cov_1ks4ntaci2().s[678]++;if(err){cov_1ks4ntaci2().b[176][0]++;cov_1ks4ntaci2().s[679]++;callback(err);}else{cov_1ks4ntaci2().b[176][1]++;cov_1ks4ntaci2().s[680]++;callback(null,response.data,that);}});},/** - * Gets the results for a search job with given parameters. - * - * The callback can get `undefined` for its `results` parameter if the - * job is not yet done. To avoid this, use the `Job.track()` method to - * wait until the job is complete prior to fetching the results with - * this method. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.results({count: 10}, function(err, results, job) { - * console.log("Fields: ", results.results); - * }); - * - * @param {Object} params The parameters for retrieving search results. For a list of available parameters, see the GET search/jobs/{search_id}/results endpoint in the REST API documentation. - * @param {Function} callback A function to call when the results are retrieved: `(err, results, job)`. - * - * @endpoint search/jobs/{search_id}/results - * @method splunkjs.Service.Job - */results:function(params,callback){cov_1ks4ntaci2().f[217]++;cov_1ks4ntaci2().s[681]++;callback=(cov_1ks4ntaci2().b[177][0]++,callback)||(cov_1ks4ntaci2().b[177][1]++,function(){cov_1ks4ntaci2().f[218]++;});cov_1ks4ntaci2().s[682]++;params=(cov_1ks4ntaci2().b[178][0]++,params)||(cov_1ks4ntaci2().b[178][1]++,{});cov_1ks4ntaci2().s[683]++;params.output_mode=(cov_1ks4ntaci2().b[179][0]++,params.output_mode)||(cov_1ks4ntaci2().b[179][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[684]++,this);cov_1ks4ntaci2().s[685]++;return this.get("results",params,function(err,response){cov_1ks4ntaci2().f[219]++;cov_1ks4ntaci2().s[686]++;if(err){cov_1ks4ntaci2().b[180][0]++;cov_1ks4ntaci2().s[687]++;callback(err);}else{cov_1ks4ntaci2().b[180][1]++;cov_1ks4ntaci2().s[688]++;callback(null,response.data,that);}});},/** - * Gets the search log for this search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.searchlog(function(err, searchlog, job) { - * console.log(searchlog); - * }); - * - * @param {Function} callback A function to call with the search log and job: `(err, searchlog, job)`. - * - * @endpoint search/jobs/{search_id}/search.log - * @method splunkjs.Service.Job - */searchlog:function(callback){cov_1ks4ntaci2().f[220]++;cov_1ks4ntaci2().s[689]++;callback=(cov_1ks4ntaci2().b[181][0]++,callback)||(cov_1ks4ntaci2().b[181][1]++,function(){cov_1ks4ntaci2().f[221]++;});var that=(cov_1ks4ntaci2().s[690]++,this);cov_1ks4ntaci2().s[691]++;return this.get("search.log",{},function(err,response){cov_1ks4ntaci2().f[222]++;cov_1ks4ntaci2().s[692]++;if(err){cov_1ks4ntaci2().b[182][0]++;cov_1ks4ntaci2().s[693]++;callback(err);}else{cov_1ks4ntaci2().b[182][1]++;cov_1ks4ntaci2().s[694]++;callback(null,response.data,that);}});},/** - * Sets the priority for this search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.setPriority(6, function(err, job) { - * console.log("JOB PRIORITY SET"); - * }); - * - * @param {Number} value The priority (an integer between 1-10). A higher value means a higher priority. - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */setPriority:function(value,callback){cov_1ks4ntaci2().f[223]++;cov_1ks4ntaci2().s[695]++;callback=(cov_1ks4ntaci2().b[183][0]++,callback)||(cov_1ks4ntaci2().b[183][1]++,function(){cov_1ks4ntaci2().f[224]++;});var that=(cov_1ks4ntaci2().s[696]++,this);var req=(cov_1ks4ntaci2().s[697]++,this.post("control",{action:"setpriority",priority:value},function(err){cov_1ks4ntaci2().f[225]++;cov_1ks4ntaci2().s[698]++;callback(err,that);}));cov_1ks4ntaci2().s[699]++;return req;},/** - * Sets the time to live (TTL) for the search job, which is the time before - * the search job expires after it has been completed and is still available. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.setTTL(1000, function(err, job) { - * console.log("JOB TTL SET"); - * }); - * - * @param {Number} value The time to live, in seconds. - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */setTTL:function(value,callback){cov_1ks4ntaci2().f[226]++;cov_1ks4ntaci2().s[700]++;callback=(cov_1ks4ntaci2().b[184][0]++,callback)||(cov_1ks4ntaci2().b[184][1]++,function(){cov_1ks4ntaci2().f[227]++;});var that=(cov_1ks4ntaci2().s[701]++,this);var req=(cov_1ks4ntaci2().s[702]++,this.post("control",{action:"setttl",ttl:value},function(err){cov_1ks4ntaci2().f[228]++;cov_1ks4ntaci2().s[703]++;callback(err,that);}));cov_1ks4ntaci2().s[704]++;return req;},/** - * Gets the summary for this search job with the given parameters. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.summary({top_count: 5}, function(err, summary, job) { - * console.log("Summary: ", summary); - * }); - * - * @param {Object} params The parameters for retrieving the summary. For a list of available parameters, see the GET search/jobs/{search_id}/summary endpoint in the REST API documentation. - * @param {Function} callback A function to call with the summary and search job: `(err, summary, job)`. - * - * @endpoint search/jobs/{search_id}/summmary - * @method splunkjs.Service.Job - */summary:function(params,callback){cov_1ks4ntaci2().f[229]++;cov_1ks4ntaci2().s[705]++;callback=(cov_1ks4ntaci2().b[185][0]++,callback)||(cov_1ks4ntaci2().b[185][1]++,function(){cov_1ks4ntaci2().f[230]++;});var that=(cov_1ks4ntaci2().s[706]++,this);cov_1ks4ntaci2().s[707]++;return this.get("summary",params,function(err,response){cov_1ks4ntaci2().f[231]++;cov_1ks4ntaci2().s[708]++;if(err){cov_1ks4ntaci2().b[186][0]++;cov_1ks4ntaci2().s[709]++;callback(err);}else{cov_1ks4ntaci2().b[186][1]++;cov_1ks4ntaci2().s[710]++;callback(null,response.data,that);}});},/** - * Gets the timeline for this search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.timeline({time_format: "%c"}, function(err, job, timeline) { - * console.log("Timeline: ", timeline); - * }); - * - * @param {Object} params The parameters for retrieving the timeline. For a list of available parameters, see the GET search/jobs/{search_id}/timeline endpoint in the REST API documentation. - * @param {Function} callback A function to call with the timeline and search job: `(err, timeline, job)`. - * - * @endpoint search/jobs/{search_id}/timeline - * @method splunkjs.Service.Job - */timeline:function(params,callback){cov_1ks4ntaci2().f[232]++;cov_1ks4ntaci2().s[711]++;callback=(cov_1ks4ntaci2().b[187][0]++,callback)||(cov_1ks4ntaci2().b[187][1]++,function(){cov_1ks4ntaci2().f[233]++;});var that=(cov_1ks4ntaci2().s[712]++,this);cov_1ks4ntaci2().s[713]++;return this.get("timeline",params,function(err,response){cov_1ks4ntaci2().f[234]++;cov_1ks4ntaci2().s[714]++;if(err){cov_1ks4ntaci2().b[188][0]++;cov_1ks4ntaci2().s[715]++;callback(err);}else{cov_1ks4ntaci2().b[188][1]++;cov_1ks4ntaci2().s[716]++;callback(null,response.data,that);}});},/** - * Touches a search job, which means extending the expiration time of - * the search to now plus the time to live (TTL). - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.touch(function(err) { - * console.log("JOB TOUCHED"); - * }); - * - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */touch:function(callback){cov_1ks4ntaci2().f[235]++;cov_1ks4ntaci2().s[717]++;callback=(cov_1ks4ntaci2().b[189][0]++,callback)||(cov_1ks4ntaci2().b[189][1]++,function(){cov_1ks4ntaci2().f[236]++;});var that=(cov_1ks4ntaci2().s[718]++,this);var req=(cov_1ks4ntaci2().s[719]++,this.post("control",{action:"touch"},function(err){cov_1ks4ntaci2().f[237]++;cov_1ks4ntaci2().s[720]++;callback(err,that);}));cov_1ks4ntaci2().s[721]++;return req;},/** - * Starts polling the status of this search job, and fires callbacks - * upon each status change. - * - * @param {Object} options A dictionary of optional parameters: - * - `period` (_integer_): The number of milliseconds to wait between each poll. Defaults to 500. - * @param {Object|Function} callbacks A dictionary of optional callbacks: - * - `ready`: A function `(job)` invoked when the job's properties first become available. - * - `progress`: A function `(job)` invoked whenever new job properties are available. - * - `done`: A function `(job)` invoked if the job completes successfully. No further polling is done. - * - `failed`: A function `(job)` invoked if the job fails executing on the server. No further polling is done. - * - `error`: A function `(err)` invoked if an error occurs while polling. No further polling is done. - * Or, if a function `(job)`, equivalent to passing it as a `done` callback. - * - * @method splunkjs.Service.Job - */track:function(options,callbacks){cov_1ks4ntaci2().f[238]++;var period=(cov_1ks4ntaci2().s[722]++,(cov_1ks4ntaci2().b[190][0]++,options.period)||(cov_1ks4ntaci2().b[190][1]++,500));// ms -cov_1ks4ntaci2().s[723]++;if(utils.isFunction(callbacks)){cov_1ks4ntaci2().b[191][0]++;cov_1ks4ntaci2().s[724]++;callbacks={done:callbacks};}else{cov_1ks4ntaci2().b[191][1]++;}var noCallbacksAfterReady=(cov_1ks4ntaci2().s[725]++,(cov_1ks4ntaci2().b[192][0]++,!callbacks.progress)&&(cov_1ks4ntaci2().b[192][1]++,!callbacks.done)&&(cov_1ks4ntaci2().b[192][2]++,!callbacks.failed)&&(cov_1ks4ntaci2().b[192][3]++,!callbacks.error));cov_1ks4ntaci2().s[726]++;callbacks.ready=(cov_1ks4ntaci2().b[193][0]++,callbacks.ready)||(cov_1ks4ntaci2().b[193][1]++,function(){cov_1ks4ntaci2().f[239]++;});cov_1ks4ntaci2().s[727]++;callbacks.progress=(cov_1ks4ntaci2().b[194][0]++,callbacks.progress)||(cov_1ks4ntaci2().b[194][1]++,function(){cov_1ks4ntaci2().f[240]++;});cov_1ks4ntaci2().s[728]++;callbacks.done=(cov_1ks4ntaci2().b[195][0]++,callbacks.done)||(cov_1ks4ntaci2().b[195][1]++,function(){cov_1ks4ntaci2().f[241]++;});cov_1ks4ntaci2().s[729]++;callbacks.failed=(cov_1ks4ntaci2().b[196][0]++,callbacks.failed)||(cov_1ks4ntaci2().b[196][1]++,function(){cov_1ks4ntaci2().f[242]++;});cov_1ks4ntaci2().s[730]++;callbacks.error=(cov_1ks4ntaci2().b[197][0]++,callbacks.error)||(cov_1ks4ntaci2().b[197][1]++,function(){cov_1ks4ntaci2().f[243]++;});// For use by tests only -cov_1ks4ntaci2().s[731]++;callbacks._preready=(cov_1ks4ntaci2().b[198][0]++,callbacks._preready)||(cov_1ks4ntaci2().b[198][1]++,function(){cov_1ks4ntaci2().f[244]++;});cov_1ks4ntaci2().s[732]++;callbacks._stoppedAfterReady=(cov_1ks4ntaci2().b[199][0]++,callbacks._stoppedAfterReady)||(cov_1ks4ntaci2().b[199][1]++,function(){cov_1ks4ntaci2().f[245]++;});var that=(cov_1ks4ntaci2().s[733]++,this);var emittedReady=(cov_1ks4ntaci2().s[734]++,false);var doneLooping=(cov_1ks4ntaci2().s[735]++,false);cov_1ks4ntaci2().s[736]++;Async.whilst(function(){cov_1ks4ntaci2().f[246]++;cov_1ks4ntaci2().s[737]++;return!doneLooping;},function(nextIteration){cov_1ks4ntaci2().f[247]++;cov_1ks4ntaci2().s[738]++;that.fetch(function(err,job){cov_1ks4ntaci2().f[248]++;cov_1ks4ntaci2().s[739]++;if(err){cov_1ks4ntaci2().b[200][0]++;cov_1ks4ntaci2().s[740]++;nextIteration(err);cov_1ks4ntaci2().s[741]++;return;}else{cov_1ks4ntaci2().b[200][1]++;}var dispatchState=(cov_1ks4ntaci2().s[742]++,job.properties().dispatchState);var notReady=(cov_1ks4ntaci2().s[743]++,(cov_1ks4ntaci2().b[201][0]++,dispatchState==="QUEUED")||(cov_1ks4ntaci2().b[201][1]++,dispatchState==="PARSING"));cov_1ks4ntaci2().s[744]++;if(notReady){cov_1ks4ntaci2().b[202][0]++;cov_1ks4ntaci2().s[745]++;callbacks._preready(job);}else{cov_1ks4ntaci2().b[202][1]++;cov_1ks4ntaci2().s[746]++;if(!emittedReady){cov_1ks4ntaci2().b[203][0]++;cov_1ks4ntaci2().s[747]++;callbacks.ready(job);cov_1ks4ntaci2().s[748]++;emittedReady=true;// Optimization: Don't keep polling the job if the -// caller only cares about the `ready` event. -cov_1ks4ntaci2().s[749]++;if(noCallbacksAfterReady){cov_1ks4ntaci2().b[204][0]++;cov_1ks4ntaci2().s[750]++;callbacks._stoppedAfterReady(job);cov_1ks4ntaci2().s[751]++;doneLooping=true;cov_1ks4ntaci2().s[752]++;nextIteration();cov_1ks4ntaci2().s[753]++;return;}else{cov_1ks4ntaci2().b[204][1]++;}}else{cov_1ks4ntaci2().b[203][1]++;}cov_1ks4ntaci2().s[754]++;callbacks.progress(job);var props=(cov_1ks4ntaci2().s[755]++,job.properties());cov_1ks4ntaci2().s[756]++;if((cov_1ks4ntaci2().b[206][0]++,dispatchState==="DONE")&&(cov_1ks4ntaci2().b[206][1]++,props.isDone)){cov_1ks4ntaci2().b[205][0]++;cov_1ks4ntaci2().s[757]++;callbacks.done(job);cov_1ks4ntaci2().s[758]++;doneLooping=true;cov_1ks4ntaci2().s[759]++;nextIteration();cov_1ks4ntaci2().s[760]++;return;}else{cov_1ks4ntaci2().b[205][1]++;cov_1ks4ntaci2().s[761]++;if((cov_1ks4ntaci2().b[208][0]++,dispatchState==="FAILED")&&(cov_1ks4ntaci2().b[208][1]++,props.isFailed)){cov_1ks4ntaci2().b[207][0]++;cov_1ks4ntaci2().s[762]++;callbacks.failed(job);cov_1ks4ntaci2().s[763]++;doneLooping=true;cov_1ks4ntaci2().s[764]++;nextIteration();cov_1ks4ntaci2().s[765]++;return;}else{cov_1ks4ntaci2().b[207][1]++;}}}cov_1ks4ntaci2().s[766]++;Async.sleep(period,nextIteration);});},function(err){cov_1ks4ntaci2().f[249]++;cov_1ks4ntaci2().s[767]++;if(err){cov_1ks4ntaci2().b[209][0]++;cov_1ks4ntaci2().s[768]++;callbacks.error(err);}else{cov_1ks4ntaci2().b[209][1]++;}});},/** - * Resumes a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.unpause(function(err) { - * console.log("JOB UNPAUSED"); - * }); - * - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */unpause:function(callback){cov_1ks4ntaci2().f[250]++;cov_1ks4ntaci2().s[769]++;callback=(cov_1ks4ntaci2().b[210][0]++,callback)||(cov_1ks4ntaci2().b[210][1]++,function(){cov_1ks4ntaci2().f[251]++;});var that=(cov_1ks4ntaci2().s[770]++,this);var req=(cov_1ks4ntaci2().s[771]++,this.post("control",{action:"unpause"},function(err){cov_1ks4ntaci2().f[252]++;cov_1ks4ntaci2().s[772]++;callback(err,that);}));cov_1ks4ntaci2().s[773]++;return req;}});/** - * Represents a collection of search jobs. You can create and list search - * jobs using this collection container, or get a specific search job. - * - * @endpoint search/jobs - * @class splunkjs.Service.Jobs - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[774]++;root.Jobs=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Jobs - */path:function(){cov_1ks4ntaci2().f[253]++;cov_1ks4ntaci2().s[775]++;return Paths.jobs;},/** - * Creates a local instance of a job. - * - * @param {Object} props The properties for this new job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. - * - * @method splunkjs.Service.Jobs - */instantiateEntity:function(props){cov_1ks4ntaci2().f[254]++;var sid=(cov_1ks4ntaci2().s[776]++,props.content.sid);var entityNamespace=(cov_1ks4ntaci2().s[777]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[778]++;return new root.Job(this.service,sid,entityNamespace);},/** - * Constructor for `splunkjs.Service.Jobs`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Jobs} A new `splunkjs.Service.Jobs` instance. - * - * @method splunkjs.Service.Jobs - */init:function(service,namespace){cov_1ks4ntaci2().f[255]++;cov_1ks4ntaci2().s[779]++;this._super(service,this.path(),namespace);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[780]++;this.create=utils.bind(this,this.create);},/** - * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: - * - * - Use `exec_mode=normal` to return a search job ID immediately (default). - * Poll for completion to find out when you can retrieve search results. - * - * - Use `exec_mode=blocking` to return the search job ID when the search has finished. - * - * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * @param {Function} callback A function to call with the created job: `(err, createdJob)`. - * - * @endpoint search/jobs - * @method splunkjs.Service.Jobs - */create:function(query,params,callback){cov_1ks4ntaci2().f[256]++;cov_1ks4ntaci2().s[781]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[212][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[212][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[212][2]++,!callback)){cov_1ks4ntaci2().b[211][0]++;cov_1ks4ntaci2().s[782]++;callback=params;cov_1ks4ntaci2().s[783]++;params=query;cov_1ks4ntaci2().s[784]++;query=params.search;}else{cov_1ks4ntaci2().b[211][1]++;}cov_1ks4ntaci2().s[785]++;callback=(cov_1ks4ntaci2().b[213][0]++,callback)||(cov_1ks4ntaci2().b[213][1]++,function(){cov_1ks4ntaci2().f[257]++;});cov_1ks4ntaci2().s[786]++;params=(cov_1ks4ntaci2().b[214][0]++,params)||(cov_1ks4ntaci2().b[214][1]++,{});cov_1ks4ntaci2().s[787]++;params.search=query;cov_1ks4ntaci2().s[788]++;if(((cov_1ks4ntaci2().b[216][0]++,params.exec_mode)||(cov_1ks4ntaci2().b[216][1]++,"")).toLowerCase()==="oneshot"){cov_1ks4ntaci2().b[215][0]++;cov_1ks4ntaci2().s[789]++;throw new Error("Please use splunkjs.Service.Jobs.oneshotSearch for exec_mode=oneshot");}else{cov_1ks4ntaci2().b[215][1]++;}cov_1ks4ntaci2().s[790]++;if(!params.search){cov_1ks4ntaci2().b[217][0]++;cov_1ks4ntaci2().s[791]++;callback("Must provide a query to create a search job");cov_1ks4ntaci2().s[792]++;return;}else{cov_1ks4ntaci2().b[217][1]++;}var that=(cov_1ks4ntaci2().s[793]++,this);cov_1ks4ntaci2().s[794]++;return this.post("",params,function(err,response){cov_1ks4ntaci2().f[258]++;cov_1ks4ntaci2().s[795]++;if(err){cov_1ks4ntaci2().b[218][0]++;cov_1ks4ntaci2().s[796]++;callback(err);}else{cov_1ks4ntaci2().b[218][1]++;var job=(cov_1ks4ntaci2().s[797]++,new root.Job(that.service,response.data.sid,that.namespace));cov_1ks4ntaci2().s[798]++;callback(null,job);}});},/** - * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: - * - * - Use `exec_mode=normal` to return a search job ID immediately (default). - * Poll for completion to find out when you can retrieve search results. - * - * - Use `exec_mode=blocking` to return the search job ID when the search has finished. - * - * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. - * - * @example - * - * var jobs = service.jobs(); - * jobs.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { - * console.log("CREATED": newJob.sid); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {Function} callback A function to call with the new search job: `(err, createdJob)`. - * - * @endpoint search/jobs - * @method splunkjs.Service.Jobs - */search:function(query,params,callback){cov_1ks4ntaci2().f[259]++;cov_1ks4ntaci2().s[799]++;return this.create(query,params,callback);},/** - * Creates a oneshot search from a given search query and parameters. - * - * @example - * - * var jobs = service.jobs(); - * jobs.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { - * console.log("RESULT FIELDS": results.fields); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search: - * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). - * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `rf` (_string_): Specifies one or more fields to add to the search. - * @param {Function} callback A function to call with the results of the search: `(err, results)`. - * - * @endpoint search/jobs - * @method splunkjs.Service.Jobs - */oneshotSearch:function(query,params,callback){cov_1ks4ntaci2().f[260]++;cov_1ks4ntaci2().s[800]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[220][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[220][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[220][2]++,!callback)){cov_1ks4ntaci2().b[219][0]++;cov_1ks4ntaci2().s[801]++;callback=params;cov_1ks4ntaci2().s[802]++;params=query;cov_1ks4ntaci2().s[803]++;query=params.search;}else{cov_1ks4ntaci2().b[219][1]++;}cov_1ks4ntaci2().s[804]++;callback=(cov_1ks4ntaci2().b[221][0]++,callback)||(cov_1ks4ntaci2().b[221][1]++,function(){cov_1ks4ntaci2().f[261]++;});cov_1ks4ntaci2().s[805]++;params=(cov_1ks4ntaci2().b[222][0]++,params)||(cov_1ks4ntaci2().b[222][1]++,{});cov_1ks4ntaci2().s[806]++;params.search=query;cov_1ks4ntaci2().s[807]++;params.exec_mode="oneshot";cov_1ks4ntaci2().s[808]++;if(!params.search){cov_1ks4ntaci2().b[223][0]++;cov_1ks4ntaci2().s[809]++;callback("Must provide a query to create a search job");}else{cov_1ks4ntaci2().b[223][1]++;}var outputMode=(cov_1ks4ntaci2().s[810]++,(cov_1ks4ntaci2().b[224][0]++,params.output_mode)||(cov_1ks4ntaci2().b[224][1]++,"json_rows"));var path=(cov_1ks4ntaci2().s[811]++,this.qualifiedPath);var method=(cov_1ks4ntaci2().s[812]++,"POST");var headers=(cov_1ks4ntaci2().s[813]++,{});var post=(cov_1ks4ntaci2().s[814]++,params);var get=(cov_1ks4ntaci2().s[815]++,{output_mode:outputMode});var body=(cov_1ks4ntaci2().s[816]++,null);var req=(cov_1ks4ntaci2().s[817]++,this.service.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[262]++;cov_1ks4ntaci2().s[818]++;if(err){cov_1ks4ntaci2().b[225][0]++;cov_1ks4ntaci2().s[819]++;callback(err);}else{cov_1ks4ntaci2().b[225][1]++;cov_1ks4ntaci2().s[820]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[821]++;return req;}});/** - * Represents a field of a data model object. - * This is a helper class for `DataModelCalculation` - * and `DataModelObject`. - * - * Has these properties: - * - `fieldName` (_string_): The name of this field. - * - `displayName` (_string_): A human readable name for this field. - * - `type` (_string_): The type of this field. - * - `multivalued` (_boolean_): Whether this field is multivalued. - * - `required` (_boolean_): Whether this field is required. - * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. - * - `editable` (_boolean_): Whether this field can be edited. - * - `comment` (_string_): A comment for this field, or `null` if there isn't one. - * - `fieldSearch` (_string_): A search query fragment for this field. - * - `lineage` (_array_): An array of strings of the lineage of the data model - * on which this field is defined. - * - `owner` (_string_): The name of the data model object on which this field is defined. - * - * Possible types for a data model field: - * - `string` - * - `boolean` - * - `number` - * - `timestamp` - * - `objectCount` - * - `childCount` - * - `ipv4` - * - * @class splunkjs.Service.DataModelField - */cov_1ks4ntaci2().s[822]++;root.DataModelField=Class.extend({_types:["string","number","timestamp","objectCount","childCount","ipv4","boolean"],/** - * Constructor for a data model field. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `fieldName` (_string_): The name of this field. - * - `displayName` (_string_): A human readable name for this field. - * - `type` (_string_): The type of this field, see valid types in class docs. - * - `multivalue` (_boolean_): Whether this field is multivalued. - * - `required` (_boolean_): Whether this field is required on events in the object - * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. - * - `editable` (_boolean_): Whether this field can be edited. - * - `comment` (_string_): A comment for this field, or `null` if there isn't one. - * - `fieldSearch` (_string_): A search query fragment for this field. - * - `lineage` (_string_): The lineage of the data model object on which this field - * is defined, items are delimited by a dot. This is converted into an array of - * strings upon construction. - * - * @method splunkjs.Service.DataModelField - */init:function(props){cov_1ks4ntaci2().f[263]++;cov_1ks4ntaci2().s[823]++;props=(cov_1ks4ntaci2().b[226][0]++,props)||(cov_1ks4ntaci2().b[226][1]++,{});cov_1ks4ntaci2().s[824]++;props.owner=(cov_1ks4ntaci2().b[227][0]++,props.owner)||(cov_1ks4ntaci2().b[227][1]++,"");cov_1ks4ntaci2().s[825]++;this.name=props.fieldName;cov_1ks4ntaci2().s[826]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[827]++;this.type=props.type;cov_1ks4ntaci2().s[828]++;this.multivalued=props.multivalue;cov_1ks4ntaci2().s[829]++;this.required=props.required;cov_1ks4ntaci2().s[830]++;this.hidden=props.hidden;cov_1ks4ntaci2().s[831]++;this.editable=props.editable;cov_1ks4ntaci2().s[832]++;this.comment=(cov_1ks4ntaci2().b[228][0]++,props.comment)||(cov_1ks4ntaci2().b[228][1]++,null);cov_1ks4ntaci2().s[833]++;this.fieldSearch=props.fieldSearch;cov_1ks4ntaci2().s[834]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[835]++;this.owner=this.lineage[this.lineage.length-1];},/** - * Is this data model field of type string? - * - * @return {Boolean} True if this data model field is of type string. - * - * @method splunkjs.Service.DataModelField - */isString:function(){cov_1ks4ntaci2().f[264]++;cov_1ks4ntaci2().s[836]++;return"string"===this.type;},/** - * Is this data model field of type number? - * - * @return {Boolean} True if this data model field is of type number. - * - * @method splunkjs.Service.DataModelField - */isNumber:function(){cov_1ks4ntaci2().f[265]++;cov_1ks4ntaci2().s[837]++;return"number"===this.type;},/** - * Is this data model field of type timestamp? - * - * @return {Boolean} True if this data model field is of type timestamp. - * - * @method splunkjs.Service.DataModelField - */isTimestamp:function(){cov_1ks4ntaci2().f[266]++;cov_1ks4ntaci2().s[838]++;return"timestamp"===this.type;},/** - * Is this data model field of type object count? - * - * @return {Boolean} True if this data model field is of type object count. - * - * @method splunkjs.Service.DataModelField - */isObjectcount:function(){cov_1ks4ntaci2().f[267]++;cov_1ks4ntaci2().s[839]++;return"objectCount"===this.type;},/** - * Is this data model field of type child count? - * - * @return {Boolean} True if this data model field is of type child count. - * - * @method splunkjs.Service.DataModelField - */isChildcount:function(){cov_1ks4ntaci2().f[268]++;cov_1ks4ntaci2().s[840]++;return"childCount"===this.type;},/** - * Is this data model field of type ipv4? - * - * @return {Boolean} True if this data model field is of type ipv4. - * - * @method splunkjs.Service.DataModelField - */isIPv4:function(){cov_1ks4ntaci2().f[269]++;cov_1ks4ntaci2().s[841]++;return"ipv4"===this.type;},/** - * Is this data model field of type boolean? - * - * @return {Boolean} True if this data model field is of type boolean. - * - * @method splunkjs.Service.DataModelField - */isBoolean:function(){cov_1ks4ntaci2().f[270]++;cov_1ks4ntaci2().s[842]++;return"boolean"===this.type;}});/** - * Represents a constraint on a `DataModelObject` or a `DataModelField`. - * - * Has these properties: - * - `query` (_string_): The search query defining this data model constraint. - * - `lineage` (_array_): The lineage of this data model constraint. - * - `owner` (_string_): The name of the data model object that owns - * this data model constraint. - * - * @class splunkjs.Service.DataModelConstraint - */cov_1ks4ntaci2().s[843]++;root.DataModelConstraint=Class.extend({/** - * Constructor for a data model constraint. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `search` (_string_): The Splunk search query this constraint specifies. - * - `owner` (_string_): The lineage of the data model object that owns this - * constraint, items are delimited by a dot. This is converted into - * an array of strings upon construction. - * - * @method splunkjs.Service.DataModelConstraint - */init:function(props){cov_1ks4ntaci2().f[271]++;cov_1ks4ntaci2().s[844]++;props=(cov_1ks4ntaci2().b[229][0]++,props)||(cov_1ks4ntaci2().b[229][1]++,{});cov_1ks4ntaci2().s[845]++;props.owner=(cov_1ks4ntaci2().b[230][0]++,props.owner)||(cov_1ks4ntaci2().b[230][1]++,"");cov_1ks4ntaci2().s[846]++;this.query=props.search;cov_1ks4ntaci2().s[847]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[848]++;this.owner=this.lineage[this.lineage.length-1];}});/** - * Used for specifying a calculation on a `DataModelObject`. - * - * Has these properties: - * - `id` (_string_): The ID for this data model calculation. - * - `type` (_string_): The type of this data model calculation. - * - `comment` (_string_|_null_): The comment for this data model calculation, or `null`. - * - `editable` (_boolean_): True if this calculation can be edited, false otherwise. - * - `lineage` (_array_): The lineage of the data model object on which this calculation - * is defined in an array of strings. - * - `owner` (_string_): The data model that this calculation belongs to. - * - `outputFields` (_array_): The fields output by this calculation. - * - * The Rex and Eval types have an additional property: - * - `expression` (_string_): The expression to use for this calculation. - * - * The Rex and GeoIP types have an additional property: - * - `inputField` (_string_): The field to use for calculation. - * - * The Lookup type has additional properties: - * - `lookupName` (_string_): The name of the lookup to perform. - * - `inputFieldMappings` (_object_): The mappings from fields in the events to fields in the lookup. - * - * Valid types of calculations are: - * - `Lookup` - * - `Eval` - * - `GeoIP` - * - `Rex` - * - * @class splunkjs.Service.DataModelCalculation - */cov_1ks4ntaci2().s[849]++;root.DataModelCalculation=Class.extend({_types:["Lookup","Eval","GeoIP","Rex"],/** - * Constructor for a data model calculation. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `calculationID` (_string_): The ID of this calculation. - * - `calculationType` (_string_): The type of this calculation, see class docs for valid types. - * - `editable` (_boolean_): Whether this calculation can be edited. - * - `comment` (_string_): A comment for this calculation, or `null` if there isn't one. - * - `owner` (_string_): The lineage of the data model object on which this calculation - * is defined, items are delimited by a dot. This is converted into an array of - * strings upon construction. - * - `outputFields` (_array_): An array of the fields this calculation generates. - * - `expression` (_string_): The expression to use for this calculation; exclusive to `Eval` and `Rex` calculations (optional) - * - `inputField` (_string_): The field to use for calculation; exclusive to `GeoIP` and `Rex` calculations (optional) - * - `lookupName` (_string_): The name of the lookup to perform; exclusive to `Lookup` calculations (optional) - * - `inputFieldMappings` (_array_): One element array containing an object with the mappings from fields in the events to fields - * in the lookup; exclusive to `Lookup` calculations (optional) - * - * @method splunkjs.Service.DataModelCalculation - */init:function(props){cov_1ks4ntaci2().f[272]++;cov_1ks4ntaci2().s[850]++;props=(cov_1ks4ntaci2().b[231][0]++,props)||(cov_1ks4ntaci2().b[231][1]++,{});cov_1ks4ntaci2().s[851]++;props.owner=(cov_1ks4ntaci2().b[232][0]++,props.owner)||(cov_1ks4ntaci2().b[232][1]++,"");cov_1ks4ntaci2().s[852]++;this.id=props.calculationID;cov_1ks4ntaci2().s[853]++;this.type=props.calculationType;cov_1ks4ntaci2().s[854]++;this.comment=(cov_1ks4ntaci2().b[233][0]++,props.comment)||(cov_1ks4ntaci2().b[233][1]++,null);cov_1ks4ntaci2().s[855]++;this.editable=props.editable;cov_1ks4ntaci2().s[856]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[857]++;this.owner=this.lineage[this.lineage.length-1];cov_1ks4ntaci2().s[858]++;this.outputFields=[];cov_1ks4ntaci2().s[859]++;for(var i=(cov_1ks4ntaci2().s[860]++,0);iSearch job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {Function} callback A function to call when done creating the search job: `(err, job)`. - * @method splunkjs.Service.Pivot - */run:function(args,callback){cov_1ks4ntaci2().f[280]++;cov_1ks4ntaci2().s[883]++;if(utils.isUndefined(callback)){cov_1ks4ntaci2().b[240][0]++;cov_1ks4ntaci2().s[884]++;callback=args;cov_1ks4ntaci2().s[885]++;args={};}else{cov_1ks4ntaci2().b[240][1]++;}cov_1ks4ntaci2().s[886]++;if((cov_1ks4ntaci2().b[242][0]++,!args)||(cov_1ks4ntaci2().b[242][1]++,Object.keys(args).length===0)){cov_1ks4ntaci2().b[241][0]++;cov_1ks4ntaci2().s[887]++;args={};}else{cov_1ks4ntaci2().b[241][1]++;}// If tstats is undefined, use pivotSearch (try to run an accelerated search if possible) -cov_1ks4ntaci2().s[888]++;this.service.search((cov_1ks4ntaci2().b[243][0]++,this.tstatsSearch)||(cov_1ks4ntaci2().b[243][1]++,this.pivotSearch),args,callback);}});/** - * PivotSpecification represents a pivot to be done on a particular data model object. - * The user creates a PivotSpecification on some data model object, adds filters, row splits, - * column splits, and cell values, then calls the pivot method to query splunkd and - * get a set of SPL queries corresponding to this specification. - * - * Call the `pivot` method to query Splunk for SPL queries corresponding to this pivot. - * - * This class supports a fluent API, each function except `init`, `toJsonObject` & `pivot` - * return the modified `splunkjs.Service.PivotSpecification` instance. - * - * @example - * service.dataModels().fetch(function(err, dataModels) { - * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); - * var pivotSpecification = searches.createPivotSpecification(); - * pivotSpecification - * .addRowSplit("user", "Executing user") - * .addRangeColumnSplit("exec_time", {limit: 4}) - * .addCellValue("search", "Search Query", "values") - * .pivot(function(err, pivot) { - * console.log("Got a Pivot object from the Splunk server!"); - * }); - * }); - * - * Has these properties: - * - `dataModelObject` (_splunkjs.Service.DataModelObject_): The `DataModelObject` from which - * this `PivotSpecification` was created. - * - `columns` (_array_): The column splits on this `PivotSpecification`. - * - `rows` (_array_): The row splits on this `PivotSpecification`. - * - `filters` (_array_): The filters on this `PivotSpecification`. - * - `cells` (_array_): The cell aggregations for this`PivotSpecification`. - * - `accelerationNamespace` (_string_|_null_): The name of the `DataModel` that owns the `DataModelObject` - * on which this `PivotSpecification` was created if the `DataModel` is accelerated. Alternatively, - * you can set this property manually to the sid of an acceleration job in the format `sid=`. - * - * Valid comparison types are: - * - `boolean` - * - `string` - * - `number` - * - `ipv4` - * - * Valid boolean comparisons are: - * - `=` - * - `is` - * - `isNull` - * - `isNotNull` - * - * Valid string comparisons are: - * - `=` - * - `is` - * - `isNull` - * - `isNotNull` - * - `contains` - * - `doesNotContain` - * - `startsWith` - * - `endsWith` - * - `regex` - * - * Valid number comparisons are: - * - `=` - * - `!=` - * - `<` - * - `>` - * - `<=` - * - `>=` - * - `is` - * - `isNull` - * - `isNotNull` - * - * Valid ipv4 comparisons are: - * - `is` - * - `isNull` - * - `isNotNull` - * - `contains` - * - `doesNotContain` - * - `startsWith` - * - * Valid binning values are: - * - `auto` - * - `year` - * - `month` - * - `day` - * - `hour` - * - `minute` - * - `second` - * - * Valid sort directions are: - * - `ASCENDING` - * - `DECENDING` - * - `DEFAULT` - * - * Valid stats functions are: - * - `list` - * - `values` - * - `first` - * - `last` - * - `count` - * - `dc` - * - `sum` - * - `average` - * - `max` - * - `min` - * - `stdev` - * - `duration` - * - `earliest` - * - `latest` - * - * @class splunkjs.Service.PivotSpecification - */cov_1ks4ntaci2().s[889]++;root.PivotSpecification=Class.extend({_comparisons:{boolean:["=","is","isNull","isNotNull"],string:["=","is","isNull","isNotNull","contains","doesNotContain","startsWith","endsWith","regex"],number:["=","!=","<",">","<=",">=","is","isNull","isNotNull"],ipv4:["is","isNull","isNotNull","contains","doesNotContain","startsWith"]},_binning:["auto","year","month","day","hour","minute","second"],_sortDirection:["ASCENDING","DESCENDING","DEFAULT"],_statsFunctions:["list","values","first","last","count","dc","sum","average","max","min","stdev","duration","earliest","latest"],/** - * Constructor for a pivot specification. - * - * @constructor - * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. - * - * @method splunkjs.Service.PivotSpecification - */init:function(dataModelObject){cov_1ks4ntaci2().f[281]++;cov_1ks4ntaci2().s[890]++;this.dataModelObject=dataModelObject;cov_1ks4ntaci2().s[891]++;this.columns=[];cov_1ks4ntaci2().s[892]++;this.rows=[];cov_1ks4ntaci2().s[893]++;this.filters=[];cov_1ks4ntaci2().s[894]++;this.cells=[];cov_1ks4ntaci2().s[895]++;this.accelerationNamespace=dataModelObject.dataModel.isAccelerated()?(cov_1ks4ntaci2().b[244][0]++,dataModelObject.dataModel.name):(cov_1ks4ntaci2().b[244][1]++,null);cov_1ks4ntaci2().s[896]++;this.run=utils.bind(this,this.run);cov_1ks4ntaci2().s[897]++;this.pivot=utils.bind(this,this.pivot);},/** - * Set the acceleration cache for this pivot specification to a job, - * usually generated by createLocalAccelerationJob on a DataModelObject - * instance, as the acceleration cache for this pivot specification. - * - * @param {String|splunkjs.Service.Job} sid The sid of an acceleration job, - * or, a `splunkjs.Service.Job` instance. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */setAccelerationJob:function(sid){cov_1ks4ntaci2().f[282]++;cov_1ks4ntaci2().s[898]++;// If a search object is passed in, get its sid -if((cov_1ks4ntaci2().b[246][0]++,sid)&&(cov_1ks4ntaci2().b[246][1]++,sid instanceof Service.Job)){cov_1ks4ntaci2().b[245][0]++;cov_1ks4ntaci2().s[899]++;sid=sid.sid;}else{cov_1ks4ntaci2().b[245][1]++;}cov_1ks4ntaci2().s[900]++;if(!sid){cov_1ks4ntaci2().b[247][0]++;cov_1ks4ntaci2().s[901]++;throw new Error("Sid to use for acceleration must not be null.");}else{cov_1ks4ntaci2().b[247][1]++;}cov_1ks4ntaci2().s[902]++;this.accelerationNamespace="sid="+sid;cov_1ks4ntaci2().s[903]++;return this;},/** - * Add a filter on a boolean valued field. The filter will be a constraint of the form - * `field `comparison` compareTo`, for example: `is_remote = false`. - * - * @param {String} fieldName The name of field to filter on - * @param {String} comparisonType The type of comparison, see class docs for valid types. - * @param {String} comparisonOp The comparison, see class docs for valid comparisons, based on type. - * @param {String} compareTo The value to compare the field to. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addFilter:function(fieldName,comparisonType,comparisonOp,compareTo){cov_1ks4ntaci2().f[283]++;cov_1ks4ntaci2().s[904]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[248][0]++;cov_1ks4ntaci2().s[905]++;throw new Error("Cannot add filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[248][1]++;}cov_1ks4ntaci2().s[906]++;if(comparisonType!==this.dataModelObject.fieldByName(fieldName).type){cov_1ks4ntaci2().b[249][0]++;cov_1ks4ntaci2().s[907]++;throw new Error("Cannot add "+comparisonType+" filter on "+fieldName+" because it is of type "+this.dataModelObject.fieldByName(fieldName).type);}else{cov_1ks4ntaci2().b[249][1]++;}cov_1ks4ntaci2().s[908]++;if(!utils.contains(this._comparisons[comparisonType],comparisonOp)){cov_1ks4ntaci2().b[250][0]++;cov_1ks4ntaci2().s[909]++;throw new Error("Cannot add "+comparisonType+" filter because "+comparisonOp+" is not a valid comparison operator");}else{cov_1ks4ntaci2().b[250][1]++;}var ret=(cov_1ks4ntaci2().s[910]++,{fieldName:fieldName,owner:this.dataModelObject.fieldByName(fieldName).lineage.join("."),type:comparisonType});// These fields are type dependent -cov_1ks4ntaci2().s[911]++;if(utils.contains(["boolean","string","ipv4","number"],ret.type)){cov_1ks4ntaci2().b[251][0]++;cov_1ks4ntaci2().s[912]++;ret.rule={comparator:comparisonOp,compareTo:compareTo};}else{cov_1ks4ntaci2().b[251][1]++;}cov_1ks4ntaci2().s[913]++;this.filters.push(ret);cov_1ks4ntaci2().s[914]++;return this;},/** - * Add a limit on the events shown in a pivot by sorting them according to some field, then taking - * the specified number from the beginning or end of the list. - * - * @param {String} fieldName The name of field to filter on. - * @param {String} sortAttribute The name of the field to use for sorting. - * @param {String} sortDirection The direction to sort events, see class docs for valid types. - * @param {String} limit The number of values from the sorted list to allow through this filter. - * @param {String} statsFunction The stats function to use for aggregation before sorting, see class docs for valid types. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addLimitFilter:function(fieldName,sortAttribute,sortDirection,limit,statsFunction){cov_1ks4ntaci2().f[284]++;cov_1ks4ntaci2().s[915]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[252][0]++;cov_1ks4ntaci2().s[916]++;throw new Error("Cannot add limit filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[252][1]++;}var f=(cov_1ks4ntaci2().s[917]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[918]++;if(!utils.contains(["string","number","objectCount"],f.type)){cov_1ks4ntaci2().b[253][0]++;cov_1ks4ntaci2().s[919]++;throw new Error("Cannot add limit filter on "+fieldName+" because it is of type "+f.type);}else{cov_1ks4ntaci2().b[253][1]++;}cov_1ks4ntaci2().s[920]++;if((cov_1ks4ntaci2().b[255][0]++,"string"===f.type)&&(cov_1ks4ntaci2().b[255][1]++,!utils.contains(["count","dc"],statsFunction))){cov_1ks4ntaci2().b[254][0]++;cov_1ks4ntaci2().s[921]++;throw new Error("Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[254][1]++;}cov_1ks4ntaci2().s[922]++;if((cov_1ks4ntaci2().b[257][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[257][1]++,!utils.contains(["count","dc","average","sum"],statsFunction))){cov_1ks4ntaci2().b[256][0]++;cov_1ks4ntaci2().s[923]++;throw new Error("Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found "+statsFunction);}else{cov_1ks4ntaci2().b[256][1]++;}cov_1ks4ntaci2().s[924]++;if((cov_1ks4ntaci2().b[259][0]++,"objectCount"===f.type)&&(cov_1ks4ntaci2().b[259][1]++,!utils.contains(["count"],statsFunction))){cov_1ks4ntaci2().b[258][0]++;cov_1ks4ntaci2().s[925]++;throw new Error("Stats function for fields of type object count must be COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[258][1]++;}var filter=(cov_1ks4ntaci2().s[926]++,{fieldName:fieldName,owner:f.lineage.join("."),type:f.type,attributeName:sortAttribute,attributeOwner:this.dataModelObject.fieldByName(sortAttribute).lineage.join("."),sortDirection:sortDirection,limitAmount:limit,statsFn:statsFunction});// Assumed "highest" is preferred for when sortDirection is "DEFAULT" -cov_1ks4ntaci2().s[927]++;filter.limitType="ASCENDING"===sortDirection?(cov_1ks4ntaci2().b[260][0]++,"lowest"):(cov_1ks4ntaci2().b[260][1]++,"highest");cov_1ks4ntaci2().s[928]++;this.filters.push(filter);cov_1ks4ntaci2().s[929]++;return this;},/** - * Add a row split on a numeric or string valued field, splitting on each distinct value of the field. - * - * @param {String} fieldName The name of field to split on. - * @param {String} label A human readable name for this set of rows. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addRowSplit:function(fieldName,label){cov_1ks4ntaci2().f[285]++;cov_1ks4ntaci2().s[930]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[261][0]++;cov_1ks4ntaci2().s[931]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[261][1]++;}var f=(cov_1ks4ntaci2().s[932]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[933]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[262][0]++;cov_1ks4ntaci2().s[934]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[262][1]++;}var row=(cov_1ks4ntaci2().s[935]++,{fieldName:fieldName,owner:f.owner,type:f.type,label:label});cov_1ks4ntaci2().s[936]++;if("number"===f.type){cov_1ks4ntaci2().b[263][0]++;cov_1ks4ntaci2().s[937]++;row.display="all";}else{cov_1ks4ntaci2().b[263][1]++;}cov_1ks4ntaci2().s[938]++;this.rows.push(row);cov_1ks4ntaci2().s[939]++;return this;},/** - * Add a row split on a numeric field, splitting into numeric ranges. - * - * This split generates bins with edges equivalent to the - * classic loop 'for i in to by ' but with a maximum - * number of bins . This dispatches to the stats and xyseries search commands. - * See their documentation for more details. - * - * @param {String} fieldName The field to split on. - * @param {String} label A human readable name for this set of rows. - * @param {Object} options An optional dictionary of collection filtering and pagination options: - * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. - * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. - * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. - * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addRangeRowSplit:function(field,label,ranges){cov_1ks4ntaci2().f[286]++;cov_1ks4ntaci2().s[940]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[264][0]++;cov_1ks4ntaci2().s[941]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[264][1]++;}var f=(cov_1ks4ntaci2().s[942]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[943]++;if("number"!==f.type){cov_1ks4ntaci2().b[265][0]++;cov_1ks4ntaci2().s[944]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[265][1]++;}var updateRanges=(cov_1ks4ntaci2().s[945]++,{});cov_1ks4ntaci2().s[946]++;if((cov_1ks4ntaci2().b[267][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[267][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[266][0]++;cov_1ks4ntaci2().s[947]++;updateRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[266][1]++;}cov_1ks4ntaci2().s[948]++;if((cov_1ks4ntaci2().b[269][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[269][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[268][0]++;cov_1ks4ntaci2().s[949]++;updateRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[268][1]++;}cov_1ks4ntaci2().s[950]++;if((cov_1ks4ntaci2().b[271][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[271][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[270][0]++;cov_1ks4ntaci2().s[951]++;updateRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[270][1]++;}cov_1ks4ntaci2().s[952]++;if((cov_1ks4ntaci2().b[273][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[273][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[272][0]++;cov_1ks4ntaci2().s[953]++;updateRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[272][1]++;}cov_1ks4ntaci2().s[954]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,display:"ranges",ranges:updateRanges});cov_1ks4ntaci2().s[955]++;return this;},/** - * Add a row split on a boolean valued field. - * - * @param {String} fieldName The name of field to split on. - * @param {String} label A human readable name for this set of rows. - * @param {String} trueDisplayValue A string to display in the true valued row label. - * @param {String} falseDisplayValue A string to display in the false valued row label. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addBooleanRowSplit:function(field,label,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[287]++;cov_1ks4ntaci2().s[956]++;if(!this.dataModelObject.fieldByName(field)){cov_1ks4ntaci2().b[274][0]++;cov_1ks4ntaci2().s[957]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[274][1]++;}var f=(cov_1ks4ntaci2().s[958]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[959]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[275][0]++;cov_1ks4ntaci2().s[960]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[275][1]++;}cov_1ks4ntaci2().s[961]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[962]++;return this;},/** - * Add a row split on a timestamp valued field, binned by the specified bucket size. - * - * @param {String} fieldName The name of field to split on. - * @param {String} label A human readable name for this set of rows. - * @param {String} binning The size of bins to use, see class docs for valid types. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addTimestampRowSplit:function(field,label,binning){cov_1ks4ntaci2().f[288]++;cov_1ks4ntaci2().s[963]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[276][0]++;cov_1ks4ntaci2().s[964]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[276][1]++;}var f=(cov_1ks4ntaci2().s[965]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[966]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[277][0]++;cov_1ks4ntaci2().s[967]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[277][1]++;}cov_1ks4ntaci2().s[968]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[278][0]++;cov_1ks4ntaci2().s[969]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[278][1]++;}cov_1ks4ntaci2().s[970]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,period:binning});cov_1ks4ntaci2().s[971]++;return this;},/** - * Add a column split on a string or number valued field, producing a column for - * each distinct value of the field. - * - * @param {String} fieldName The name of field to split on. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addColumnSplit:function(fieldName){cov_1ks4ntaci2().f[289]++;cov_1ks4ntaci2().s[972]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[279][0]++;cov_1ks4ntaci2().s[973]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[279][1]++;}var f=(cov_1ks4ntaci2().s[974]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[975]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[280][0]++;cov_1ks4ntaci2().s[976]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[280][1]++;}var col=(cov_1ks4ntaci2().s[977]++,{fieldName:fieldName,owner:f.owner,type:f.type});cov_1ks4ntaci2().s[978]++;if("number"===f.type){cov_1ks4ntaci2().b[281][0]++;cov_1ks4ntaci2().s[979]++;col.display="all";}else{cov_1ks4ntaci2().b[281][1]++;}cov_1ks4ntaci2().s[980]++;this.columns.push(col);cov_1ks4ntaci2().s[981]++;return this;},/** - * Add a column split on a numeric field, splitting the values into ranges. - * - * @param {String} fieldName The field to split on. - * @param {Object} options An optional dictionary of collection filtering and pagination options: - * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. - * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. - * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. - * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addRangeColumnSplit:function(fieldName,ranges){cov_1ks4ntaci2().f[290]++;cov_1ks4ntaci2().s[982]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[282][0]++;cov_1ks4ntaci2().s[983]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[282][1]++;}var f=(cov_1ks4ntaci2().s[984]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[985]++;if("number"!==f.type){cov_1ks4ntaci2().b[283][0]++;cov_1ks4ntaci2().s[986]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[283][1]++;}// In Splunk 6.0.1.1, data models incorrectly expect strings for these fields -// instead of numbers. In 6.1, this is fixed and both are accepted. -var updatedRanges=(cov_1ks4ntaci2().s[987]++,{});cov_1ks4ntaci2().s[988]++;if((cov_1ks4ntaci2().b[285][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[285][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[284][0]++;cov_1ks4ntaci2().s[989]++;updatedRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[284][1]++;}cov_1ks4ntaci2().s[990]++;if((cov_1ks4ntaci2().b[287][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[287][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[286][0]++;cov_1ks4ntaci2().s[991]++;updatedRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[286][1]++;}cov_1ks4ntaci2().s[992]++;if((cov_1ks4ntaci2().b[289][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[289][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[288][0]++;cov_1ks4ntaci2().s[993]++;updatedRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[288][1]++;}cov_1ks4ntaci2().s[994]++;if((cov_1ks4ntaci2().b[291][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[291][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[290][0]++;cov_1ks4ntaci2().s[995]++;updatedRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[290][1]++;}cov_1ks4ntaci2().s[996]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,display:"ranges",ranges:updatedRanges});cov_1ks4ntaci2().s[997]++;return this;},/** - * Add a column split on a boolean valued field. - * - * @param {String} fieldName The name of field to split on. - * @param {String} trueDisplayValue A string to display in the true valued column label. - * @param {String} falseDisplayValue A string to display in the false valued column label. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addBooleanColumnSplit:function(fieldName,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[291]++;cov_1ks4ntaci2().s[998]++;if(!this.dataModelObject.fieldByName(fieldName)){cov_1ks4ntaci2().b[292][0]++;cov_1ks4ntaci2().s[999]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[292][1]++;}var f=(cov_1ks4ntaci2().s[1000]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1001]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[293][0]++;cov_1ks4ntaci2().s[1002]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[293][1]++;}cov_1ks4ntaci2().s[1003]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[1004]++;return this;},/** - * Add a column split on a timestamp valued field, binned by the specified bucket size. - * - * @param {String} fieldName The name of field to split on. - * @param {String} binning The size of bins to use, see class docs for valid types. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addTimestampColumnSplit:function(field,binning){cov_1ks4ntaci2().f[292]++;cov_1ks4ntaci2().s[1005]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[294][0]++;cov_1ks4ntaci2().s[1006]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[294][1]++;}var f=(cov_1ks4ntaci2().s[1007]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[1008]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[295][0]++;cov_1ks4ntaci2().s[1009]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[295][1]++;}cov_1ks4ntaci2().s[1010]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[296][0]++;cov_1ks4ntaci2().s[1011]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[296][1]++;}cov_1ks4ntaci2().s[1012]++;this.columns.push({fieldName:field,owner:f.owner,type:f.type,period:binning});cov_1ks4ntaci2().s[1013]++;return this;},/** - * Add an aggregate to each cell of the pivot. - * - * @param {String} fieldName The name of field to aggregate. - * @param {String} label a human readable name for this aggregate. - * @param {String} statsFunction The function to use for aggregation, see class docs for valid stats functions. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addCellValue:function(fieldName,label,statsFunction){cov_1ks4ntaci2().f[293]++;cov_1ks4ntaci2().s[1014]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[297][0]++;cov_1ks4ntaci2().s[1015]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[297][1]++;}var f=(cov_1ks4ntaci2().s[1016]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1017]++;if((cov_1ks4ntaci2().b[299][0]++,utils.contains(["string","ipv4"],f.type))&&(cov_1ks4ntaci2().b[299][1]++,!utils.contains(["list","values","first","last","count","dc"],statsFunction))){cov_1ks4ntaci2().b[298][0]++;cov_1ks4ntaci2().s[1018]++;throw new Error("Stats function on string and IPv4 fields must be one of:"+" list, distinct_values, first, last, count, or distinct_count; found "+statsFunction);}else{cov_1ks4ntaci2().b[298][1]++;cov_1ks4ntaci2().s[1019]++;if((cov_1ks4ntaci2().b[301][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[301][1]++,!utils.contains(["sum","count","average","min","max","stdev","list","values"],statsFunction))){cov_1ks4ntaci2().b[300][0]++;cov_1ks4ntaci2().s[1020]++;throw new Error("Stats function on number field must be must be one of:"+" sum, count, average, max, min, stdev, list, or distinct_values; found "+statsFunction);}else{cov_1ks4ntaci2().b[300][1]++;cov_1ks4ntaci2().s[1021]++;if((cov_1ks4ntaci2().b[303][0]++,"timestamp"===f.type)&&(cov_1ks4ntaci2().b[303][1]++,!utils.contains(["duration","earliest","latest","list","values"],statsFunction))){cov_1ks4ntaci2().b[302][0]++;cov_1ks4ntaci2().s[1022]++;throw new Error("Stats function on timestamp field must be one of:"+" duration, earliest, latest, list, or distinct values; found "+statsFunction);}else{cov_1ks4ntaci2().b[302][1]++;cov_1ks4ntaci2().s[1023]++;if((cov_1ks4ntaci2().b[305][0]++,utils.contains(["objectCount","childCount"],f.type))&&(cov_1ks4ntaci2().b[305][1]++,"count"!==statsFunction)){cov_1ks4ntaci2().b[304][0]++;cov_1ks4ntaci2().s[1024]++;throw new Error("Stats function on childcount and objectcount fields must be count; "+"found "+statsFunction);}else{cov_1ks4ntaci2().b[304][1]++;cov_1ks4ntaci2().s[1025]++;if("boolean"===f.type){cov_1ks4ntaci2().b[306][0]++;cov_1ks4ntaci2().s[1026]++;throw new Error("Cannot use boolean valued fields as cell values.");}else{cov_1ks4ntaci2().b[306][1]++;}}}}}cov_1ks4ntaci2().s[1027]++;this.cells.push({fieldName:fieldName,owner:f.lineage.join("."),type:f.type,label:label,sparkline:false,// Not properly implemented in core yet. -value:statsFunction});cov_1ks4ntaci2().s[1028]++;return this;},/** - * Returns a JSON ready object representation of this pivot specification. - * - * @return {Object} The JSON ready object representation of this pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */toJsonObject:function(){cov_1ks4ntaci2().f[294]++;cov_1ks4ntaci2().s[1029]++;return{dataModel:this.dataModelObject.dataModel.name,baseClass:this.dataModelObject.name,rows:this.rows,columns:this.columns,cells:this.cells,filters:this.filters};},/** - * Query Splunk for SPL queries corresponding to a pivot report - * for this data model, defined by this `PivotSpecification`. - * - * @example - * - * service.dataModels().fetch(function(err, dataModels) { - * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); - * var pivotSpec = searches.createPivotSpecification(); - * // Use of the fluent API - * pivotSpec.addRowSplit("user", "Executing user") - * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) - * .addCellValue("search", "Search Query", "values") - * .pivot(function(pivotErr, pivot) { - * console.log("Pivot search is:", pivot.search); - * }); - * }); - * - * @param {Function} callback A function to call when done getting the pivot: `(err, pivot)`. - * - * @method splunkjs.Service.PivotSpecification - */pivot:function(callback){cov_1ks4ntaci2().f[295]++;var svc=(cov_1ks4ntaci2().s[1030]++,this.dataModelObject.dataModel.service);var args=(cov_1ks4ntaci2().s[1031]++,{pivot_json:JSON.stringify(this.toJsonObject())});cov_1ks4ntaci2().s[1032]++;if(!utils.isUndefined(this.accelerationNamespace)){cov_1ks4ntaci2().b[307][0]++;cov_1ks4ntaci2().s[1033]++;args.namespace=this.accelerationNamespace;}else{cov_1ks4ntaci2().b[307][1]++;}cov_1ks4ntaci2().s[1034]++;return svc.get(Paths.pivot+"/"+encodeURIComponent(this.dataModelObject.dataModel.name),args,function(err,response){cov_1ks4ntaci2().f[296]++;cov_1ks4ntaci2().s[1035]++;if(err){cov_1ks4ntaci2().b[308][0]++;cov_1ks4ntaci2().s[1036]++;callback(new Error(err.data.messages[0].text),response);cov_1ks4ntaci2().s[1037]++;return;}else{cov_1ks4ntaci2().b[308][1]++;}cov_1ks4ntaci2().s[1038]++;if((cov_1ks4ntaci2().b[310][0]++,response.data.entry)&&(cov_1ks4ntaci2().b[310][1]++,response.data.entry[0])){cov_1ks4ntaci2().b[309][0]++;cov_1ks4ntaci2().s[1039]++;callback(null,new root.Pivot(svc,response.data.entry[0].content));}else{cov_1ks4ntaci2().b[309][1]++;cov_1ks4ntaci2().s[1040]++;callback(new Error("Didn't get a Pivot report back from Splunk"),response);}});},/** - * Convenience method to wrap up the `PivotSpecification.pivot()` and - * `Pivot.run()` function calls. - * - * Query Splunk for SPL queries corresponding to a pivot report - * for this data model, defined by this `PivotSpecification`; then, - * starts a search job running this pivot, accelerated if possible. - * - * service.dataModels().fetch(function(fetchErr, dataModels) { - * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); - * var pivotSpec = searches.createPivotSpecification(); - * // Use of the fluent API - * pivotSpec.addRowSplit("user", "Executing user") - * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) - * .addCellValue("search", "Search Query", "values") - * .run(function(err, job, pivot) { - * console.log("Job SID is:", job.sid); - * console.log("Pivot search is:", pivot.search); - * }); - * }); - * @param {Object} args A dictionary of properties for the search job (optional). For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {Function} callback A function to call when done getting the pivot: `(err, job, pivot)`. - * - * @method splunkjs.Service.PivotSpecification - */run:function(args,callback){cov_1ks4ntaci2().f[297]++;cov_1ks4ntaci2().s[1041]++;if(!callback){cov_1ks4ntaci2().b[311][0]++;cov_1ks4ntaci2().s[1042]++;callback=args;cov_1ks4ntaci2().s[1043]++;args={};}else{cov_1ks4ntaci2().b[311][1]++;}cov_1ks4ntaci2().s[1044]++;args=(cov_1ks4ntaci2().b[312][0]++,args)||(cov_1ks4ntaci2().b[312][1]++,{});cov_1ks4ntaci2().s[1045]++;this.pivot(function(err,pivot){cov_1ks4ntaci2().f[298]++;cov_1ks4ntaci2().s[1046]++;if(err){cov_1ks4ntaci2().b[313][0]++;cov_1ks4ntaci2().s[1047]++;callback(err,null,null);}else{cov_1ks4ntaci2().b[313][1]++;cov_1ks4ntaci2().s[1048]++;pivot.run(args,Async.augment(callback,pivot));}});}});/** - * Represents one of the structured views in a `DataModel`. - * - * Has these properties: - * - `dataModel` (_splunkjs.Service.DataModel_): The `DataModel` to which this `DataModelObject` belongs. - * - `name` (_string_): The name of this `DataModelObject`. - * - `displayName` (_string_): The human readable name of this `DataModelObject`. - * - `parentName` (_string_): The name of the parent `DataModelObject` to this one. - * - `lineage` (_array_): An array of strings of the lineage of the data model - * on which this field is defined. - * - `fields` (_object_): A dictionary of `DataModelField` objects, accessible by name. - * - `constraints` (_array_): An array of `DataModelConstraint` objects. - * - `calculations` (_object_): A dictionary of `DataModelCalculation` objects, accessible by ID. - * - * BaseSearch has an additional property: - * - `baseSearch` (_string_): The search query wrapped by this data model object. - * - * BaseTransaction has additional properties: - * - `groupByFields` (_string_): The fields that will be used to group events into transactions. - * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned - * and split into transactions. - * - `maxSpan` (_string_): The maximum time span of a transaction. - * - `maxPause` (_string_): The maximum pause time of a transaction. - * - * @class splunkjs.Service.DataModelObject - */cov_1ks4ntaci2().s[1049]++;root.DataModelObject=Class.extend({/** - * Constructor for a data model object. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `objectName` (_string_): The name for this data model object. - * - `displayName` (_string_): A human readable name for this data model object. - * - `parentName` (_string_): The name of the data model that owns this data model object. - * - `lineage` (_string_): The lineage of the data model that owns this data model object, - * items are delimited by a dot. This is converted into an array of - * strings upon construction. - * - `fields` (_array_): An array of data model fields. - * - `constraints` (_array_): An array of data model constraints. - * - `calculations` (_array_): An array of data model calculations. - * - `baseSearch` (_string_): The search query wrapped by this data model object; exclusive to BaseSearch (optional) - * - `groupByFields` (_array_): The fields that will be used to group events into transactions; exclusive to BaseTransaction (optional) - * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned - * and split into transactions; exclusive to BaseTransaction (optional) - * - `maxSpan` (_string_): The maximum time span of a transaction; exclusive to BaseTransaction (optional) - * - `maxPause` (_string_): The maximum pause time of a transaction; exclusive to BaseTransaction (optional) - * - * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. - * - * @method splunkjs.Service.DataModelObject - */init:function(props,parentDataModel){cov_1ks4ntaci2().f[299]++;cov_1ks4ntaci2().s[1050]++;props=(cov_1ks4ntaci2().b[314][0]++,props)||(cov_1ks4ntaci2().b[314][1]++,{});cov_1ks4ntaci2().s[1051]++;props.owner=(cov_1ks4ntaci2().b[315][0]++,props.owner)||(cov_1ks4ntaci2().b[315][1]++,"");cov_1ks4ntaci2().s[1052]++;this.dataModel=parentDataModel;cov_1ks4ntaci2().s[1053]++;this.name=props.objectName;cov_1ks4ntaci2().s[1054]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[1055]++;this.parentName=props.parentName;cov_1ks4ntaci2().s[1056]++;this.lineage=props.lineage.split(".");// Properties exclusive to BaseTransaction -cov_1ks4ntaci2().s[1057]++;if(props.hasOwnProperty("groupByFields")){cov_1ks4ntaci2().b[316][0]++;cov_1ks4ntaci2().s[1058]++;this.groupByFields=props.groupByFields;}else{cov_1ks4ntaci2().b[316][1]++;}cov_1ks4ntaci2().s[1059]++;if(props.hasOwnProperty("objectsToGroup")){cov_1ks4ntaci2().b[317][0]++;cov_1ks4ntaci2().s[1060]++;this.objectsToGroup=props.objectsToGroup;}else{cov_1ks4ntaci2().b[317][1]++;}cov_1ks4ntaci2().s[1061]++;if(props.hasOwnProperty("transactionMaxTimeSpan")){cov_1ks4ntaci2().b[318][0]++;cov_1ks4ntaci2().s[1062]++;this.maxSpan=props.transactionMaxTimeSpan;}else{cov_1ks4ntaci2().b[318][1]++;}cov_1ks4ntaci2().s[1063]++;if(props.hasOwnProperty("transactionMaxPause")){cov_1ks4ntaci2().b[319][0]++;cov_1ks4ntaci2().s[1064]++;this.maxPause=props.transactionMaxPause;}else{cov_1ks4ntaci2().b[319][1]++;}// Property exclusive to BaseSearch -cov_1ks4ntaci2().s[1065]++;if(props.hasOwnProperty("baseSearch")){cov_1ks4ntaci2().b[320][0]++;cov_1ks4ntaci2().s[1066]++;this.baseSearch=props.baseSearch;}else{cov_1ks4ntaci2().b[320][1]++;}// Parse fields -cov_1ks4ntaci2().s[1067]++;this.fields={};cov_1ks4ntaci2().s[1068]++;for(var i=(cov_1ks4ntaci2().s[1069]++,0);iSearch job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {String} querySuffix A search query, starting with a '|' that will be appended to the command to fetch the contents of this data model object (e.g., "| head 3"). - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @method splunkjs.Service.DataModelObject - */startSearch:function(params,querySuffix,callback){cov_1ks4ntaci2().f[311]++;var query=(cov_1ks4ntaci2().s[1112]++,"| datamodel "+this.dataModel.name+" "+this.name+" search");// Prepend a space to the querySuffix, or set it to an empty string if null or undefined -cov_1ks4ntaci2().s[1113]++;querySuffix=querySuffix?(cov_1ks4ntaci2().b[327][0]++," "+querySuffix):(cov_1ks4ntaci2().b[327][1]++,"");cov_1ks4ntaci2().s[1114]++;this.dataModel.service.search(query+querySuffix,params,callback);},/** - * Returns the data model object this one inherits from if it is a user defined, - * otherwise return null. - * - * @return {splunkjs.Service.DataModelObject|null} This data model object's parent - * or null if this is not a user defined data model object. - * - * @method splunkjs.Service.DataModelObject - */parent:function(){cov_1ks4ntaci2().f[312]++;cov_1ks4ntaci2().s[1115]++;return this.dataModel.objectByName(this.parentName);},/** - * Returns a new Pivot Specification, accepts no parameters. - * - * @return {splunkjs.Service.PivotSpecification} A new pivot specification. - * - * @method splunkjs.Service.DataModelObject - */createPivotSpecification:function(){cov_1ks4ntaci2().f[313]++;cov_1ks4ntaci2().s[1116]++;// Pass in this DataModelObject to create a PivotSpecification -return new root.PivotSpecification(this);}});/** - * Represents a data model on the server. Data models - * contain `DataModelObject` instances, which specify structured - * views on Splunk data. - * - * @endpoint datamodel/model/{name} - * @class splunkjs.Service.DataModel - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[1117]++;root.DataModel=Service.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.DataModel - */path:function(){cov_1ks4ntaci2().f[314]++;cov_1ks4ntaci2().s[1118]++;return Paths.dataModels+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.DataModel`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name for the new data model. - * @param {Object} namespace (Optional) namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Object} props Properties of this data model: - * - `acceleration` (_string_): A JSON object with an `enabled` key, representing if acceleration is enabled or not. - * - `concise` (_string_): Indicates whether to list a concise JSON description of the data model, should always be "0". - * - `description` (_string_): The JSON describing the data model. - * - `displayName` (_string_): The name displayed for the data model in Splunk Web. - * - * @method splunkjs.Service.DataModel - */init:function(service,name,namespace,props){cov_1ks4ntaci2().f[315]++;cov_1ks4ntaci2().s[1119]++;// If not given a 4th arg, assume the namespace was omitted -if(!props){cov_1ks4ntaci2().b[328][0]++;cov_1ks4ntaci2().s[1120]++;props=namespace;cov_1ks4ntaci2().s[1121]++;namespace={};}else{cov_1ks4ntaci2().b[328][1]++;}cov_1ks4ntaci2().s[1122]++;this.name=name;cov_1ks4ntaci2().s[1123]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[1124]++;this.acceleration=(cov_1ks4ntaci2().b[329][0]++,JSON.parse(props.content.acceleration))||(cov_1ks4ntaci2().b[329][1]++,{});cov_1ks4ntaci2().s[1125]++;if(this.acceleration.hasOwnProperty("enabled")){cov_1ks4ntaci2().b[330][0]++;cov_1ks4ntaci2().s[1126]++;// convert the enabled property to a boolean -this.acceleration.enabled=!!this.acceleration.enabled;}else{cov_1ks4ntaci2().b[330][1]++;}// concise=0 (false) forces the server to return all details of the newly created data model. -// we do not want a summary of this data model -cov_1ks4ntaci2().s[1127]++;if((cov_1ks4ntaci2().b[332][0]++,!props.hasOwnProperty("concise"))||(cov_1ks4ntaci2().b[332][1]++,utils.isUndefined(props.concise))){cov_1ks4ntaci2().b[331][0]++;cov_1ks4ntaci2().s[1128]++;this.concise="0";}else{cov_1ks4ntaci2().b[331][1]++;}var dataModelDefinition=(cov_1ks4ntaci2().s[1129]++,JSON.parse(props.content.description));cov_1ks4ntaci2().s[1130]++;this.objectNames=dataModelDefinition.objectNameList;cov_1ks4ntaci2().s[1131]++;this.displayName=dataModelDefinition.displayName;cov_1ks4ntaci2().s[1132]++;this.description=dataModelDefinition.description;// Parse the objects for this data model -var objs=(cov_1ks4ntaci2().s[1133]++,dataModelDefinition.objects);cov_1ks4ntaci2().s[1134]++;this.objects=[];cov_1ks4ntaci2().s[1135]++;for(var i=(cov_1ks4ntaci2().s[1136]++,0);i0);}});}});})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2UuanMiXSwibmFtZXMiOlsiQ29udGV4dCIsInJlcXVpcmUiLCJIdHRwIiwiQXN5bmMiLCJQYXRocyIsIkNsYXNzIiwidXRpbHMiLCJyb290IiwiZXhwb3J0cyIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSIsImV4dGVuZCIsImluaXQiLCJfc3VwZXIiLCJhcHBseSIsImFyZ3VtZW50cyIsIm1vZHVsZSIsInNwZWNpYWxpemUiLCJiaW5kIiwiYXBwcyIsImNvbmZpZ3VyYXRpb25zIiwiaW5kZXhlcyIsInNhdmVkU2VhcmNoZXMiLCJqb2JzIiwidXNlcnMiLCJjdXJyZW50VXNlciIsInZpZXdzIiwiZmlyZWRBbGVydEdyb3VwcyIsImRhdGFNb2RlbHMiLCJvd25lciIsImFwcCIsImh0dHAiLCJzY2hlbWUiLCJob3N0IiwicG9ydCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZXNzaW9uS2V5IiwidmVyc2lvbiIsIkFwcGxpY2F0aW9ucyIsIm5hbWVzcGFjZSIsIkNvbmZpZ3VyYXRpb25zIiwiSW5kZXhlcyIsIlNhdmVkU2VhcmNoZXMiLCJzdG9yYWdlUGFzc3dvcmRzIiwiU3RvcmFnZVBhc3N3b3JkcyIsIkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb24iLCJKb2JzIiwiRGF0YU1vZGVscyIsIlVzZXJzIiwiVmlld3MiLCJzZWFyY2giLCJxdWVyeSIsInBhcmFtcyIsImNhbGxiYWNrIiwiaXNGdW5jdGlvbiIsImdldEpvYiIsInNpZCIsImpvYiIsIkpvYiIsImZldGNoIiwib25lc2hvdFNlYXJjaCIsInRoYXQiLCJyZXEiLCJnZXQiLCJlcnIiLCJyZXNwb25zZSIsImRhdGEiLCJlbnRyeSIsImNvbnRlbnQiLCJ1c2VyIiwiVXNlciIsIndhc0Fib3J0ZWQiLCJzZXJ2ZXJJbmZvIiwiU2VydmVySW5mbyIsInBhcnNlIiwicSIsInBhcnNlciIsInR5cGVhaGVhZCIsInByZWZpeCIsImNvdW50IiwicmVzdWx0cyIsImxvZyIsImV2ZW50IiwiaXNPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5IiwicGF0aCIsInBhdGhzIiwic3VibWl0RXZlbnQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsInBvc3QiLCJyZXF1ZXN0IiwiRW5kcG9pbnQiLCJzZXJ2aWNlIiwicXVhbGlmaWVkUGF0aCIsIkVycm9yIiwiZGVsIiwicmVscGF0aCIsInVybCIsImdldF92MiIsIlJlc291cmNlIiwiZnVsbHBhdGgiLCJfcHJvcGVydGllcyIsIl9zdGF0ZSIsIl9sb2FkIiwicHJvcGVydGllcyIsInN0YXRlIiwiRW50aXR5IiwiZmV0Y2hPblVwZGF0ZSIsInJlbW92ZSIsInVwZGF0ZSIsImZpZWxkcyIsImxpbmtzIiwiYWNsIiwiYXV0aG9yIiwidXBkYXRlZCIsInB1Ymxpc2hlZCIsImVuYWJsZSIsImRpc2FibGUiLCJyZWxvYWQiLCJfZmllbGRzIiwiX2FjbCIsIl9saW5rcyIsImlzQXJyYXkiLCJfYXV0aG9yIiwiX3VwZGF0ZWQiLCJfcHVibGlzaGVkIiwib3B0aW9ucyIsInByb3BzIiwiaGFzT3duUHJvcGVydHkiLCJDb2xsZWN0aW9uIiwiZmV0Y2hPbkVudGl0eUNyZWF0aW9uIiwiY3JlYXRlIiwibGlzdCIsIml0ZW0iLCJpbnN0YW50aWF0ZUVudGl0eSIsIl9lbnRpdGllcyIsIl9lbnRpdGllc0J5TmFtZSIsIl9wYWdpbmciLCJlbnRpdGllcyIsImVudGl0aWVzQnlOYW1lIiwiZW50aXR5UHJvcGVydHlMaXN0IiwiaSIsImxlbmd0aCIsImVudGl0eSIsInB1c2giLCJuYW1lIiwicGFnaW5nIiwiZmV0Y2hfdjIiLCJpZCIsImlzRW1wdHkiLCJmdWxsUGF0aCIsImNsb25lIiwiU2F2ZWRTZWFyY2giLCJlbmNvZGVVUklDb21wb25lbnQiLCJhY2tub3dsZWRnZSIsImRpc3BhdGNoIiwiaGlzdG9yeSIsInN1cHByZXNzSW5mbyIsImFsZXJ0Q291bnQiLCJwYXJzZUludCIsInRyaWdnZXJlZF9hbGVydF9jb3VudCIsImZpcmVkQWxlcnRHcm91cCIsIkZpcmVkQWxlcnRHcm91cCIsImpvYkRhdGEiLCJuYW1lc3BhY2VGcm9tUHJvcGVydGllcyIsImNhbGwiLCJlbnRpdHlOYW1lc3BhY2UiLCJTdG9yYWdlUGFzc3dvcmQiLCJGaXJlZEFsZXJ0IiwiZmlyZWRBbGVydHMiLCJhY3Rpb25zIiwiYWxlcnRUeXBlIiwiYWxlcnRfdHlwZSIsImlzRGlnZXN0TW9kZSIsImRpZ2VzdF9tb2RlIiwiZXhwaXJhdGlvblRpbWUiLCJleHBpcmF0aW9uX3RpbWVfcmVuZGVyZWQiLCJzYXZlZFNlYXJjaE5hbWUiLCJzYXZlZHNlYXJjaF9uYW1lIiwic2V2ZXJpdHkiLCJ0cmlnZ2VyVGltZSIsInRyaWdnZXJfdGltZSIsInRyaWdnZXJUaW1lUmVuZGVyZWQiLCJ0cmlnZ2VyX3RpbWVfcmVuZGVyZWQiLCJ0cmlnZ2VyZWRBbGVydENvdW50IiwidHJpZ2dlcmVkX2FsZXJ0cyIsImZpcmVkQWxlcnREYXRhIiwiZmlyZWRBbGVydCIsIkFwcGxpY2F0aW9uIiwic2V0dXBJbmZvIiwidXBkYXRlSW5mbyIsImluZm8iLCJWaWV3IiwiSW5kZXgiLCJyZXN1bHQiLCJ2ZXJzaW9uQ29tcGFyZSIsIkNvbmZpZ3VyYXRpb25TdGFuemEiLCJmaWxlIiwiQ29uZmlndXJhdGlvbkZpbGUiLCJnZXREZWZhdWx0U3RhbnphIiwic3RhbnphTmFtZSIsInZhbHVlcyIsImZpbGVuYW1lIiwiX19jb25mIiwiZG9lc0ZpbGVFeGlzdCIsImZpbGVzIiwiZmlsdGVyIiwiZiIsImNvZGUiLCJtZXNzYWdlIiwiY29uZmlndXJhdGlvbkZpbGUiLCJmZXRjaGVkRmlsZSIsImVycm9yIiwiZXJyb3JDb2RlIiwiZXJyb3JNZXNzYWdlIiwiZG9lc1N0YW56YUV4aXN0Iiwic3RhbnphIiwiZmV0Y2hlZFN0YW56YSIsImNyZWF0ZV92MiIsImNvbmZpZ3MiLCJzdmMiLCJrZXlWYWx1ZU1hcCIsImRvZXNGaWxlRXhpc3RSZXNwb25zZSIsImNvbmZpZ0ZpbGUiLCJjb25zb2xlIiwibmV3RmlsZSIsImRvZXNTdGFuemFFeGlzdFJlc3BvbnNlIiwiY29uZmlnU3RhbnphIiwibmV3U3RhbnphIiwidXBkYXRlZFN0YW56YSIsImNhbmNlbCIsImRpc2FibGVQcmV2aWV3IiwiZW5hYmxlUHJldmlldyIsImV2ZW50cyIsImZpbmFsaXplIiwicGF1c2UiLCJwcmV2aWV3Iiwic2VhcmNobG9nIiwic2V0UHJpb3JpdHkiLCJzZXRUVEwiLCJzdW1tYXJ5IiwidGltZWxpbmUiLCJ0b3VjaCIsInVucGF1c2UiLCJhY3Rpb24iLCJvdXRwdXRfbW9kZSIsIml0ZXJhdG9yIiwidHlwZSIsIlBhZ2luYXRlZEVuZHBvaW50SXRlcmF0b3IiLCJ2YWx1ZSIsInByaW9yaXR5IiwidHRsIiwidHJhY2siLCJjYWxsYmFja3MiLCJwZXJpb2QiLCJkb25lIiwibm9DYWxsYmFja3NBZnRlclJlYWR5IiwicHJvZ3Jlc3MiLCJmYWlsZWQiLCJyZWFkeSIsIl9wcmVyZWFkeSIsIl9zdG9wcGVkQWZ0ZXJSZWFkeSIsImVtaXR0ZWRSZWFkeSIsImRvbmVMb29waW5nIiwid2hpbHN0IiwibmV4dEl0ZXJhdGlvbiIsImRpc3BhdGNoU3RhdGUiLCJub3RSZWFkeSIsImlzRG9uZSIsImlzRmFpbGVkIiwic2xlZXAiLCJleGVjX21vZGUiLCJ0b0xvd2VyQ2FzZSIsIm91dHB1dE1vZGUiLCJEYXRhTW9kZWxGaWVsZCIsIl90eXBlcyIsImZpZWxkTmFtZSIsImRpc3BsYXlOYW1lIiwibXVsdGl2YWx1ZWQiLCJtdWx0aXZhbHVlIiwicmVxdWlyZWQiLCJoaWRkZW4iLCJlZGl0YWJsZSIsImNvbW1lbnQiLCJmaWVsZFNlYXJjaCIsImxpbmVhZ2UiLCJzcGxpdCIsImlzU3RyaW5nIiwiaXNOdW1iZXIiLCJpc1RpbWVzdGFtcCIsImlzT2JqZWN0Y291bnQiLCJpc0NoaWxkY291bnQiLCJpc0lQdjQiLCJpc0Jvb2xlYW4iLCJEYXRhTW9kZWxDb25zdHJhaW50IiwiRGF0YU1vZGVsQ2FsY3VsYXRpb24iLCJjYWxjdWxhdGlvbklEIiwiY2FsY3VsYXRpb25UeXBlIiwib3V0cHV0RmllbGRzIiwiZXhwcmVzc2lvbiIsImlucHV0RmllbGQiLCJsb29rdXBOYW1lIiwiaW5wdXRGaWVsZE1hcHBpbmdzIiwibG9va3VwSW5wdXRzIiwib3V0cHV0RmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJpc0VkaXRhYmxlIiwiaXNMb29rdXAiLCJpc0V2YWwiLCJpc1JleCIsImlzR2VvSVAiLCJQaXZvdCIsImRyaWxsZG93blNlYXJjaCIsImRyaWxsZG93bl9zZWFyY2giLCJwcmV0dHlRdWVyeSIsIm9wZW5JblNlYXJjaCIsIm9wZW5faW5fc2VhcmNoIiwicGl2b3RTZWFyY2giLCJwaXZvdF9zZWFyY2giLCJ0c3RhdHNTZWFyY2giLCJ0c3RhdHNfc2VhcmNoIiwicnVuIiwiYXJncyIsImlzVW5kZWZpbmVkIiwiUGl2b3RTcGVjaWZpY2F0aW9uIiwiX2NvbXBhcmlzb25zIiwiYm9vbGVhbiIsInN0cmluZyIsIm51bWJlciIsImlwdjQiLCJfYmlubmluZyIsIl9zb3J0RGlyZWN0aW9uIiwiX3N0YXRzRnVuY3Rpb25zIiwiZGF0YU1vZGVsT2JqZWN0IiwiY29sdW1ucyIsInJvd3MiLCJmaWx0ZXJzIiwiY2VsbHMiLCJhY2NlbGVyYXRpb25OYW1lc3BhY2UiLCJkYXRhTW9kZWwiLCJpc0FjY2VsZXJhdGVkIiwicGl2b3QiLCJzZXRBY2NlbGVyYXRpb25Kb2IiLCJhZGRGaWx0ZXIiLCJjb21wYXJpc29uVHlwZSIsImNvbXBhcmlzb25PcCIsImNvbXBhcmVUbyIsImhhc0ZpZWxkIiwiZmllbGRCeU5hbWUiLCJjb250YWlucyIsInJldCIsImpvaW4iLCJydWxlIiwiY29tcGFyYXRvciIsImFkZExpbWl0RmlsdGVyIiwic29ydEF0dHJpYnV0ZSIsInNvcnREaXJlY3Rpb24iLCJsaW1pdCIsInN0YXRzRnVuY3Rpb24iLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlT3duZXIiLCJsaW1pdEFtb3VudCIsInN0YXRzRm4iLCJsaW1pdFR5cGUiLCJhZGRSb3dTcGxpdCIsImxhYmVsIiwicm93IiwiZGlzcGxheSIsImFkZFJhbmdlUm93U3BsaXQiLCJmaWVsZCIsInJhbmdlcyIsInVwZGF0ZVJhbmdlcyIsInN0YXJ0IiwiZW5kIiwic3RlcCIsInNpemUiLCJtYXhOdW1iZXJPZiIsImFkZEJvb2xlYW5Sb3dTcGxpdCIsInRydWVEaXNwbGF5VmFsdWUiLCJmYWxzZURpc3BsYXlWYWx1ZSIsInRydWVMYWJlbCIsImZhbHNlTGFiZWwiLCJhZGRUaW1lc3RhbXBSb3dTcGxpdCIsImJpbm5pbmciLCJhZGRDb2x1bW5TcGxpdCIsImNvbCIsImFkZFJhbmdlQ29sdW1uU3BsaXQiLCJ1cGRhdGVkUmFuZ2VzIiwiYWRkQm9vbGVhbkNvbHVtblNwbGl0IiwiYWRkVGltZXN0YW1wQ29sdW1uU3BsaXQiLCJhZGRDZWxsVmFsdWUiLCJzcGFya2xpbmUiLCJ0b0pzb25PYmplY3QiLCJiYXNlQ2xhc3MiLCJwaXZvdF9qc29uIiwibWVzc2FnZXMiLCJ0ZXh0IiwiYXVnbWVudCIsIkRhdGFNb2RlbE9iamVjdCIsInBhcmVudERhdGFNb2RlbCIsIm9iamVjdE5hbWUiLCJwYXJlbnROYW1lIiwiZ3JvdXBCeUZpZWxkcyIsIm9iamVjdHNUb0dyb3VwIiwibWF4U3BhbiIsInRyYW5zYWN0aW9uTWF4VGltZVNwYW4iLCJtYXhQYXVzZSIsInRyYW5zYWN0aW9uTWF4UGF1c2UiLCJiYXNlU2VhcmNoIiwiY29uc3RyYWludHMiLCJqIiwiY2FsY3VsYXRpb25zIiwiayIsImlzQmFzZVNlYXJjaCIsImlzQmFzZVRyYW5zYWN0aW9uIiwiZmllbGROYW1lcyIsImNhbGN1bGF0ZWRGaWVsZHMiLCJhbGxGaWVsZHMiLCJjb21iaW5lZEZpZWxkcyIsImNmIiwiYWxsRmllbGROYW1lcyIsImNhbGN1bGF0aW9uSURzIiwiY2FsY3VsYXRpb24iLCJjYWxjdWxhdGVkRmllbGROYW1lcyIsImNyZWF0ZUxvY2FsQWNjZWxlcmF0aW9uSm9iIiwiZWFybGllc3RUaW1lIiwidW5kZWZpbmVkIiwiZWFybGllc3RfdGltZSIsInN0YXJ0U2VhcmNoIiwicXVlcnlTdWZmaXgiLCJwYXJlbnQiLCJvYmplY3RCeU5hbWUiLCJjcmVhdGVQaXZvdFNwZWNpZmljYXRpb24iLCJEYXRhTW9kZWwiLCJhY2NlbGVyYXRpb24iLCJlbmFibGVkIiwiY29uY2lzZSIsImRhdGFNb2RlbERlZmluaXRpb24iLCJkZXNjcmlwdGlvbiIsIm9iamVjdE5hbWVzIiwib2JqZWN0TmFtZUxpc3QiLCJvYmpzIiwib2JqZWN0cyIsImhhc09iamVjdCIsInVwZGF0ZWRQcm9wcyIsImFjY2NlbGVyYXRpb24iLCJjcm9uX3NjaGVkdWxlIiwiY3JvblNjaGVkdWxlIiwiZGF0YU1vZGVsTmFtZXNwYWNlIiwicmVwbGFjZSIsImVuZHBvaW50IiwiX2VuZHBvaW50IiwiX3BhZ2VzaXplIiwicGFnZXNpemUiLCJfb2Zmc2V0IiwibmV4dCIsIm9mZnNldCIsIm51bVJlc3VsdHMiXSwibWFwcGluZ3MiOiI4bnZOQWVZO21IQWZaLEssQ0FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLENBQUMsVUFBVyxDQUNSLGFBRFEsd0JBR1IsR0FBSUEsQ0FBQUEsT0FBTywwQkFBT0MsT0FBTyxDQUFDLFdBQUQsQ0FBZCxDQUFYLENBQ0EsR0FBSUMsQ0FBQUEsSUFBSSwwQkFBVUQsT0FBTyxDQUFDLFFBQUQsQ0FBakIsQ0FBUixDQUNBLEdBQUlFLENBQUFBLEtBQUssMEJBQVNGLE9BQU8sQ0FBQyxTQUFELENBQWhCLENBQVQsQ0FDQSxHQUFJRyxDQUFBQSxLQUFLLDBCQUFTSCxPQUFPLENBQUMsU0FBRCxDQUFQLENBQW1CRyxLQUE1QixDQUFULENBQ0EsR0FBSUMsQ0FBQUEsS0FBSywwQkFBU0osT0FBTyxDQUFDLGdCQUFELENBQVAsQ0FBMEJJLEtBQW5DLENBQVQsQ0FDQSxHQUFJQyxDQUFBQSxLQUFLLDBCQUFTTCxPQUFPLENBQUMsU0FBRCxDQUFoQixDQUFULENBRUEsR0FBSU0sQ0FBQUEsSUFBSSwwQkFBRyw0QkFBQUMsT0FBTywrQkFBSSxJQUFKLENBQVYsQ0FBUixDQUNBLEdB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UCxDQUFnQjZYLFVBQVUsQ0FBRyxDQUE3QixDQUFSLENBQ0gsQ0FDSixDQVZNLENBQVAsQ0FXSCxDQTdCeUMsQ0FBYixDQUFqQyxDQStCSCxDQTNwTEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEqL1xuLy8gQ29weXJpZ2h0IDIwMTQgU3BsdW5rLCBJbmMuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTogeW91IG1heVxuLy8gbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW5cbi8vIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVRcbi8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZVxuLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgXG4gICAgdmFyIENvbnRleHQgICAgID0gcmVxdWlyZSgnLi9jb250ZXh0Jyk7XG4gICAgdmFyIEh0dHAgICAgICAgID0gcmVxdWlyZSgnLi9odHRwJyk7XG4gICAgdmFyIEFzeW5jICAgICAgID0gcmVxdWlyZSgnLi9hc3luYycpO1xuICAgIHZhciBQYXRocyAgICAgICA9IHJlcXVpcmUoJy4vcGF0aHMnKS5QYXRocztcbiAgICB2YXIgQ2xhc3MgICAgICAgPSByZXF1aXJlKCcuL2pxdWVyeS5jbGFzcycpLkNsYXNzO1xuICAgIHZhciB1dGlscyAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbiAgICBcbiAgICB2YXIgcm9vdCA9IGV4cG9ydHMgfHwgdGhpcztcbiAgICB2YXIgU2VydmljZSA9IG51bGw7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gU3BsdW5rIEVudGVycHJpc2UgYW5kIFNwbHVuayBTdG9ybS5cbiAgICAgKiBcbiAgICAgKiBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBhbmQgaXMgdGhlcmVmb3JlIFNESy1wcml2YXRlLlxuICAgICAqIFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5wcml2YXRlLkJhc2VTZXJ2aWNlXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuQ29udGV4dFxuICAgICAqL1xuICAgIHZhciBCYXNlU2VydmljZSA9IENvbnRleHQuZXh0ZW5kKHtcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJvb3QgYWNjZXNzIHBvaW50IHRvIFNwbHVuayBmdW5jdGlvbmFsaXR5IHdpdGggdHlwZWQgYWNjZXNzIHRvIFxuICAgICAqIFNwbHVuayByZXNvdXJjZXMgc3VjaCBhcyBzZWFyY2hlcywgaW5kZXhlcywgaW5wdXRzLCBhbmQgbW9yZS4gUHJvdmlkZXNcbiAgICAgKiBtZXRob2RzIHRvIGF1dGhlbnRpY2F0ZSBhbmQgY3JlYXRlIHNwZWNpYWxpemVkIGluc3RhbmNlcyBvZiB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMucHJpdmF0ZS5CYXNlU2VydmljZVxuICAgICAqL1xuICAgIG1vZHVsZS5leHBvcnRzID0gcm9vdCA9IFNlcnZpY2UgPSBCYXNlU2VydmljZS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuSHR0cH0gaHR0cCBBbiBpbnN0YW5jZSBvZiBhIGBzcGx1bmtqcy5IdHRwYCBjbGFzcy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVyczogXG4gICAgICAgICAqICAgIC0gYHNjaGVtZWAgKF9zdHJpbmdfKTogVGhlIHNjaGVtZSAoXCJodHRwXCIgb3IgXCJodHRwc1wiKSBmb3IgYWNjZXNzaW5nIFNwbHVuay5cbiAgICAgICAgICogICAgLSBgaG9zdGAgKF9zdHJpbmdfKTogVGhlIGhvc3QgbmFtZSAodGhlIGRlZmF1bHQgaXMgXCJsb2NhbGhvc3RcIikuXG4gICAgICAgICAqICAgIC0gYHBvcnRgIChfaW50ZWdlcl8pOiBUaGUgcG9ydCBudW1iZXIgKHRoZSBkZWZhdWx0IGlzIDgwODkpLlxuICAgICAgICAgKiAgICAtIGB1c2VybmFtZWAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayBhY2NvdW50IHVzZXJuYW1lLCB3aGljaCBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgU3BsdW5rIGluc3RhbmNlLlxuICAgICAgICAgKiAgICAtIGBwYXNzd29yZGAgKF9zdHJpbmdfKTogVGhlIHBhc3N3b3JkLCB3aGljaCBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgU3BsdW5rIGluc3RhbmNlLlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIG93bmVyICh1c2VybmFtZSkgY29tcG9uZW50IG9mIHRoZSBuYW1lc3BhY2UuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb21wb25lbnQgb2YgdGhlIG5hbWVzcGFjZS5cbiAgICAgICAgICogICAgLSBgc2Vzc2lvbktleWAgKF9zdHJpbmdfKTogVGhlIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbi5cbiAgICAgICAgICogICAgLSBgYXV0b2xvZ2luYCAoX2Jvb2xlYW5fKTogYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvZyBpbiBhZ2FpbiBpZiB0aGUgc2Vzc2lvbiB0ZXJtaW5hdGVzLCBgZmFsc2VgIGlmIG5vdCAoYHRydWVgIGJ5IGRlZmF1bHQpLlxuICAgICAgICAgKiAgICAtIGB2ZXJzaW9uYCAoX3N0cmluZ18pOiBUaGUgdmVyc2lvbiBzdHJpbmcgZm9yIFNwbHVuaywgZm9yIGV4YW1wbGUgXCI0LjMuMlwiICh0aGUgZGVmYXVsdCBpcyBcIjUuMFwiKS5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLnNwZWNpYWxpemUgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zcGVjaWFsaXplKTtcbiAgICAgICAgICAgIHRoaXMuYXBwcyAgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmFwcHMpO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9ucyAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY29uZmlndXJhdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleGVzICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuaW5kZXhlcyk7XG4gICAgICAgICAgICB0aGlzLnNhdmVkU2VhcmNoZXMgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zYXZlZFNlYXJjaGVzKTtcbiAgICAgICAgICAgIHRoaXMuam9icyAgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmpvYnMpO1xuICAgICAgICAgICAgdGhpcy51c2VycyAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudXNlcnMpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlciAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY3VycmVudFVzZXIpO1xuICAgICAgICAgICAgdGhpcy52aWV3cyAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudmlld3MpO1xuICAgICAgICAgICAgdGhpcy5maXJlZEFsZXJ0R3JvdXBzICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmlyZWRBbGVydEdyb3Vwcyk7XG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbHMgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kYXRhTW9kZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBgU2VydmljZWAgaW5zdGFuY2UgZm9yXG4gICAgICAgICAqIGEgc3BlY2lmaWMgbmFtZXNwYWNlIGNvbnRleHQuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzdmMgPSAuLi47XG4gICAgICAgICAqICAgICAgdmFyIG5ld1NlcnZpY2UgPSBzdmMuc3BlY2lhbGl6ZShcIm15dXNlclwiLCBcInVuaXhcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvd25lciBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBhcHAgVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2V9IFRoZSBzcGVjaWFsaXplZCBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgc3BlY2lhbGl6ZTogZnVuY3Rpb24ob3duZXIsIGFwcCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlKHRoaXMuaHR0cCwge1xuICAgICAgICAgICAgICAgIHNjaGVtZTogdGhpcy5zY2hlbWUsXG4gICAgICAgICAgICAgICAgaG9zdDogdGhpcy5ob3N0LCAgIFxuICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydCwgICAgICAgXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgICAgICAgICAgIGFwcDogYXBwLCBcbiAgICAgICAgICAgICAgICBzZXNzaW9uS2V5OiB0aGlzLnNlc3Npb25LZXksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgQXBwbGljYXRpb25zYCBjb2xsZWN0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIFxuICAgICAgICAgKiBsaXN0IGluc3RhbGxlZCBhcHBzIGFuZCByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgaW5zdGFsbGVkIGFwcHNcbiAgICAgICAgICogICAgICB2YXIgYXBwcyA9IHN2Yy5hcHBzKCk7XG4gICAgICAgICAqICAgICAgYXBwcy5mZXRjaChmdW5jdGlvbihlcnIpIHsgY29uc29sZS5sb2coYXBwcy5saXN0KCkpOyB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9ufSBUaGUgYEFwcGxpY2F0aW9uc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWxcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGFwcHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkFwcGxpY2F0aW9ucyh0aGlzKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgQ29uZmlndXJhdGlvbnNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IFxuICAgICAgICAgKiBjcmVhdGUsIGxpc3QsIGFuZCByZXRyaWV2ZSBjb25maWd1cmF0aW9uICguY29uZikgZmlsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgcHJvcGVydGllcyBpbiB0aGUgJ3Byb3BzLmNvbmYnIGZpbGVcbiAgICAgICAgICogICAgICB2YXIgZmlsZXMgPSBzdmMuY29uZmlndXJhdGlvbnMoKTtcbiAgICAgICAgICogICAgICBmaWxlcy5pdGVtKFwicHJvcHNcIiwgZnVuY3Rpb24oZXJyLCBwcm9wc0ZpbGUpIHtcbiAgICAgICAgICogICAgICAgICAgcHJvcHNGaWxlLmZldGNoKGZ1bmN0aW9uKGVyciwgcHJvcHMpIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BzLnByb3BlcnRpZXMoKSk7IFxuICAgICAgICAgKiAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnN9IFRoZSBgQ29uZmlndXJhdGlvbnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBjb25maWdzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGNvbmZpZ3VyYXRpb25zOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Db25maWd1cmF0aW9ucyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBJbmRleGVzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIFxuICAgICAgICAgKiBsaXN0LCBhbmQgdXBkYXRlIGluZGV4ZXMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYW4gX2ludGVybmFsIGluZGV4XG4gICAgICAgICAqICAgICAgdmFyIGluZGV4ZXMgPSBzdmMuaW5kZXhlcygpO1xuICAgICAgICAgKiAgICAgIGluZGV4ZXMuZmV0Y2goZnVuY3Rpb24oZXJyLCBpbmRleGVzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXMuaXRlbShcIl9pbnRlcm5hbFwiKTtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJXYXMgaW5kZXggZm91bmQ6IFwiICsgISFpbmRleCk7XG4gICAgICAgICAqICAgICAgICAgIC8vIGBpbmRleGAgaXMgYW4gSW5kZXggb2JqZWN0LlxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5JbmRleGVzfSBUaGUgYEluZGV4ZXNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqLyAgICAgICAgXG4gICAgICAgIGluZGV4ZXM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkgeyBcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5JbmRleGVzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFNhdmVkU2VhcmNoZXNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91XG4gICAgICAgICAqIGNyZWF0ZSwgbGlzdCwgYW5kIHVwZGF0ZSBzYXZlZCBzZWFyY2hlcy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgIyBvZiBzYXZlZCBzZWFyY2hlc1xuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaGVzID0gc3ZjLnNhdmVkU2VhcmNoZXMoKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaGVzLmZldGNoKGZ1bmN0aW9uKGVyciwgc2F2ZWRTZWFyY2hlcykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIiMgT2YgU2F2ZWQgU2VhcmNoZXM6IFwiICsgc2F2ZWRTZWFyY2hlcy5saXN0KCkubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc30gVGhlIGBTYXZlZFNlYXJjaGVzYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICAgICAqL1xuICAgICAgICBzYXZlZFNlYXJjaGVzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5TYXZlZFNlYXJjaGVzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFN0b3JhZ2VQYXNzd29yZHNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91XG4gICAgICAgICAqIGNyZWF0ZSwgbGlzdCwgYW5kIHVwZGF0ZSBzdG9yYWdlIHBhc3N3b3Jkcy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgIyBvZiBzdG9yYWdlIHBhc3N3b3Jkc1xuICAgICAgICAgKiAgICAgIHZhciBzdG9yYWdlUGFzc3dvcmRzID0gc3ZjLnN0b3JhZ2VQYXNzd29yZHMoKTtcbiAgICAgICAgICogICAgICBzdG9yYWdlUGFzc3dvcmRzLmZldGNoKGZ1bmN0aW9uKGVyciwgc3RvcmFnZVBhc3N3b3Jkcykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIiMgb2YgU3RvcmFnZSBQYXNzd29yZHM6IFwiICsgc3RvcmFnZVBhc3N3b3Jkcy5saXN0KCkubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc30gVGhlIGBTdG9yYWdlUGFzc3dvcmRzYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc3RvcmFnZS9wYXNzd29yZHNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRzXG4gICAgICAgICAqL1xuICAgICAgICBzdG9yYWdlUGFzc3dvcmRzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5TdG9yYWdlUGFzc3dvcmRzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBGaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdVxuICAgICAgICAgKiBsaXN0IGFsZXJ0IGdyb3Vwcy5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqICAgICAgXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgIyBvZiBmaXJlZCBhbGVydCBncm91cHNcbiAgICAgICAgICogICAgICB2YXIgZmlyZWRBbGVydEdyb3VwcyA9IHN2Yy5maXJlZEFsZXJ0R3JvdXBzKCk7XG4gICAgICAgICAqICAgICAgZmlyZWRBbGVydEdyb3Vwcy5mZXRjaChmdW5jdGlvbihlcnIsIGZpcmVkQWxlcnRHcm91cHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCIjIG9mIGFsZXJ0IGdyb3VwczogXCIgKyBmaXJlZEFsZXJ0R3JvdXBzLmxpc3QoKS5sZW5ndGgpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9ufSBUaGUgYEZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25gIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlc1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGZpcmVkQWxlcnRHcm91cHM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb24odGhpcywgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYEpvYnNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IGNyZWF0ZSwgbGlzdCxcbiAgICAgICAgICogYW5kIHJldHJpZXZlIHNlYXJjaCBqb2JzLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBMaXN0IGFsbCBqb2IgSURzXG4gICAgICAgICAqICAgICAgdmFyIGpvYnMgPSBzdmMuam9icygpO1xuICAgICAgICAgKiAgICAgIGpvYnMuZmV0Y2goZnVuY3Rpb24oZXJyLCBqb2JzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBsaXN0ID0gam9icy5saXN0KCk7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkpvYiBcIiArIChpKzEpICsgXCI6IFwiICsgbGlzdFtpXS5zaWQpO1xuICAgICAgICAgKiAgICAgICAgICB9XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYnN9IFRoZSBgSm9ic2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuSm9ic1xuICAgICAgICAgKi9cbiAgICAgICAgam9iczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuSm9icyh0aGlzLCBuYW1lc3BhY2UpOyAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYERhdGFNb2RlbHNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IGNyZWF0ZSwgbGlzdCxcbiAgICAgICAgICogYW5kIHJldHJpZXZlIGRhdGEgbW9kZWxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgZGF0YW1vZGVsL21vZGVsXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAgICAgKi9cbiAgICAgICAgZGF0YU1vZGVsczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRGF0YU1vZGVscyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgVXNlcnNgIGNvbGxlY3Rpb24sIHdoaWNoIGxldHMgeW91IGNyZWF0ZSwgXG4gICAgICAgICAqIGxpc3QsIGFuZCByZXRyaWV2ZSB1c2Vycy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgdXNlcm5hbWVzXG4gICAgICAgICAqICAgICAgdmFyIHVzZXJzID0gc3ZjLnVzZXJzKCk7XG4gICAgICAgICAqICAgICAgdXNlcnMuZmV0Y2goZnVuY3Rpb24oZXJyLCB1c2Vycykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgbGlzdCA9IHVzZXJzLmxpc3QoKTtcbiAgICAgICAgICogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBcIiArIChpKzEpICsgXCI6IFwiICsgbGlzdFtpXS5wcm9wZXJ0aWVzKCkubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Vc2Vyc30gVGhlIGBVc2Vyc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGF1dGhvcml6YXRpb24vdXNlcnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlVzZXJzKHRoaXMpOyAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFZpZXdzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsXG4gICAgICAgICAqIGxpc3QsIGFuZCByZXRyaWV2ZSB2aWV3cyAoY3VzdG9tIFVJcyBidWlsdCBpbiBTcGx1bmsncyBhcHAgZnJhbWV3b3JrKS4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgdmlld3NcbiAgICAgICAgICogICAgICB2YXIgdmlld3MgPSBzdmMudmlld3MoKTtcbiAgICAgICAgICogICAgICB2aWV3cy5mZXRjaChmdW5jdGlvbihlcnIsIHZpZXdzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBsaXN0ID0gdmlld3MubGlzdCgpO1xuICAgICAgICAgKiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJWaWV3IFwiICsgKGkrMSkgKyBcIjogXCIgKyBsaXN0W2ldLnByb3BlcnRpZXMoKS5uYW1lKTtcbiAgICAgICAgICogICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5WaWV3c30gVGhlIGBWaWV3c2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGRhdGEvdWkvdmlld3NcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi9cbiAgICAgICAgdmlld3M6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlZpZXdzKHRoaXMsIG5hbWVzcGFjZSk7ICBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2VhcmNoIGpvYiB3aXRoIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYGV4ZWNfbW9kZWAgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBzZWFyY2g6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9bm9ybWFsYCB0byByZXR1cm4gYSBzZWFyY2ggam9iIElEIGltbWVkaWF0ZWx5IChkZWZhdWx0KS5cbiAgICAgICAgICogICAgICBQb2xsIGZvciBjb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4geW91IGNhbiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0cy4gXG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9YmxvY2tpbmdgIHRvIHJldHVybiB0aGUgc2VhcmNoIGpvYiBJRCB3aGVuIHRoZSBzZWFyY2ggaGFzIGZpbmlzaGVkLlxuICAgICAgICAgKiBcbiAgICAgICAgICogVG8gcnVuIGEgb25lc2hvdCBzZWFyY2gsIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBidXQgcmF0aGVyIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHRzLCB1c2UgYFNlcnZpY2Uub25lc2hvdFNlYXJjaGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5zZWFyY2goXCJzZWFyY2ggRVJST1JcIiwge2lkOiBcIm15am9iXzEyM1wifSwgZnVuY3Rpb24oZXJyLCBuZXdKb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCI6IG5ld0pvYi5zaWQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCIgaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGNyZWF0ZWQgam9iOiBgKGVyciwgY3JlYXRlZEpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIG5hbWVzcGFjZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGpvYnMgPSBuZXcgcm9vdC5Kb2JzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gam9icy5zZWFyY2gocXVlcnksIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYSBgSm9iYCBieSBpdHMgc2lkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2lkIFRoZSBzZWFyY2ggSUQgZm9yIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBnZXRKb2I6IGZ1bmN0aW9uKHNpZCwgbmFtZXNwYWNlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5hbWVzcGFjZTtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGpvYiA9IG5ldyByb290LkpvYih0aGlzLCBzaWQsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gam9iLmZldGNoKHt9LCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG9uZXNob3Qgc2VhcmNoIGZyb20gYSBnaXZlbiBzZWFyY2ggcXVlcnkgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5vbmVzaG90U2VhcmNoKFwic2VhcmNoIEVSUk9SXCIsIHtpZDogXCJteWpvYl8xMjNcIn0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJFU1VMVCBGSUVMRFNcIjogcmVzdWx0cy5maWVsZHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaDpcbiAgICAgICAgICogICAgLSBgb3V0cHV0X21vZGVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgcmVzdWx0cyAoWE1MLCBKU09OLCBvciBDU1YpLlxuICAgICAgICAgKiAgICAtIGBlYXJsaWVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGVhcmxpZXN0IHRpbWUgaW4gdGhlIHRpbWUgcmFuZ2UgdG8gc2VhcmNoLiBUaGUgdGltZSBzdHJpbmcgY2FuIGJlIGEgVVRDIHRpbWUgKHdpdGggZnJhY3Rpb25hbCBzZWNvbmRzKSwgYSByZWxhdGl2ZSB0aW1lIHNwZWNpZmllciAodG8gbm93KSwgb3IgYSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXG4gICAgICAgICAqICAgIC0gYGxhdGVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGxhdGVzdCB0aW1lIGluIHRoZSB0aW1lIHJhbmdlIHRvIHNlYXJjaC4gVGhlIHRpbWUgc3RyaW5nIGNhbiBiZSBhIFVUQyB0aW1lICh3aXRoIGZyYWN0aW9uYWwgc2Vjb25kcyksIGEgcmVsYXRpdmUgdGltZSBzcGVjaWZpZXIgKHRvIG5vdyksIG9yIGEgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgICAgICAgKiAgICAtIGByZmAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpZWxkcyB0byBhZGQgdG8gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2g6IGAoZXJyLCByZXN1bHRzKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9ic1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIG9uZXNob3RTZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIG5hbWVzcGFjZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGpvYnMgPSBuZXcgcm9vdC5Kb2JzKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gam9icy5vbmVzaG90U2VhcmNoKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGxvZ2dlZCBpbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmN1cnJlbnRVc2VyKGZ1bmN0aW9uKGVyciwgdXNlcikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlYWwgbmFtZTogXCIsIHVzZXIucHJvcGVydGllcygpLnJlYWxuYW1lKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHVzZXIgaW5zdGFuY2U6IGAoZXJyLCB1c2VyKWAuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuY3VycmVudFVzZXJ9IFRoZSBgVXNlcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhdXRob3JpemF0aW9uL2N1cnJlbnQtY29udGV4dFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIGN1cnJlbnRVc2VyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5nZXQoUGF0aHMuY3VycmVudFVzZXIsIHt9LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZSA9IHJlc3BvbnNlLmRhdGEuZW50cnlbMF0uY29udGVudC51c2VybmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXIgPSBuZXcgcm9vdC5Vc2VyKHRoYXQsIHVzZXJuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5mZXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLnNlcnZlckluZm8oZnVuY3Rpb24oZXJyLCBpbmZvKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3BsdW5rIFZlcnNpb246IFwiLCBpbmZvLnByb3BlcnRpZXMoKS52ZXJzaW9uKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlcnZlciBpbmZvOiBgKGVyciwgaW5mbylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VydmVyL2luZm9cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBzZXJ2ZXJJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgc2VydmVySW5mbyA9IG5ldyByb290LlNlcnZlckluZm8odGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gc2VydmVySW5mby5mZXRjaChjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIGEgc2VhcmNoIHF1ZXJ5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UucGFyc2UoXCJzZWFyY2ggaW5kZXg9X2ludGVybmFsIHwgaGVhZCAxXCIsIGZ1bmN0aW9uKGVyciwgcGFyc2UpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDb21tYW5kczogXCIsIHBhcnNlLmNvbW1hbmRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkgdG8gcGFyc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQW4gb2JqZWN0IG9mIG9wdGlvbnMgZm9yIHRoZSBwYXJzZXI6XG4gICAgICAgICAqICAgIC0gYGVuYWJsZV9sb29rdXBzYCAoX2Jvb2xlYW5fKTogSWYgYHRydWVgLCBwZXJmb3JtcyByZXZlcnNlIGxvb2t1cHMgdG8gZXhwYW5kIHRoZSBzZWFyY2ggZXhwcmVzc2lvbi5cbiAgICAgICAgICogICAgLSBgb3V0cHV0X21vZGVgIChfc3RyaW5nXyk6IFRoZSBvdXRwdXQgZm9ybWF0IChYTUwgb3IgSlNPTikuXG4gICAgICAgICAqICAgIC0gYHBhcnNlX29ubHlgIChfYm9vbGVhbl8pOiBJZiBgdHJ1ZWAsIGRpc2FibGVzIHRoZSBleHBhbnNpb24gb2Ygc2VhcmNoIGR1ZSB0byBldmFsdWF0aW9uIG9mIHN1YnNlYXJjaGVzLCB0aW1lIHRlcm0gZXhwYW5zaW9uLCBsb29rdXBzLCB0YWdzLCBldmVudHR5cGVzLCBhbmQgc291cmNldHlwZSBhbGlhcy5cbiAgICAgICAgICogICAgLSBgcmVsb2FkX21hY3Jvc2AgKF9ib29sZWFuXyk6IElmIGB0cnVlYCwgcmVsb2FkcyBtYWNybyBkZWZpbml0aW9ucyBmcm9tIG1hY3Jvcy5jb25mLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgcGFyc2UgaW5mbzogYChlcnIsIHBhcnNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvcGFyc2VyXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhcmFtcy5xID0gcXVlcnk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChQYXRocy5wYXJzZXIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb3ZpZGVzIGF1dG8tY29tcGxldGUgc3VnZ2VzdGlvbnMgZm9yIHNlYXJjaCBxdWVyaWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UudHlwZWFoZWFkKFwiaW5kZXg9XCIsIDEwLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJBdXRvY29tcGxldGlvbiBvcHRpb25zOiBcIiwgb3B0aW9ucyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggVGhlIHF1ZXJ5IGZyYWdtZW50IHRvIGF1dG9jb21wbGV0ZS5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Ygb3B0aW9ucyB0byByZXR1cm4gKG9wdGlvbmFsKS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGF1dG9jb21wbGV0aW9uIGluZm86IGAoZXJyLCBvcHRpb25zKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvdHlwZWFoZWFkXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZWFoZWFkOiBmdW5jdGlvbihwcmVmaXgsIGNvdW50LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKGNvdW50KSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY291bnQ7XG4gICAgICAgICAgICAgICAgY291bnQgPSAxMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDogY291bnQgfHwgMTAsXG4gICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChQYXRocy50eXBlYWhlYWQsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0gKHJlc3BvbnNlLmRhdGEgfHwge30pLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMgfHwgW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvZ3MgYW4gZXZlbnQgdG8gU3BsdW5rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UubG9nKFwiQSBuZXcgZXZlbnRcIiwge2luZGV4OiBcIl9pbnRlcm5hbFwiLCBzb3VyY2V0eXBlOiBcIm15c291cmNldHlwZVwifSwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTdWJtaXR0ZWQgZXZlbnQ6IFwiLCByZXN1bHQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGV2ZW50IFRoZSB0ZXh0IGZvciB0aGlzIGV2ZW50LCBvciBhIEpTT04gb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwYXJhbWV0ZXJzIGZvciBpbmRleGluZzogXG4gICAgICAgICAqICAgIC0gYGluZGV4YCAoX3N0cmluZ18pOiBUaGUgaW5kZXggdG8gc2VuZCBldmVudHMgZnJvbSB0aGlzIGlucHV0IHRvLlxuICAgICAgICAgKiAgICAtIGBob3N0YCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIEhvc3QgZmllbGQgZm9yIGV2ZW50cyBmcm9tIHRoaXMgZGF0YSBpbnB1dC4gXG4gICAgICAgICAqICAgIC0gYGhvc3RfcmVnZXhgIChfc3RyaW5nXyk6IEEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZXh0cmFjdCB0aGUgaG9zdCB2YWx1ZSBmcm9tIGVhY2ggZXZlbnQuIFxuICAgICAgICAgKiAgICAtIGBzb3VyY2VgIChfc3RyaW5nXyk6IFRoZSB2YWx1ZSB0byBwb3B1bGF0ZSBpbiB0aGUgU291cmNlIGZpZWxkIGZvciBldmVudHMgZnJvbSB0aGlzIGRhdGEgaW5wdXQuXG4gICAgICAgICAqICAgIC0gYHNvdXJjZXR5cGVgIChfc3RyaW5nXyk6IFRoZSB2YWx1ZSB0byBwb3B1bGF0ZSBpbiB0aGUgU291cmNldHlwZSBmaWVsZCBmb3IgZXZlbnRzIGZyb20gdGhpcyBkYXRhIGlucHV0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgc3VibWl0dGVkOiBgKGVyciwgcmVzdWx0KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCByZWNlaXZlcnMvc2ltcGxlXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgbG9nOiBmdW5jdGlvbihldmVudCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgYSBKU09OIG9iamVjdCwgY29udmVydCBpdCB0byBhIHN0cmluZy5cbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudCA9IEpTT04uc3RyaW5naWZ5KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLnBhdGhzLnN1Ym1pdEV2ZW50O1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7XCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L3BsYWluXCJ9O1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBldmVudDtcbiAgICAgICAgICAgIHZhciBnZXQgPSBwYXJhbXM7XG4gICAgICAgICAgICB2YXIgcG9zdCA9IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5yZXF1ZXN0KFxuICAgICAgICAgICAgICAgIHBhdGgsIFxuICAgICAgICAgICAgICAgIG1ldGhvZCwgXG4gICAgICAgICAgICAgICAgZ2V0LCBcbiAgICAgICAgICAgICAgICBwb3N0LCBcbiAgICAgICAgICAgICAgICBib2R5LCBcbiAgICAgICAgICAgICAgICBoZWFkZXJzLCBcbiAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGJhc2UgZGVmaW5pdGlvbiBmb3IgYSBTcGx1bmsgZW5kcG9pbnQsIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2ZcbiAgICAgKiBhIHNwZWNpZmljIHNlcnZpY2UgYW5kIHBhdGguIFByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIEdFVCwgUE9TVCwgYW5kXG4gICAgICogREVMRVRFIG9wZXJhdGlvbnMgdXNlZCBpbiBzcGx1bmtqcywgYXV0b21hdGljYWxseSBwcmVwYXJpbmcgdGhlIHBhdGggY29ycmVjdGx5XG4gICAgICogYW5kIGFsbG93aW5nIGZvciByZWxhdGl2ZSBjYWxscy5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICovXG4gICAgcm9vdC5FbmRwb2ludCA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVhbGlmaWVkUGF0aCBBIGZ1bGx5LXF1YWxpZmllZCByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCIvc2VydmljZXMvc2VhcmNoL2pvYnNcIikuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnR9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBxdWFsaWZpZWRQYXRoKSB7XG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzZWQgaW4gYSBudWxsIFNlcnZpY2UuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXF1YWxpZmllZFBhdGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzZWQgaW4gYW4gZW1wdHkgcGF0aC5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgICAgICB0aGlzLnF1YWxpZmllZFBhdGggPSBxdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuZ2V0ICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmdldCk7XG4gICAgICAgICAgICAvLyB0aGlzLmdldF92MiA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5nZXRfdjIpO1xuICAgICAgICAgICAgdGhpcy5wb3N0ICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucG9zdCk7XG4gICAgICAgICAgICB0aGlzLmRlbCAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kZWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIHJlbGF0aXZlIEdFVCByZXF1ZXN0IG9uIGFuIGVuZHBvaW50J3MgcGF0aCxcbiAgICAgICAgICogY29tYmluZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhbmQgYSByZWxhdGl2ZSBwYXRoIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBXaWxsIG1ha2UgYSByZXF1ZXN0IHRvIHtzZXJ2aWNlLnByZWZpeH0vc2VhcmNoL2pvYnMvMTIzNDU2L3Jlc3VsdHM/b2Zmc2V0PTFcbiAgICAgICAgICogICAgICB2YXIgZW5kcG9pbnQgPSBuZXcgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludChzZXJ2aWNlLCBcInNlYXJjaC9qb2JzLzEyMzQ1XCIpO1xuICAgICAgICAgKiAgICAgIGVuZHBvaW50LmdldChcInJlc3VsdHNcIiwge29mZnNldDogMX0sIGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhcIkRPTkVcIikpfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWxwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGVuZHBvaW50IHBhdGguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZTogYChlcnIsIHJlc3BvbnNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0X3YyOiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnF1YWxpZmllZFBhdGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCB3ZSB3aWxsIGFwcGVuZCBpdCB3aXRoIGEgcHJlY2VkaW5nXG4gICAgICAgICAgICAvLyBzbGFzaC5cbiAgICAgICAgICAgIGlmIChyZWxwYXRoKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgXCIvXCIgKyByZWxwYXRoOyAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5nZXRfdjIoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcmZvcm1zIGEgcmVsYXRpdmUgUE9TVCByZXF1ZXN0IG9uIGFuIGVuZHBvaW50J3MgcGF0aCxcbiAgICAgICAgICogY29tYmluZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhbmQgYSByZWxhdGl2ZSBwYXRoIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBXaWxsIG1ha2UgYSByZXF1ZXN0IHRvIHtzZXJ2aWNlLnByZWZpeH0vc2VhcmNoL2pvYnMvMTIzNDU2L2NvbnRyb2xcbiAgICAgICAgICogICAgICB2YXIgZW5kcG9pbnQgPSBuZXcgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludChzZXJ2aWNlLCBcInNlYXJjaC9qb2JzLzEyMzQ1XCIpO1xuICAgICAgICAgKiAgICAgIGVuZHBvaW50LnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiY2FuY2VsXCJ9LCBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coXCJDQU5DRUxMRURcIikpfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWxwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGVuZHBvaW50IHBhdGguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgYm9keS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGU6IGAoZXJyLCByZXNwb25zZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRcbiAgICAgICAgICovXG4gICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHJlbHBhdGgsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnF1YWxpZmllZFBhdGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCB3ZSB3aWxsIGFwcGVuZCBpdCB3aXRoIGEgcHJlY2VkaW5nXG4gICAgICAgICAgICAvLyBzbGFzaC5cbiAgICAgICAgICAgIGlmIChyZWxwYXRoKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgXCIvXCIgKyByZWxwYXRoOyAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5wb3N0KFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcmZvcm1zIGEgcmVsYXRpdmUgREVMRVRFIHJlcXVlc3Qgb24gYW4gZW5kcG9pbnQncyBwYXRoLFxuICAgICAgICAgKiBjb21iaW5lZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGFuZCBhIHJlbGF0aXZlIHBhdGggaWYgc3BlY2lmaWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIFdpbGwgbWFrZSBhIHJlcXVlc3QgdG8ge3NlcnZpY2UucHJlZml4fS9zZWFyY2gvam9icy8xMjM0NTZcbiAgICAgICAgICogICAgICB2YXIgZW5kcG9pbnQgPSBuZXcgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludChzZXJ2aWNlLCBcInNlYXJjaC9qb2JzLzEyMzQ1XCIpO1xuICAgICAgICAgKiAgICAgIGVuZHBvaW50LmRlbGV0ZShcIlwiLCB7fSwgZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKFwiREVMRVRFRFwiKSl9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHJlbHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIGFwcGVuZCB0byB0aGUgZW5kcG9pbnQgcGF0aC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgZW50aXR5LXNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlOiBgKGVyciwgcmVzcG9uc2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBkZWw6IGZ1bmN0aW9uKHJlbHBhdGgsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnF1YWxpZmllZFBhdGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCB3ZSB3aWxsIGFwcGVuZCBpdCB3aXRoIGEgcHJlY2VkaW5nXG4gICAgICAgICAgICAvLyBzbGFzaC5cbiAgICAgICAgICAgIGlmIChyZWxwYXRoKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgXCIvXCIgKyByZWxwYXRoOyAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kZWwoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgYmFzZSBkZWZpbml0aW9uIGZvciBhIFNwbHVuayByZXNvdXJjZSAoZm9yIGV4YW1wbGUsIGFuIGVudGl0eSBcbiAgICAgKiBzdWNoIGFzIGFuIGluZGV4IG9yIHNlYXJjaCBqb2IsIG9yIGEgY29sbGVjdGlvbiBvZiBlbnRpdGllcykuIFByb3ZpZGVzIFxuICAgICAqIGJhc2ljIG1ldGhvZHMgZm9yIGhhbmRsaW5nIFNwbHVuayByZXNvdXJjZXMsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgXG4gICAgICogYWNjZXNzaW5nIHByb3BlcnRpZXMuIFxuICAgICAqXG4gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYmVjYXVzZSBtb3N0IG1ldGhvZHMgYXJlIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4uXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRcbiAgICAgKi9cbiAgICByb290LlJlc291cmNlID0gcm9vdC5FbmRwb2ludC5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggQSByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCJzZWFyY2gvam9ic1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2V9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBwYXRoLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHZhciBmdWxscGF0aCA9IHNlcnZpY2UuZnVsbHBhdGgocGF0aCwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgZnVsbHBhdGgpO1xuICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuX2xvYWQgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuX2xvYWQpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaCAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5mZXRjaCk7XG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnBhdGggICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnBhdGgpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNVVNUIEJFIE9WRVJSSURERU5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIHJlc291cmNlIGFuZCBzdG9yZXMgdGhlIHByb3BlcnRpZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlc291cmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgX2xvYWQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlZnJlc2hlcyB0aGUgcmVzb3VyY2UgYnkgZmV0Y2hpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICogYW5kIGxvYWRpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmV0cmlldmVkOiBgKGVyciwgcmVzb3VyY2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTVVTVCBCRSBPVkVSUklEREVOXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlc291cmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgICAgICovXG4gICAgICAgIHByb3BlcnRpZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGZ1bGwgc3RhdGUgKHByb3BlcnRpZXMgYW5kIG1ldGFkYXRhKSBvZiB0aGlzIHJlc291cmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjdXJyZW50IGZ1bGwgc3RhdGUgb2YgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgYmFzZSBjbGFzcyBmb3IgYSBTcGx1bmsgZW50aXR5LCB3aGljaCBpcyBhIHdlbGwtZGVmaW5lZCBjb25zdHJ1Y3RcbiAgICAgKiB3aXRoIGNlcnRhaW4gb3BlcmF0aW9ucyAoc3VjaCBhcyBcInByb3BlcnRpZXNcIiwgXCJ1cGRhdGVcIiwgYW5kIFwiZGVsZXRlXCIpLiBcbiAgICAgKiBFbnRpdGllcyBpbmNsdWRlIHNlYXJjaCBqb2JzLCBpbmRleGVzLCBpbnB1dHMsIGFwcHMsIGFuZCBtb3JlLiBcbiAgICAgKlxuICAgICAqIFByb3ZpZGVzIGJhc2ljIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBTcGx1bmsgZW50aXRpZXMsIHN1Y2ggYXMgZmV0Y2hpbmcgYW5kXG4gICAgICogdXBkYXRpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgKi9cbiAgICByb290LkVudGl0eSA9IHJvb3QuUmVzb3VyY2UuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc3RhdGljIHByb3BlcnR5IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIFxuICAgICAgICAgKiB1cGRhdGUgdG8gZ2V0IHRoZSB1cGRhdGVkIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgXG4gICAgICAgICAqIGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJucyAoZWNob2VzKSB0aGUgdXBkYXRlZCBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25VcGRhdGU6IGZhbHNlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBBIHJlbGF0aXZlIGVuZHBvaW50IHBhdGggKGZvciBleGFtcGxlLCBcInNlYXJjaC9qb2JzXCIpLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5FbnRpdHl9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgcGF0aCwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLl9sb2FkICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5fbG9hZCk7XG4gICAgICAgICAgICB0aGlzLmZldGNoICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5mZXRjaCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZW1vdmUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGRzICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZpZWxkcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmtzICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5saW5rcyk7XG4gICAgICAgICAgICB0aGlzLmFjbCAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5hY2wpO1xuICAgICAgICAgICAgdGhpcy5hdXRob3IgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuYXV0aG9yKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZCAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoZWQgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucHVibGlzaGVkKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmVuYWJsZSk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGUgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kaXNhYmxlKTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnJlbG9hZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9maWVsZHMgICAgID0ge307XG4gICAgICAgICAgICB0aGlzLl9hY2wgICAgICAgID0ge307XG4gICAgICAgICAgICB0aGlzLl9saW5rcyAgICAgID0ge307XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGVudGl0eSBhbmQgc3RvcmVzIHRoZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgX2xvYWQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB1dGlscy5pc0FycmF5KHByb3BlcnRpZXMpID8gcHJvcGVydGllc1swXSA6IHByb3BlcnRpZXM7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHByb3BlcnRpZXMgdG9cbiAgICAgICAgICAgIC8vIGVtcHR5IHZhbHVlc1xuICAgICAgICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHt9LFxuICAgICAgICAgICAgICAgIGZpZWxkczoge30sXG4gICAgICAgICAgICAgICAgYWNsOiB7fSxcbiAgICAgICAgICAgICAgICBsaW5rczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBUYWtlIG91dCB0aGUgZW50aXR5LXNwZWNpZmljIGNvbnRlbnRcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmNvbnRlbnQgICB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyAgICAgPSBwcm9wZXJ0aWVzLmZpZWxkcyAgICB8fCB0aGlzLl9maWVsZHMgfHwge307XG4gICAgICAgICAgICB0aGlzLl9hY2wgICAgICAgID0gcHJvcGVydGllcy5hY2wgICAgICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl9saW5rcyAgICAgID0gcHJvcGVydGllcy5saW5rcyAgICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl9hdXRob3IgICAgID0gcHJvcGVydGllcy5hdXRob3IgICAgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWQgICAgPSBwcm9wZXJ0aWVzLnVwZGF0ZWQgICB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcHVibGlzaGVkICA9IHByb3BlcnRpZXMucHVibGlzaGVkIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBmaWVsZHMgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LCBpbmRpY2F0aW5nIHdoaWNoIFxuICAgICAgICAgKiBmaWVsZHMgYXJlIHdpbGRjYXJkcywgcmVxdWlyZWQsIGFuZCBvcHRpb25hbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgZmllbGRzIGluZm9ybWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBmaWVsZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgKEFDTCkgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LFxuICAgICAgICAgKiB3aGljaCBjb250YWlucyB0aGUgcGVybWlzc2lvbnMgZm9yIGFjY2Vzc2luZyB0aGUgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBBQ0wuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGFjbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWNsO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgbGlua3MgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LCB3aGljaCBpcyB0aGUgVVJJIG9mXG4gICAgICAgICAqIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhlIG1hbmFnZW1lbnQgcG9ydCBvZiBhIFNwbHVuayBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbGlua3MgaW5mb3JtYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGxpbmtzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5rcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGF1dGhvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGF1dGhvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRob3I7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSB1cGRhdGVkIHRpbWUgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1cGRhdGVkIHRpbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwdWJsaXNoZWQgdGltZSBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHB1Ymxpc2hlZCB0aW1lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBwdWJsaXNoZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3B1Ymxpc2hlZDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWZyZXNoZXMgdGhlIGVudGl0eSBieSBmZXRjaGluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHNlcnZlciBhbmQgXG4gICAgICAgICAqIGxvYWRpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgY291bnRgIChfaW50ZWdlcl8pOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLlxuICAgICAgICAgKiAgICAtIGBvZmZzZXRgIChfaW50ZWdlcl8pOiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtIHRvIHJldHVybi5cbiAgICAgICAgICogICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHRvIGZpbHRlciByZXNwb25zZXMuXG4gICAgICAgICAqICAgIC0gYHNvcnRfZGlyYCAoX3N0cmluZ18pOiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgcmV0dXJuZWQgaXRlbXM6IOKAnGFzY+KAnSBvciDigJxkZXNj4oCdLlxuICAgICAgICAgKiAgICAtIGBzb3J0X2tleWAgKF9zdHJpbmdfKTogVGhlIGZpZWxkIHRvIHVzZSBmb3Igc29ydGluZyAob3B0aW9uYWwpLlxuICAgICAgICAgKiAgICAtIGBzb3J0X21vZGVgIChfc3RyaW5nXyk6IFRoZSBjb2xsYXRpbmcgc2VxdWVuY2UgZm9yIHNvcnRpbmcgcmV0dXJuZWQgaXRlbXM6IOKAnGF1dG/igJ0sIOKAnGFscGhh4oCdLCDigJxhbHBoYV9jYXNl4oCdLCBvciDigJxudW3igJ0uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmV0cmlldmVkOiBgKGVyciwgcmVzb3VyY2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwiXCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fbG9hZChyZXNwb25zZS5kYXRhID8gcmVzcG9uc2UuZGF0YS5lbnRyeSA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBlbnRpdHkgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQ6IGAoZXJyKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWwoXCJcIiwge30sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB0aGUgb2JqZWN0IHdpdGguXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgdXBkYXRlZDogYChlcnIsIGVudGl0eSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvcHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0ICduYW1lJyBmaWVsZCBpbiAndXBkYXRlJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcIlwiLCBwcm9wcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmICghZXJyICYmICF0aGF0LmZldGNoT25VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fbG9hZChyZXNwb25zZS5kYXRhLmVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWVyciAmJiB0aGF0LmZldGNoT25VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5mZXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGhlIGVudGl0eSBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIGRpc2FibGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5wb3N0KFwiZGlzYWJsZVwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgdGhlIGVudGl0eSBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIGVuYWJsZWQ6IGAoZXJyLCBlbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMucG9zdChcImVuYWJsZVwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbG9hZHMgdGhlIGVudGl0eSBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJlbG9hZGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnBvc3QoXCJfcmVsb2FkXCIsIHt9LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBiYXNlIGNsYXNzIGZvciBhIFNwbHVuayBjb2xsZWN0aW9uLCB3aGljaCBpcyBhIHdlbGwtZGVmaW5lZCBjb25zdHJ1Y3RcbiAgICAgKiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBjb2xsZWN0aW9ucyBvZiBlbnRpdGllcywgc3VjaCBhcyBcbiAgICAgKiBjcmVhdGluZyBhbmQgbGlzdGluZyBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICovXG4gICAgcm9vdC5Db2xsZWN0aW9uID0gcm9vdC5SZXNvdXJjZS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBzdGF0aWMgcHJvcGVydHkgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gXG4gICAgICAgICAqIGVudGl0eSBoYXMgYmVlbiBjcmVhdGVkLiBCeSBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIFxuICAgICAgICAgKiBiZWNhdXNlIHRoZSBlbmRwb2ludCByZXR1cm5zIChlY2hvZXMpIHRoZSBuZXcgZW50aXR5LlxuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaE9uRW50aXR5Q3JlYXRpb246IGZhbHNlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggQSByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCJzZWFyY2gvam9ic1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgcGF0aCwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLl9sb2FkICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLl9sb2FkKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2ggICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmV0Y2gpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGUgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5jcmVhdGUpO1xuICAgICAgICAgICAgdGhpcy5saXN0ICAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5saXN0KTtcbiAgICAgICAgICAgIHRoaXMuaXRlbSAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuaXRlbSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbnRpYXRlRW50aXR5ID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmluc3RhbnRpYXRlRW50aXR5KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzICAgICAgID0gW107XG4gICAgICAgICAgICB0aGlzLl9lbnRpdGllc0J5TmFtZSA9IHt9OyAgICBcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgICAgID0ge307XG4gICAgICAgICAgICB0aGlzLl9wYWdpbmcgICAgICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICAgICAgPSB7fTsgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGVudGl0eS4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRW50aXR5fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNVVNUIEJFIE9WRVJSSURERU5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGNvbGxlY3Rpb24gYW5kIHByb3BlcnRpZXMsIGFuZCBjcmVhdGVzIGEgbWFwIG9mIGVudGl0eVxuICAgICAgICAgKiBuYW1lcyB0byBlbnRpdHkgSURzIChmb3IgcmV0cmlldmFsIHB1cnBvc2VzKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9sb2FkOiBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGVudGl0aWVzID0gW107XG4gICAgICAgICAgICB2YXIgZW50aXRpZXNCeU5hbWUgPSB7fTtcbiAgICAgICAgICAgIHZhciBlbnRpdHlQcm9wZXJ0eUxpc3QgPSBwcm9wZXJ0aWVzLmVudHJ5IHx8IFtdO1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGVudGl0eVByb3BlcnR5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IGVudGl0eVByb3BlcnR5TGlzdFtpXTtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhpcy5pbnN0YW50aWF0ZUVudGl0eShwcm9wcyk7XG4gICAgICAgICAgICAgICAgZW50aXR5Ll9sb2FkKHByb3BzKTtcbiAgICAgICAgICAgICAgICBlbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGVudGl0aWVzQnlOYW1lLmhhc093blByb3BlcnR5KGVudGl0eS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdGllc0J5TmFtZVtlbnRpdHkubmFtZV0ucHVzaChlbnRpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNCeU5hbWVbZW50aXR5Lm5hbWVdID0gW2VudGl0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZW50aXRpZXMgICAgICAgPSBlbnRpdGllcztcbiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzQnlOYW1lID0gZW50aXRpZXNCeU5hbWU7XG4gICAgICAgICAgICB0aGlzLl9wYWdpbmcgICAgICAgICA9IHByb3BlcnRpZXMucGFnaW5nICAgIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICAgICAgPSBwcm9wZXJ0aWVzLmxpbmtzICAgICB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWQgICAgICAgID0gcHJvcGVydGllcy51cGRhdGVkICAgfHwgbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpbmtzIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbGxlY3Rpb24sIHdoaWNoIGlzIHRoZSBVUkkgb2ZcbiAgICAgICAgICogdGhlIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBtYW5hZ2VtZW50IHBvcnQgb2YgYSBTcGx1bmsgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGxpbmtzIGluZm9ybWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbGlua3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmtzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgYXV0aG9yIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGF1dGhvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHBhZ2luZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5nO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgdXBkYXRlZCB0aW1lIGZvciB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHVwZGF0ZWQgdGltZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVmcmVzaGVzIHRoZSByZXNvdXJjZSBieSBmZXRjaGluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHNlcnZlciBhbmQgXG4gICAgICAgICAqIGxvYWRpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEEgZGljdGlvbmFyeSBvZiBjb2xsZWN0aW9uIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbiBvcHRpb25zOlxuICAgICAgICAgKiAgICAtIGBjb3VudGAgKF9pbnRlZ2VyXyk6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4uXG4gICAgICAgICAqICAgIC0gYG9mZnNldGAgKF9pbnRlZ2VyXyk6IFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGl0ZW0gdG8gcmV0dXJuLlxuICAgICAgICAgKiAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggcXVlcnkgdG8gZmlsdGVyIHJlc3BvbnNlcy5cbiAgICAgICAgICogICAgLSBgc29ydF9kaXJgIChfc3RyaW5nXyk6IFRoZSBkaXJlY3Rpb24gdG8gc29ydCByZXR1cm5lZCBpdGVtczog4oCcYXNj4oCdIG9yIOKAnGRlc2PigJ0uXG4gICAgICAgICAqICAgIC0gYHNvcnRfa2V5YCAoX3N0cmluZ18pOiBUaGUgZmllbGQgdG8gdXNlIGZvciBzb3J0aW5nIChvcHRpb25hbCkuXG4gICAgICAgICAqICAgIC0gYHNvcnRfbW9kZWAgKF9zdHJpbmdfKTogVGhlIGNvbGxhdGluZyBzZXF1ZW5jZSBmb3Igc29ydGluZyByZXR1cm5lZCBpdGVtczog4oCcYXV0b+KAnSwg4oCcYWxwaGHigJ0sIOKAnGFscGhhX2Nhc2XigJ0sIG9yIOKAnG51beKAnS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyByZXRyaWV2ZWQ6IGAoZXJyLCByZXNvdXJjZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jb3VudCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhhdC5nZXQoXCJcIiwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZldGNoX3YyOiBhc3luYyBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jb3VudCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCB0aGF0LmdldF92MihcIlwiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIC8vIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuYm9keSk7XG4gICAgICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3BlY2lmaWMgZW50aXR5IGZyb20gdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcHMgPSBzZXJ2aWNlLmFwcHMoKTtcbiAgICAgICAgICogICAgICBhcHBzLmZldGNoKGZ1bmN0aW9uKGVyciwgYXBwcykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgYXBwID0gYXBwcy5pdGVtKFwic2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNlYXJjaCBBcHAgRm91bmQ6IFwiICsgISFhcHApO1xuICAgICAgICAgKiAgICAgICAgICAvLyBgYXBwYCBpcyBhbiBBcHBsaWNhdGlvbiBvYmplY3QuXG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRvIHJldHJpZXZlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIHdpbGRjYXJkIHZhbHVlIFwiLVwiLCBpcyBub3QgYWNjZXB0YWJsZSB3aGVuIHNlYXJjaGluZyBmb3IgYW4gZW50aXR5LlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIHdpbGRjYXJkIHZhbHVlIFwiLVwiIGlzIHVuYWNjZXB0YWJsZSB3aGVuIHNlYXJjaGluZyBmb3IgYW4gZW50aXR5LlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3BsdW5ranMuU2VydmljZS5FbnRpdHl9IFRoZSBlbnRpdHksIG9yIGBudWxsYCBpZiBvbmUgaXMgbm90IGZvdW5kLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbTogZnVuY3Rpb24oaWQsIG5hbWVzcGFjZSkgeyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0VtcHR5KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgfSAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3Qgc3VwbHkgYSBub24tZW1wdHkgbmFtZS5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgJiYgKG5hbWVzcGFjZS5hcHAgPT09ICctJyB8fCBuYW1lc3BhY2Uub3duZXIgPT09ICctJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXaGVuIHNlYXJjaGluZyBmb3IgYW4gZW50aXR5LCB3aWxkY2FyZHMgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBuYW1lc3BhY2UuIFBsZWFzZSByZWZpbmUgeW91ciBzZWFyY2guXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgZnVsbFBhdGggPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VudGl0aWVzQnlOYW1lLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzQnlOYW1lW2lkXTsgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDEgJiYgIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBlbnRpdHkgd2l0aCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIG5hbWUgYW5kIHRoZSB1c2VyIGRpZCBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmeSBhIG5hbWVzcGFjZSwgdGhlbiB3ZSBqdXN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50aXRpZXNbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudGl0aWVzLmxlbmd0aCA9PT0gMSAmJiBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3BlY2lmaWVkIGEgbmFtZXNwYWNlLCB0aGVuIHdlIFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHJldHVybiB0aGUgZW50aXR5IGlmIGl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZ1bGwgcGF0aFxuICAgICAgICAgICAgICAgICAgICBmdWxsUGF0aCA9IHRoaXMuc2VydmljZS5mdWxscGF0aChlbnRpdGllc1swXS5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllc1swXS5xdWFsaWZpZWRQYXRoID09PSBmdWxsUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0aWVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50aXRpZXMubGVuZ3RoID4gMSAmJiAhbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZW50aXR5IGFuZCB3ZSBkaWRuJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmeSBhIG5hbWVzcGFjZSwgdGhlbiB3ZSByZXR1cm4gYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gc2F5aW5nIHRoZSBtYXRjaCBpcyBhbWJpZ3VvdXNcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW1iaWd1b3VzIG1hdGNoIGZvciBuYW1lICdcIiArIGlkICsgXCInXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBlbnRpdHksIGFuZCB3ZSBkbyBoYXZlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbmFtZXNwYWNlLCBzbyB3ZSB0cnkgYW5kIGZpbmQgaXRcbiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gZW50aXRpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsUGF0aCA9IHRoaXMuc2VydmljZS5mdWxscGF0aChlbnRpdGllc1tpXS5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LnF1YWxpZmllZFBhdGggPT09IGZ1bGxQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBlbnRpdHkgb24gdGhlIHNlcnZlciBmb3IgdGhpcyBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHBzID0gc2VydmljZS5hcHBzKCk7XG4gICAgICAgICAqICAgICAgYXBwcy5jcmVhdGUoe25hbWU6IFwiTmV3U2VhcmNoQXBwXCJ9LCBmdW5jdGlvbihlcnIsIG5ld0FwcCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNSRUFURURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlOiBgKGVyciwgcmVzcG9uc2UpYC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0gcmVzcG9uc2UuZGF0YS5lbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWxzLmlzQXJyYXkocHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IHByb3BzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhhdC5pbnN0YW50aWF0ZUVudGl0eShwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eS5fbG9hZChwcm9wcyk7IFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuZmV0Y2hPbkVudGl0eUNyZWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBlbnRpdGllcyBpbiB0aGUgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgYXBwcyA9IHNlcnZpY2UuYXBwcygpO1xuICAgICAgICAgKiAgICAgIGFwcHMuZmV0Y2goZnVuY3Rpb24oZXJyLCBhcHBzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBhcHBMaXN0ID0gYXBwcy5saXN0KCk7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKGFwcExpc3QubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGxpc3Qgb2YgZW50aXRpZXM6IGAoZXJyLCBsaXN0KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBsaXN0OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdXRpbHMuY2xvbmUodGhpcy5fZW50aXRpZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIHNhdmVkIHNlYXJjaCwgd2hpY2ggeW91IGNhbiB0aGVuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LlNhdmVkU2VhcmNoID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuc2F2ZWRTZWFyY2hlcyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgc2F2ZWQgc2VhcmNoLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuYWNrbm93bGVkZ2UgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmFja25vd2xlZGdlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2ggICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeSAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgICAgICAgdGhpcy5zdXBwcmVzc0luZm8gPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3VwcHJlc3NJbmZvKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0cyBmb3IgdGhpcyBzYXZlZFNlYXJjaCxcbiAgICAgICAgICogZGVmYXVsdGluZyB0byAwIHdoZW4gdW5kZWZpbmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaCA9IHNlcnZpY2Uuc2F2ZWRTZWFyY2hlcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgIHZhciBhbGVydENvdW50ID0gc2F2ZWRTZWFyY2guYWxlcnRDb3VudCgpO1xuICAgICAgICAgKiBcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBhbGVydENvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyZWRfYWxlcnRfY291bnQsIDEwKSB8fCAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBY2tub3dsZWRnZXMgdGhlIHN1cHByZXNzaW9uIG9mIHRoZSBhbGVydHMgZnJvbSBhIHNhdmVkIHNlYXJjaCBhbmRcbiAgICAgICAgICogcmVzdW1lcyBhbGVydGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaC5hY2tub3dsZWRnZShmdW5jdGlvbihlcnIsIHNlYXJjaCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFDS05PV0xFREdFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNhdmVkIHNlYXJjaCBpcyBhY2tub3dsZWRnZWQ6IGAoZXJyLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L2Fja25vd2xlZGdlXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgYWNrbm93bGVkZ2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJhY2tub3dsZWRnZVwiLCB7fSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc3BhdGNoZXMgYSBzYXZlZCBzZWFyY2gsIHdoaWNoIGNyZWF0ZXMgYSBzZWFyY2ggam9iIGFuZCByZXR1cm5zIGEgXG4gICAgICAgICAqIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2UgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaCA9IHNlcnZpY2Uuc2F2ZWRTZWFyY2hlcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgIHNhdmVkU2VhcmNoLmRpc3BhdGNoKHtmb3JjZV9kaXNwYXRjaDogZmFsc2V9LCBmdW5jdGlvbihlcnIsIGpvYiwgc2F2ZWRTZWFyY2gpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKb2IgU0lEOiBcIiwgam9iLnNpZCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciBkaXNwYXRjaGluZyB0aGlzIHNhdmVkIHNlYXJjaDpcbiAgICAgICAgICogICAgLSBgZGlzcGF0Y2gubm93YCAoX3N0cmluZ18pOiBUaGUgdGltZSB0aGF0IGlzIHVzZWQgdG8gZGlzcGF0Y2ggdGhlIHNlYXJjaCBhcyB0aG91Z2ggdGhlIHNwZWNpZmllZCB0aW1lIHdlcmUgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgICAgICogICAgLSBgZGlzcGF0Y2guKmAgKF9zdHJpbmdfKTogT3ZlcndyaXRlcyB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBmaWVsZCBzcGVjaWZpZWQgaW4gKi5cbiAgICAgICAgICogICAgLSBgdHJpZ2dlcl9hY3Rpb25zYCAoX2Jvb2xlYW5fKTogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdHJpZ2dlciBhbGVydCBhY3Rpb25zLlxuICAgICAgICAgKiAgICAtIGBmb3JjZV9kaXNwYXRjaGAgKF9ib29sZWFuXyk6IEluZGljYXRlcyB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlYXJjaCBpZiBhbm90aGVyIGluc3RhbmNlIG9mIHRoaXMgc2VhcmNoIGlzIGFscmVhZHkgcnVubmluZy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNhdmVkIHNlYXJjaCBpcyBkaXNwYXRjaGVkOiBgKGVyciwgam9iLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L2Rpc3BhdGNoXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImRpc3BhdGNoXCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIHNpZCA9IHJlc3BvbnNlLmRhdGEuc2lkO1xuICAgICAgICAgICAgICAgIHZhciBqb2IgPSBuZXcgcm9vdC5Kb2IodGhhdC5zZXJ2aWNlLCBzaWQsIHRoYXQubmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBqb2IsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIFxuICAgICAgICAgKiBHZXRzIHRoZSBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBgIGZvciBmaXJlZEFsZXJ0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzYXZlZCBzZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFsZXJ0cyA9IHNlcnZpY2UuZmlyZWRBbGVydEdyb3VwcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cH0gQW4gQWxlcnRHcm91cCBvYmplY3Qgd2l0aCB0aGVcbiAgICAgICAgICogc2FtZSBuYW1lIGFzIHRoaXMgU2F2ZWRTZWFyY2ggb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIGZpcmVkQWxlcnRHcm91cDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRmlyZWRBbGVydEdyb3VwKHRoaXMuc2VydmljZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBqb2IgaGlzdG9yeSBmb3IgYSBzYXZlZCBzZWFyY2gsIHdoaWNoIGlzIGEgbGlzdCBvZiBcbiAgICAgICAgICogYHNwbHVua2pzLlNlcnZpY2UuSm9iYCBpbnN0YW5jZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIHNhdmVkU2VhcmNoID0gc2VydmljZS5zYXZlZFNlYXJjaGVzKCkuaXRlbShcIk15U2F2ZWRTZWFyY2hcIik7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2guaGlzdG9yeSh7Y291bnQ6IDEwfSwgZnVuY3Rpb24oZXJyLCBqb2JzLCBzZWFyY2gpIHtcbiAgICAgICAgICogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSm9iXCIsIGksIFwiOlwiLCBqb2JzW2ldLnNpZCk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBmb3IgcmV0cmlldmluZyBoaXN0b3J5LiBGb3IgYSBmdWxsIGxpc3QsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rLzguMC4yL1JFU1RSRUYvUkVTVHByb2xvZyNQYWdpbmF0aW9uX2FuZF9maWx0ZXJpbmdfcGFyYW1ldGVyc1wiIHRhcmdldD1cIl9ibGFua1wiPlBhZ2luYXRpb24gYW5kIEZpbHRlcmluZyBvcHRpb25zPC9hPiBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGhpc3RvcnkgaXMgcmV0cmlldmVkOiBgKGVyciwgam9iLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L2hpc3RvcnlcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBoaXN0b3J5OiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcImhpc3RvcnlcIiwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgam9icyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YS5lbnRyeSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgam9iRGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnlbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhqb2JEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpvYiA9IG5ldyByb290LkpvYih0aGF0LnNlcnZpY2UsIGpvYkRhdGEubmFtZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGpvYi5fbG9hZChqb2JEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgam9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGpvYnMsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiBhIHNhdmVkIHNlYXJjaC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaC5oaXN0b3J5KGZ1bmN0aW9uKGVyciwgc3VwcHJlc3Npb25TdGF0ZSwgc2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU1RBVEU6IFwiLCBzdXBwcmVzc2lvblN0YXRlKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHN1cHByZXNzaW9uIHN0YXRlIGlzIHJldHJpZXZlZDogYChlcnIsIHN1cHByZXNzaW9uU3RhdGUsIHNhdmVkU2VhcmNoKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlcy97bmFtZX0vc3VwcHJlc3NcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBzdXBwcmVzc0luZm86IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInN1cHByZXNzXCIsIHt9LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZS5kYXRhLmVudHJ5LmNvbnRlbnQsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgc2F2ZWQgc2VhcmNoIG9uIHRoZSBzZXJ2ZXIuIFxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhlIHNlYXJjaCBxdWVyeSBpcyByZXF1aXJlZCwgZXZlbiB3aGVuIGl0IGlzbid0IGJlaW5nIG1vZGlmaWVkLlxuICAgICAgICAgKiBJZiB5b3UgZG9uJ3QgcHJvdmlkZSBpdCwgdGhpcyBtZXRob2Qgd2lsbCBmZXRjaCB0aGUgc2VhcmNoIHN0cmluZyBmcm9tXG4gICAgICAgICAqIHRoZSBzZXJ2ZXIgb3IgZnJvbSB0aGUgbG9jYWwgY2FjaGUuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgdG8gdXBkYXRlIHRoZSBzYXZlZCBzZWFyY2ggd2l0aC4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NhdmVkc2VhcmNocGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2F2ZWQgc2VhcmNoIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQ6IGAoZXJyLCBlbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IHRoaXMuX3N1cGVyO1xuICAgICAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLmZldGNoKGZ1bmN0aW9uKGVyciwgc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gc2VhcmNoLnByb3BlcnRpZXMoKS5zZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUuY2FsbChzZWFyY2gsIHBhcmFtcywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHNhdmVkIHNlYXJjaGVzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBzYXZlZCBcbiAgICAgKiBzZWFyY2hlcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBzYXZlZCBzZWFyY2guXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICByb290LlNhdmVkU2VhcmNoZXMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5zYXZlZFNlYXJjaGVzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhIHNhdmVkIHNlYXJjaC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHNhdmVkIHNlYXJjaC4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NhdmVkc2VhcmNocGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2F2ZWQgc2VhcmNoIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNofSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuU2F2ZWRTZWFyY2godGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzYC4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi8gICAgIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgc3RvcmFnZSBwYXNzd29yZCwgd2hpY2ggeW91IGNhbiB0aGVuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHN0b3JhZ2UvcGFzc3dvcmRzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5TdG9yYWdlUGFzc3dvcmQgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnN0b3JhZ2VQYXNzd29yZHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgc3RvcmFnZSBwYXNzd29yZC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbiAoc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHN0b3JhZ2UgcGFzc3dvcmRzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBzdG9yYWdlIFxuICAgICAqIHBhc3N3b3JkcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBzdG9yYWdlIHBhc3N3b3JkLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHN0b3JhZ2UvcGFzc3dvcmRzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqL1xuICAgIHJvb3QuU3RvcmFnZVBhc3N3b3JkcyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIGVudGl0eSBoYXMgYmVlbiBjcmVhdGVkLiBCeSBcbiAgICAgICAgICogZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgZmV0Y2hlZCBiZWNhdXNlIHRoZSBlbmRwb2ludCByZXR1cm5zXG4gICAgICAgICAqIChlY2hvZXMpIHRoZSBuZXcgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuc3RvcmFnZVBhc3N3b3JkcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSBzdG9yYWdlIHBhc3N3b3JkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBuZXcgc3RvcmFnZSBwYXNzd29yZC4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycyxcbiAgICAgICAgICogc2VlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RhY2Nlc3MjUE9TVF9zdG9yYWdlLjJGcGFzc3dvcmRzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAqIFBPU1Qgc3RvcmFnZS9wYXNzd29yZHM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNofSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlN0b3JhZ2VQYXNzd29yZCh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNgLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRzXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBmaXJlZCBhbGVydC4gXG4gICAgICogWW91IGNhbiByZXRyaWV2ZSBzZXZlcmFsIG9mIHRoZSBmaXJlZCBhbGVydCdzIHByb3BlcnRpZXMgYnlcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBuYW1lLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFsZXJ0cy9maXJlZF9hbGVydHMve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5GaXJlZEFsZXJ0ID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5maXJlZEFsZXJ0cyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIGFjdGlvbnMgKHN1Y2ggYXMgbm90aWZ5aW5nIGJ5IGVtYWlsLCBydW5uaW5nIGEgXG4gICAgICAgICAqIHNjcmlwdCwgYWRkaW5nIHRvIFJTUywgdHJhY2tpbmcgaW4gQWxlcnQgTWFuYWdlciwgYW5kIGVuYWJsaW5nIFxuICAgICAgICAgKiBzdW1tYXJ5IGluZGV4aW5nKS4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBvZiBhY3Rpb25zLCBhbiBlbXB0eSB7QXJyYXl9IGlmIG5vIGFjdGlvbnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIGFjdGlvbnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLmFjdGlvbnMgfHwgW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIHR5cGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGFsZXJ0J3MgdHlwZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIGFsZXJ0VHlwZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuYWxlcnRfdHlwZSB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVzdWx0IGlzIGEgc2V0IG9mIGV2ZW50cyAoZGlnZXN0KSBvciBhIHNpbmdsZVxuICAgICAgICAgKiBldmVudCAocGVyIHJlc3VsdCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBTcGx1bmsgNC4zIGFuZCBsYXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIGEgZGlnZXN0LCBmYWxzZSBpZiBwZXIgcmVzdWx0XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBpc0RpZ2VzdE1vZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gQ29udmVydCB0aGlzIHByb3BlcnR5IHRvIGEgQm9vbGVhblxuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5wcm9wZXJ0aWVzKCkuZGlnZXN0X21vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHJlbmRlcmVkIGV4cGlyYXRpb24gdGltZSBmb3IgdGhpcyBhbGVydC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGluIFNwbHVuayA0LjMgYW5kIGxhdGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBleHBpcmF0aW9uVGltZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuZXhwaXJhdGlvbl90aW1lX3JlbmRlcmVkIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHNhdmVkIHNlYXJjaCBmb3IgdGhpcyBhbGVydC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc2F2ZWQgc2VhcmNoIG5hbWUsIG9yIHtudWxsfSBpZiBub3QgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgc2F2ZWRTZWFyY2hOYW1lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS5zYXZlZHNlYXJjaF9uYW1lIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIHNldmVyaXR5IG9uIGEgc2NhbGUgb2YgMSB0byAxMCwgd2l0aCAxIGJlaW5nIHRoZVxuICAgICAgICAgKiBoaWdoZXN0IHNldmVyaXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoaXMgYWxlcnQncyBzZXZlcml0eSwgLTEgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgc2V2ZXJpdHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMucHJvcGVydGllcygpLnNldmVyaXR5LCAxMCkgfHwgLTE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhpcyBhbGVydCdzIHNlYXJjaCBJRCAoU0lEKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGlzIGFsZXJ0J3MgU0lELCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHNpZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuc2lkIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHRpbWUgdGhpcyBhbGVydCB3YXMgdHJpZ2dlcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoaXMgYWxlcnQncyB0cmlnZ2VyIHRpbWUsIG9yIHtudWxsfSBpZiBub3QgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgdHJpZ2dlclRpbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLnRyaWdnZXJfdGltZSB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyByZW5kZXJlZCB0cmlnZ2VyIHRpbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBTcGx1bmsgNC4zIGFuZCBsYXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGlzIGFsZXJ0J3MgcmVuZGVyZWQgdHJpZ2dlciB0aW1lLCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHRyaWdnZXJUaW1lUmVuZGVyZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLnRyaWdnZXJfdGltZV9yZW5kZXJlZCB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiB0cmlnZ2VyZWQgYWxlcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gU3BsdW5rIDQuMyBhbmQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge051bWJlcn0gVGhlIG51bWJlciBvZiB0cmlnZ2VyZWQgYWxlcnRzLCBvciAtMSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgdHJpZ2dlcmVkQWxlcnRDb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5wcm9wZXJ0aWVzKCkudHJpZ2dlcmVkX2FsZXJ0cywgMTApIHx8IC0xO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IGFsZXJ0IGdyb3VwLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIGFsZXJ0IGdyb3VwLCB3aGljaCB5b3UgY2FuIHRoZW4gdmlldyBhbmRcbiAgICAgKiByZW1vdmUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgYWxlcnRzL2ZpcmVkX2FsZXJ0cy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuRmlyZWRBbGVydEdyb3VwID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmZpcmVkQWxlcnRzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgYHRyaWdnZXJlZF9hbGVydF9jb3VudGAgcHJvcGVydHksIHRoZSBjb3VudFxuICAgICAgICAgKiBvZiB0cmlnZ2VyZWQgYWxlcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjb3VudCBvZiB0cmlnZ2VyZWQgYWxlcnRzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgICAgICovXG4gICAgICAgIGNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyZWRfYWxlcnRfY291bnQsIDEwKSB8fCAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGZpcmVkIGluc3RhbmNlcyBvZiB0aGlzIGFsZXJ0LCB3aGljaCBpc1xuICAgICAgICAgKiBhIGxpc3Qgb2YgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydGAgaW5zdGFuY2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhbGVydEdyb3VwID0gc2VydmljZS5maXJlZEFsZXJ0R3JvdXBzKCkuaXRlbShcIk15QWxlcnRcIik7XG4gICAgICAgICAqICAgICAgYWxlcnRHcm91cC5saXN0KGZ1bmN0aW9uKGVyciwgZmlyZWRBbGVydHMsIGFsZXJ0KSB7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmaXJlZEFsZXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaXJlZCBhbGVydFwiLCBpLCBcIjpcIiwgZmlyZWRBbGVydHNbaV0uc2lkKTtcbiAgICAgICAgICogICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZmlyZWQgYWxlcnRzIGFyZSByZXRyaWV2ZWQ6IGAoZXJyLCBmaXJlZEFsZXJ0cywgYWxlcnRHcm91cClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICAgICAqL1xuICAgICAgICBsaXN0OiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcIlwiLCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBmaXJlZEFsZXJ0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YS5lbnRyeSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpcmVkQWxlcnREYXRhID0gcmVzcG9uc2UuZGF0YS5lbnRyeVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKGZpcmVkQWxlcnREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpcmVkQWxlcnQgPSBuZXcgcm9vdC5GaXJlZEFsZXJ0KHRoYXQuc2VydmljZSwgZmlyZWRBbGVydERhdGEubmFtZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyZWRBbGVydC5fbG9hZChmaXJlZEFsZXJ0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGZpcmVkQWxlcnRzLnB1c2goZmlyZWRBbGVydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpcmVkQWxlcnRzLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgYWxlcnQgZ3JvdXAuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdCA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5saXN0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZmlyZWQgYWxlcnRzIGZvciBhIHNhdmVkIHNlYXJjaC4gWW91IGNhblxuICAgICAqIGNyZWF0ZSBhbmQgbGlzdCBzYXZlZCBzZWFyY2hlcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvclxuICAgICAqIGdldCBhIHNwZWNpZmljIGFsZXJ0IGdyb3VwLiBcbiAgICAgKlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFsZXJ0cy9maXJlZF9hbGVydHNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovXG4gICAgcm9vdC5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuZmlyZWRBbGVydHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGFsZXJ0IGdyb3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBhbGVydCBncm91cC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXB9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRmlyZWRBbGVydEdyb3VwKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3VwcHJlc3MgcmVtb3ZpbmcgYWxlcnRzIHZpYSB0aGUgZmlyZWQgYWxlcnRzIGVuZHBvaW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRvIHJlbW92ZSBhbiBhbGVydCwgcmVtb3ZlIHRoZSBzYXZlZCBzZWFyY2ggd2l0aCB0aGUgc2FtZSBuYW1lLlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbmAuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9ufSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZW1vdmUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIFNwbHVuayBhcHAgdGhhdCB5b3UgY2FuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWwve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuQXBwbGljYXRpb24gPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIHVwZGF0ZSB0byBnZXQgdGhlIHVwZGF0ZWQgXG4gICAgICAgICAqIGl0ZW0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPblVwZGF0ZTogdHJ1ZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmFwcHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBTcGx1bmsgYXBwLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9ufSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvblxuICAgICAgICAgKi8gXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNldHVwSW5mbyAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2V0dXBJbmZvKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5mbyA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGVJbmZvKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHNldHVwIGluZm9ybWF0aW9uIGZvciBhIFNwbHVuayBhcHAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcCA9IHNlcnZpY2UuYXBwcygpLml0ZW0oXCJhcHBcIik7XG4gICAgICAgICAqICAgICAgYXBwLnNldHVwKGZ1bmN0aW9uKGVyciwgaW5mbywgc2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU0VUVVAgSU5GTzogXCIsIGluZm8pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzZXR1cCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQ6IGAoZXJyLCBpbmZvLCBhcHApYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWwve25hbWV9L3NldHVwXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgc2V0dXBJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJzZXR1cFwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLmVudHJ5LmNvbnRlbnQsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyBhbnkgaW5mb3JtYXRpb24gZm9yIGFuIHVwZGF0ZSB0byBhIGxvY2FsbHktaW5zdGFsbGVkIFNwbHVuayBhcHAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcCA9IHNlcnZpY2UuYXBwcygpLml0ZW0oXCJNeUFwcFwiKTtcbiAgICAgICAgICogICAgICBhcHAudXBkYXRlSW5mbyhmdW5jdGlvbihlcnIsIGluZm8sIGFwcCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlVQREFURSBJTkZPOiBcIiwgaW5mbyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHVwZGF0ZSBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQ6IGAoZXJyLCBpbmZvLCBhcHApYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWwve25hbWV9L3VwZGF0ZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZUluZm86IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInVwZGF0ZVwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLmVudHJ5LmNvbnRlbnQsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgU3BsdW5rIGFwcHMuIFlvdSBjYW4gY3JlYXRlIGFuZCBsaXN0IGFwcGxpY2F0aW9ucyBcbiAgICAgKiB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBhcHAuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgYXBwcy9sb2NhbFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5BcHBsaWNhdGlvbnMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgXG4gICAgICAgICAqIGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJuc1xuICAgICAgICAgKiAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmFwcHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGFwcC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IGFwcC4gRm9yIGRldGFpbHMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVGFwcHMjUE9TVF9hcHBzLjJGbG9jYWxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5QT1NUIGFwcHMvbG9jYWw8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9ufSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkFwcGxpY2F0aW9uKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwge30pO1xuICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCB7fSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHNlcnZlci9pbmZvXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5TZXJ2ZXJJbmZvID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5pbmZvO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNlcnZlckluZm9cbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBcInNlcnZlci1pbmZvXCI7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIFNwbHVuayB1c2VyLCB3aGljaCB5b3UgY2FuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGF1dGhlbnRpY2F0aW9uL3VzZXJzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuVXNlciA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuVXNlclxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMudXNlcnMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Vc2VyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIFNwbHVuayB1c2VybmFtZS5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Vc2VyfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Vc2VyYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIHt9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHVzZXJzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCB1c2VycyB1c2luZyBcbiAgICAgKiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyB1c2VyLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGF1dGhlbnRpY2F0aW9uL3VzZXJzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuVXNlcnNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuVXNlcnMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgXG4gICAgICAgICAqIGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJuc1xuICAgICAgICAgKiAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaE9uRW50aXR5Q3JlYXRpb246IHRydWUsXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy51c2VycztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSB1c2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgbmV3IHVzZXIuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVKOCN1c2VyYXV0aHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlVzZXIgYXV0aGVudGljYXRpb24gcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVXNlcmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuVXNlcih0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuVXNlcnNgLiBcbiAgICAgICAgICogXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcnN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCB7fSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyB1c2VyLiBcbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgZW5kcG9pbnQgcmVxdWlyZXMgYSBzcGVjaWFsIGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjgjdXNlcmF1dGhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Vc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgbmV3IGVudGl0eTogYChlcnIsIGNyZWF0ZWRFbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcIlwiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIHVzIHRvIHVzZSB0aGUgcGFzc2VkLWluIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0ge25hbWU6IHBhcmFtcy5uYW1lfTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHkgPSB0aGF0Lmluc3RhbnRpYXRlRW50aXR5KHByb3BzKTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHkuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxLndhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgU3BsdW5rIHZpZXcsIHdoaWNoIHlvdSBjYW4gdmlldywgbW9kaWZ5LCBhbmRcbiAgICAgKiByZW1vdmUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgZGF0YS91aS92aWV3cy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5WaWV3XG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LlZpZXcgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnZpZXdzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuVmlld2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2aWV3LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5WaWV3fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5WaWV3YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHZpZXdzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCB2aWV3cyB1c2luZyBcbiAgICAgKiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyB2aWV3LlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGEvdWkvdmlld3NcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5WaWV3cyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy52aWV3cztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSB2aWV3LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBuZXcgdmlldy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI1BPU1Rfc2NoZWR1bGVkLjJGdmlld3MuMkYuN0JuYW1lLjdEXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UE9TVCBzY2hlZHVsZWQvdmlld3Mve25hbWV9PC9hPiBlbmRwb2ludCBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5WaWV3fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5WaWV3YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuVmlldyh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld3N9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGluZGV4LCB3aGljaCB5b3UgY2FuIHVwZGF0ZSBhbmQgc3VibWl0IGV2ZW50cyB0by5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXMvbmFtZVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4XG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkluZGV4ID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuaW5kZXhlcyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluZGV4LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5JbmRleH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zdWJtaXRFdmVudCA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zdWJtaXRFdmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogU3VibWl0cyBhbiBldmVudCB0byB0aGlzIGluZGV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBpbmRleCA9IHNlcnZpY2UuaW5kZXhlcygpLml0ZW0oXCJfaW50ZXJuYWxcIik7XG4gICAgICAgICAqICAgICAgaW5kZXguc3VibWl0RXZlbnQoXCJBIG5ldyBldmVudFwiLCB7c291cmNldHlwZTogXCJteXNvdXJjZXR5cGVcIn0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0LCBpbmRleCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlN1Ym1pdHRlZCBldmVudDogXCIsIHJlc3VsdCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBUaGUgdGV4dCBmb3IgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcGFyYW1ldGVycyBmb3IgaW5kZXhpbmc6IFxuICAgICAgICAgKiAgICAtIGBob3N0YCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIGhvc3QgZmllbGQgZm9yIGV2ZW50cyBmcm9tIHRoaXMgZGF0YSBpbnB1dC4gXG4gICAgICAgICAqICAgIC0gYGhvc3RfcmVnZXhgIChfc3RyaW5nXyk6IEEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZXh0cmFjdCB0aGUgaG9zdCB2YWx1ZSBmcm9tIGVhY2ggZXZlbnQuIFxuICAgICAgICAgKiAgICAtIGBzb3VyY2VgIChfc3RyaW5nXyk6IFRoZSBzb3VyY2UgdmFsdWUgdG8gZmlsbCBpbiB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgaW5wdXQncyBldmVudHMuXG4gICAgICAgICAqICAgIC0gYHNvdXJjZXR5cGVgIChfc3RyaW5nXyk6IFRoZSBzb3VyY2V0eXBlIHRvIGFwcGx5IHRvIGV2ZW50cyBmcm9tIHRoaXMgaW5wdXQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyBzdWJtaXR0ZWQ6IGAoZXJyLCByZXN1bHQsIGluZGV4KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCByZWNlaXZlcnMvc2ltcGxlP2luZGV4PXtuYW1lfVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhcbiAgICAgICAgICovXG4gICAgICAgIHN1Ym1pdEV2ZW50OiBmdW5jdGlvbihldmVudCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGluZGV4IG5hbWVcbiAgICAgICAgICAgIHBhcmFtc1tcImluZGV4XCJdID0gdGhpcy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmxvZyhldmVudCwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0LCB0aGF0KTsgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UudmVyc2lvbkNvbXBhcmUoXCI1LjBcIikgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5kZXhlcyBjYW5ub3QgYmUgcmVtb3ZlZCBpbiBTcGx1bmsgNC54XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgICAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBpbmRleGVzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBpbmRleGVzIHVzaW5nIFxuICAgICAqIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIGluZGV4LlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGEvaW5kZXhlc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuSW5kZXhlcyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmluZGV4ZXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGFuIGluZGV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBuZXcgaW5kZXguIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVKMyNpbmRleHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPkluZGV4IHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkluZGV4fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5JbmRleGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuSW5kZXgodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5JbmRleGVzYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSW5kZXhlc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBpbmRleCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBpbmRleGVzID0gc2VydmljZS5pbmRleGVzKCk7XG4gICAgICAgICAqICAgICAgaW5kZXhlcy5jcmVhdGUoXCJOZXdJbmRleFwiLCB7YXNzdXJlVVRGODogdHJ1ZX0sIGZ1bmN0aW9uKGVyciwgbmV3SW5kZXgpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBBIG5hbWUgZm9yIHRoaXMgaW5kZXguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVKMyNpbmRleHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPkluZGV4IHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgbmV3IGluZGV4OiBgKGVyciwgY3JlYXRlZEluZGV4KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24obmFtZSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsZWQgdXMgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZSBvZiAocGFyYW1zLCBjYWxsYmFjayksXG4gICAgICAgICAgICAvLyBsZXRzIG1ha2UgaXQgd29ya1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KG5hbWUpICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBuYW1lO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJhbXMubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zW1wibmFtZVwiXSA9IG5hbWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBzdGFuemEsIHdoaWNoIHlvdSBjYW4gdXBkYXRlIGFuZCByZW1vdmUsIGZyb20gYSBcbiAgICAgKiBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgY29uZmlncy9jb25mLXtmaWxlfS97bmFtZX1gXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5Db25maWd1cmF0aW9uU3RhbnphID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uU3RhbnphXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lID09PSBcImRlZmF1bHRcIiA/IFwiX25ld1wiIDogdGhpcy5uYW1lO1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmNvbmZpZ3VyYXRpb25zICsgXCIvY29uZi1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmZpbGUpICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZSBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbmV3IHN0YW56YS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uU3RhbnphXG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgZmlsZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2Ygc3RhbnphcyBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eSBmaWxlLiBZb3UgY2FuXG4gICAgICogY3JlYXRlIGFuZCBsaXN0IHN0YW56YXMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgXG4gICAgICogc3RhbnphLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGNvbmZpZ3MvY29uZi17ZmlsZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5Db25maWd1cmF0aW9uRmlsZSA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoeyBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuY29uZmlndXJhdGlvbnMgKyBcIi9jb25mLVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBzdGFuemEgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIFlvdSBjYW5ub3QgZGlyZWN0bHkgdXBkYXRlIHRoZSBgQ29uZmlndXJhdGlvblN0YW56YWAgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHZpZXdpbmcgYGNvbmZpZ3MvY29uZi17ZmlsZX0vX25ld2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0RGVmYXVsdFN0YW56YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuQ29uZmlndXJhdGlvblN0YW56YSh0aGlzLnNlcnZpY2UsIHRoaXMubmFtZSwgXCJkZWZhdWx0XCIsIHRoaXMubmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgc3RhbnphIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIGtleS12YWx1ZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHN0YW56YS4gXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkNvbmZpZ3VyYXRpb25TdGFuemEodGhpcy5zZXJ2aWNlLCB0aGlzLm5hbWUsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGV9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc3RhbnphIGluIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBmaWxlID0gc2VydmljZS5jb25maWd1cmF0aW9ucygpLml0ZW0oXCJwcm9wc1wiKTtcbiAgICAgICAgICogICAgICBmaWxlLmNyZWF0ZShcIm15X3N0YW56YVwiLCBmdW5jdGlvbihlcnIsIG5ld1N0YW56YSkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNSRUFURURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGFuemFOYW1lIEEgbmFtZSBmb3IgdGhpcyBzdGFuemEuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgQSBkaWN0aW9uYXJ5IG9mIGtleS12YWx1ZSBwYWlycyB0byBwdXQgaW4gdGhpcyBzdGFuemEuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIHN0YW56YTogYChlcnIsIGNyZWF0ZWRTdGFuemEpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGNvbmZpZ3MvY29uZi17ZmlsZX1cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHN0YW56YU5hbWUsIHZhbHVlcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbGVkIHVzIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUgb2YgKHBhcmFtcywgY2FsbGJhY2spLFxuICAgICAgICAgICAgLy8gbGV0cyBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChzdGFuemFOYW1lKSAmJiB1dGlscy5pc0Z1bmN0aW9uKHZhbHVlcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gc3RhbnphTmFtZTtcbiAgICAgICAgICAgICAgICBzdGFuemFOYW1lID0gdmFsdWVzLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHZhbHVlcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcyB8fCB7fTtcbiAgICAgICAgICAgIHZhbHVlc1tcIm5hbWVcIl0gPSBzdGFuemFOYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIodmFsdWVzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBjb25maWd1cmF0aW9uIGZpbGVzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBcbiAgICAgKiBjb25maWd1cmF0aW9uIGZpbGVzIHVzaW5nIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIGZpbGUuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgcHJvcGVydGllc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LkNvbmZpZ3VyYXRpb25zID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gZW50aXR5IGhhcyBiZWVuIGNyZWF0ZWQuIEJ5IFxuICAgICAgICAgKiBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnNcbiAgICAgICAgICogKGVjaG9lcykgdGhlIG5ldyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMucHJvcGVydGllcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGV9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIHRoaXMubmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2Uub3duZXIgPT09IFwiLVwiIHx8IG5hbWVzcGFjZS5hcHAgPT09IFwiLVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbnMgcmVxdWlyZXMgYSBub24td2lsZGNhcmQgb3duZXIvYXBwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgY29uZmlndXJhdGlvbnMgPSBzZXJ2aWNlLmNvbmZpZ3VyYXRpb25zKCk7XG4gICAgICAgICAqICAgICAgY29uZmlndXJhdGlvbnMuY3JlYXRlKFwibXlwcm9wc1wiLCBmdW5jdGlvbihlcnIsIG5ld0ZpbGUpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgQSBuYW1lIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGU6IGAoZXJyLCBjcmVhdGVkRmlsZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgcHJvcGVydGllc1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24oZmlsZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVtcIl9fY29uZlwiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiXCIsIHtfX2NvbmY6IGZpbGVuYW1lfSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHkgPSBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSh0aGF0LnNlcnZpY2UsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5LmZldGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydGVkLCBzbyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgZG9lc0ZpbGVFeGlzdDogYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gMS4gRmV0Y2ggZmlsZXMgbGlzdFxuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0X3YyKFwiXCIsICB7X19jb25mOiBmaWxlbmFtZX0pO1xuXG4gICAgICAgICAgICAgICAgLy8gMi4gRmlsdGVyIHRoZSBmaWxlc1xuICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IHJlc3BvbnNlPy5ib2R5Py5lbnRyeT8uZmlsdGVyKGYgPT4gZi5uYW1lID09PSBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgY29kZTpcIkZJTEVfTk9UX0ZPVU5EXCIsIG1lc3NhZ2U6IGBGaWxlIHdpdGggdGhlIG5hbWUgJyR7ZmlsZW5hbWV9JyBkb2VzIG5vdCBleGlzdC5gfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAzLiBDcmVhdGUgYSBsb2NhbCBpbnN0YW5jZVxuICAgICAgICAgICAgICAgIHZhciBjb25maWd1cmF0aW9uRmlsZSA9IG5ldyByb290LkNvbmZpZ3VyYXRpb25GaWxlKHRoYXQuc2VydmljZSwgZmlsZW5hbWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gNC4gTG9hZCB0aGUgZmlsZSBjb250ZW50XG4gICAgICAgICAgICAgICAgdmFyIGZldGNoZWRGaWxlID0gYXdhaXQgY29uZmlndXJhdGlvbkZpbGUuZmV0Y2hfdjIoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7ZmlsZTogZmV0Y2hlZEZpbGV9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvckNvZGU6XCJTWVNURU1fRVJST1JcIiwgZXJyb3JNZXNzYWdlOiBlcnJvcn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZG9lc1N0YW56YUV4aXN0OiBhc3luYyBmdW5jdGlvbihmaWxlLCBzdGFuemEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMS4gY2hlY2sgaWYgdGhlIHN0YW56YSBleGlzdHNcbiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hlZFN0YW56YSA9IGZpbGUuaXRlbShzdGFuemEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmKCFmZXRjaGVkU3RhbnphKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNvZGU6XCJTVEFOWkFfTk9UX0ZPVU5EXCIsIG1lc3NhZ2U6IGBTdGFuemEgd2l0aCB0aGUgbmFtZSAnJHtzdGFuemF9JyBkb2VzIG5vdCBleGlzdC5gfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3RhbnphOiBmZXRjaGVkU3RhbnphfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yQ29kZTpcIlNZU1RFTV9FUlJPUlwiLCBlcnJvck1lc3NhZ2U6IGVycm9yfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVfdjI6IGFzeW5jIGZ1bmN0aW9uIChjb25maWdzLCBzdmMsIGZpbGVuYW1lLCBzdGFuemEsIGtleVZhbHVlTWFwLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyAxLiBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHNcbiAgICAgICAgICAgIHZhciBkb2VzRmlsZUV4aXN0UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRvZXNGaWxlRXhpc3QoZmlsZW5hbWUpO1xuICAgICAgICAgICAgdmFyIGNvbmZpZ0ZpbGUgPSBkb2VzRmlsZUV4aXN0UmVzcG9uc2UuZmlsZTtcblxuICAgICAgICAgICAgLy8gMi4gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgY3JlYXRlIGEgbmV3IGZpbGVcbiAgICAgICAgICAgIGlmKCFjb25maWdGaWxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZG9lc0ZpbGVFeGlzdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4uLlwiKTtcblxuICAgICAgICAgICAgICAgIHRoYXQuY3JlYXRlKCB7IF9fY29uZjogZmlsZW5hbWUgfSwgXG4gICAgICAgICAgICAgICAgICAgIChlcnIsIG5ld0ZpbGUpID0+IGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIEZpbGUgY3JlYXRlZDogJHtmaWxlbmFtZX1gKSApO1xuXG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZSA9IG5ldyByb290LkNvbmZpZ3VyYXRpb25GaWxlKCB0aGF0LnNlcnZpY2UsIGZpbGVuYW1lICk7XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZSA9IGF3YWl0IGNvbmZpZ0ZpbGUuZmV0Y2hfdjIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaWYgdGhlIHN0YW56YSBleGlzdHNcbiAgICAgICAgICAgIHZhciBkb2VzU3RhbnphRXhpc3RSZXNwb25zZSA9IGF3YWl0IHRoaXMuZG9lc1N0YW56YUV4aXN0KGNvbmZpZ0ZpbGUsIHN0YW56YSk7XG4gICAgICAgICAgICB2YXIgY29uZmlnU3RhbnphID0gZG9lc1N0YW56YUV4aXN0UmVzcG9uc2Uuc3RhbnphO1xuXG4gICAgICAgICAgICAvLyAzLiBJZiB0aGUgc3RhbnphIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBzdGFuemEgd2l0aCBnaXZlbiBrZXlWYWx1ZU1hcFxuICAgICAgICAgICAgaWYoIWNvbmZpZ1N0YW56YSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRvZXNTdGFuemFFeGlzdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gc3RhbnphLi4uXCIpO1xuXG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZS5jcmVhdGUoc3RhbnphLCBrZXlWYWx1ZU1hcCwgZnVuY3Rpb24gKGVyciwgbmV3U3RhbnphKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIFN0YW56YSBjcmVhdGVkOiAke3N0YW56YX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDQuIElmIHRoZSBzdGFuemEgZXhpc3RzLCB1cGRhdGUgaXQgd2l0aCB0aGUga2V5VmFsdWVNYXBcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1N0YW56YS51cGRhdGUoa2V5VmFsdWVNYXAsIChlcnIsIHVwZGF0ZWRTdGFuemEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZ3VyYXRpb24gU3RhbnphIHVwZGF0ZWQ6ICR7c3RhbnphfWApO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIHNlYXJjaCBqb2IuIFlvdSBjYW4gcGVyZm9ybSBkaWZmZXJlbnQgb3BlcmF0aW9uc1xuICAgICAqIG9uIHRoaXMgam9iLCBzdWNoIGFzIHJlYWRpbmcgaXRzIHN0YXR1cywgY2FuY2VsaW5nIGl0LCBhbmQgZ2V0dGluZyByZXN1bHRzLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkpvYiA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5qb2JzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuSm9iYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNpZCBUaGUgc2VhcmNoIElEIGZvciB0aGlzIHNlYXJjaCBqb2IuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSm9iYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi8gXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHNpZCwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBzaWQ7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuc2lkID0gc2lkO1xuXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuY2FuY2VsICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY2FuY2VsKTtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVByZXZpZXcgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGlzYWJsZVByZXZpZXcpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQcmV2aWV3ICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5lbmFibGVQcmV2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZXZlbnRzKTtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemUgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmluYWxpemUpO1xuICAgICAgICAgICAgdGhpcy5wYXVzZSAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wYXVzZSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnByZXZpZXcpO1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZXN1bHRzKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNobG9nICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2VhcmNobG9nKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJpb3JpdHkgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2V0UHJpb3JpdHkpO1xuICAgICAgICAgICAgdGhpcy5zZXRUVEwgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zZXRUVEwpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5ICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5zdW1tYXJ5KTtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudGltZWxpbmUpO1xuICAgICAgICAgICAgdGhpcy50b3VjaCAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy50b3VjaCk7XG4gICAgICAgICAgICB0aGlzLnVucGF1c2UgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVucGF1c2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW5jZWxzIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5jYW5jZWwoZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ0FOQ0VMTEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgc2VhcmNoIGlzIGRvbmU6IGAoZXJyKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiY2FuY2VsXCJ9LCBjYWxsYmFjayk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGVzIHByZXZpZXcgZ2VuZXJhdGlvbiBmb3IgYSBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLmRpc2FibGVQcmV2aWV3KGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiUFJFVklFVyBESVNBQkxFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhpcyBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGRpc2FibGVQcmV2aWV3OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImRpc2FibGVwcmV2aWV3XCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgcHJldmlldyBnZW5lcmF0aW9uIGZvciBhIHNlYXJjaCBqb2IuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLmRpc2FibGVQcmV2aWV3KGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiUFJFVklFVyBFTkFCTEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGlzIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlUHJldmlldzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJlbmFibGVwcmV2aWV3XCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGV2ZW50cyBvZiBhIHNlYXJjaCBqb2Igd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLmV2ZW50cyh7Y291bnQ6IDEwfSwgZnVuY3Rpb24oZXJyLCBldmVudHMsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkczogXCIsIGV2ZW50cy5maWVsZHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIGV2ZW50cy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI0dFVF9zZWFyY2guMkZqb2JzLjJGLjdCc2VhcmNoX2lkLjdELjJGZXZlbnRzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2V2ZW50czwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudHMgYXJlIHJldHJpZXZlZDogYChlcnIsIGV2ZW50cywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9ldmVudHNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgZXZlbnRzOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0X21vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcImV2ZW50c1wiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRmluYWxpemVzIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5maW5hbGl6ZShmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkpPQiBGSU5BTElaRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiZmluYWxpemVcIn0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBzZWFyY2ggam9iJ3MgZXZlbnRzIG9yIHJlc3VsdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIE9uZSBvZiB7XCJldmVudHNcIiwgXCJwcmV2aWV3XCIsIFwicmVzdWx0c1wifS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVyczpcbiAgICAgICAgICogICAgLSBgcGFnZXNpemVgIChfaW50ZWdlcl8pOiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybiBvbiBlYWNoIHJlcXVlc3QuIERlZmF1bHRzIHRvIGFzIG1hbnkgYXMgcG9zc2libGUuXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmF0b3Igb2JqZWN0IHdpdGggYSBgbmV4dChjYWxsYmFjaylgIG1ldGhvZCwgd2hlcmUgYGNhbGxiYWNrYCBpcyBvZiB0aGUgZm9ybSBgKGVyciwgcmVzdWx0cywgaGFzTW9yZVJlc3VsdHMpYC5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGl0ZXJhdG9yOiBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5QYWdpbmF0ZWRFbmRwb2ludEl0ZXJhdG9yKHRoaXNbdHlwZV0sIHBhcmFtcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhdXNlcyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IucGF1c2UoZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgUEFVU0VEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHBhdXNlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInBhdXNlXCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcbiAgICAgICAgICogR2V0cyB0aGUgcHJldmlldyByZXN1bHRzIGZvciBhIHNlYXJjaCBqb2Igd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnByZXZpZXcoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cywgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmllbGRzOiBcIiwgcmVzdWx0cy5maWVsZHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHByZXZpZXcgcmVzdWx0cy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI0dFVF9zZWFyY2guMkZqb2JzLjJGLjdCc2VhcmNoX2lkLjdELjJGcmVzdWx0c19wcmV2aWV3XCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3Jlc3VsdHNfcHJldmlldzwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBwcmV2aWV3IHJlc3VsdHMgYXJlIHJldHJpZXZlZCA6IGAoZXJyLCByZXN1bHRzLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3Jlc3VsdHNfcHJldmlld1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBwcmV2aWV3OiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0X21vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInJlc3VsdHNfcHJldmlld1wiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgcmVzdWx0cyBmb3IgYSBzZWFyY2ggam9iIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgICogXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayBjYW4gZ2V0IGB1bmRlZmluZWRgIGZvciBpdHMgYHJlc3VsdHNgIHBhcmFtZXRlciBpZiB0aGVcbiAgICAgICAgICogam9iIGlzIG5vdCB5ZXQgZG9uZS4gVG8gYXZvaWQgdGhpcywgdXNlIHRoZSBgSm9iLnRyYWNrKClgIG1ldGhvZCB0b1xuICAgICAgICAgKiB3YWl0IHVudGlsIHRoZSBqb2IgaXMgY29tcGxldGUgcHJpb3IgdG8gZmV0Y2hpbmcgdGhlIHJlc3VsdHMgd2l0aFxuICAgICAgICAgKiB0aGlzIG1ldGhvZC5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IucmVzdWx0cyh7Y291bnQ6IDEwfSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZHM6IFwiLCByZXN1bHRzLnJlc3VsdHMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHNlYXJjaCByZXN1bHRzLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RzZWFyY2gjR0VUX3NlYXJjaC4yRmpvYnMuMkYuN0JzZWFyY2hfaWQuN0QuMkZyZXN1bHRzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3Jlc3VsdHM8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVzdWx0cyBhcmUgcmV0cmlldmVkOiBgKGVyciwgcmVzdWx0cywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHJlc3VsdHM6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfbW9kZSA9IHBhcmFtcy5vdXRwdXRfbW9kZSB8fCBcImpzb25fcm93c1wiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJyZXN1bHRzXCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBzZWFyY2ggbG9nIGZvciB0aGlzIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2Iuc2VhcmNobG9nKGZ1bmN0aW9uKGVyciwgc2VhcmNobG9nLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coc2VhcmNobG9nKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBsb2cgYW5kIGpvYjogYChlcnIsIHNlYXJjaGxvZywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9zZWFyY2gubG9nXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHNlYXJjaGxvZzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwic2VhcmNoLmxvZ1wiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBwcmlvcml0eSBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnNldFByaW9yaXR5KDYsIGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFBSSU9SSVRZIFNFVFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIFRoZSBwcmlvcml0eSAoYW4gaW50ZWdlciBiZXR3ZWVuIDEtMTApLiBBIGhpZ2hlciB2YWx1ZSBtZWFucyBhIGhpZ2hlciBwcmlvcml0eS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0UHJpb3JpdHk6IGZ1bmN0aW9uKHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInNldHByaW9yaXR5XCIsIHByaW9yaXR5OiB2YWx1ZX0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgdGltZSB0byBsaXZlIChUVEwpIGZvciB0aGUgc2VhcmNoIGpvYiwgd2hpY2ggaXMgdGhlIHRpbWUgYmVmb3JlXG4gICAgICAgICAqIHRoZSBzZWFyY2ggam9iIGV4cGlyZXMgYWZ0ZXIgaXQgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpcyBzdGlsbCBhdmFpbGFibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2Iuc2V0VFRMKDEwMDAsIGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFRUTCBTRVRcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgdGltZSB0byBsaXZlLCBpbiBzZWNvbmRzLiBcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0VFRMOiBmdW5jdGlvbih2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJzZXR0dGxcIiwgdHRsOiB2YWx1ZX0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgc3VtbWFyeSBmb3IgdGhpcyBzZWFyY2ggam9iIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2Iuc3VtbWFyeSh7dG9wX2NvdW50OiA1fSwgZnVuY3Rpb24oZXJyLCBzdW1tYXJ5LCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTdW1tYXJ5OiBcIiwgc3VtbWFyeSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIHN1bW1hcnkuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRnN1bW1hcnlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5HRVQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vc3VtbWFyeTwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzdW1tYXJ5IGFuZCBzZWFyY2ggam9iOiBgKGVyciwgc3VtbWFyeSwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9zdW1tbWFyeVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBzdW1tYXJ5OiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInN1bW1hcnlcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHRpbWVsaW5lIGZvciB0aGlzIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IudGltZWxpbmUoe3RpbWVfZm9ybWF0OiBcIiVjXCJ9LCBmdW5jdGlvbihlcnIsIGpvYiwgdGltZWxpbmUpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJUaW1lbGluZTogXCIsIHRpbWVsaW5lKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyB0aGUgdGltZWxpbmUuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRnRpbWVsaW5lXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3RpbWVsaW5lIDwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSB0aW1lbGluZSBhbmQgc2VhcmNoIGpvYjogYChlcnIsIHRpbWVsaW5lLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3RpbWVsaW5lXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHRpbWVsaW5lOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInRpbWVsaW5lXCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUb3VjaGVzIGEgc2VhcmNoIGpvYiwgd2hpY2ggbWVhbnMgZXh0ZW5kaW5nIHRoZSBleHBpcmF0aW9uIHRpbWUgb2YgXG4gICAgICAgICAqIHRoZSBzZWFyY2ggdG8gbm93IHBsdXMgdGhlIHRpbWUgdG8gbGl2ZSAoVFRMKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi50b3VjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgVE9VQ0hFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L2NvbnRyb2xcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2g6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwidG91Y2hcIn0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydHMgcG9sbGluZyB0aGUgc3RhdHVzIG9mIHRoaXMgc2VhcmNoIGpvYiwgYW5kIGZpcmVzIGNhbGxiYWNrc1xuICAgICAgICAgKiB1cG9uIGVhY2ggc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEEgZGljdGlvbmFyeSBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzOlxuICAgICAgICAgKiAgICAtIGBwZXJpb2RgIChfaW50ZWdlcl8pOiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJldHdlZW4gZWFjaCBwb2xsLiBEZWZhdWx0cyB0byA1MDAuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjYWxsYmFja3MgQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbmFsIGNhbGxiYWNrczpcbiAgICAgICAgICogICAgLSBgcmVhZHlgOiBBIGZ1bmN0aW9uIGAoam9iKWAgaW52b2tlZCB3aGVuIHRoZSBqb2IncyBwcm9wZXJ0aWVzIGZpcnN0IGJlY29tZSBhdmFpbGFibGUuXG4gICAgICAgICAqICAgIC0gYHByb2dyZXNzYDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgd2hlbmV2ZXIgbmV3IGpvYiBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqICAgIC0gYGRvbmVgOiBBIGZ1bmN0aW9uIGAoam9iKWAgaW52b2tlZCBpZiB0aGUgam9iIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuIE5vIGZ1cnRoZXIgcG9sbGluZyBpcyBkb25lLlxuICAgICAgICAgKiAgICAtIGBmYWlsZWRgOiBBIGZ1bmN0aW9uIGAoam9iKWAgaW52b2tlZCBpZiB0aGUgam9iIGZhaWxzIGV4ZWN1dGluZyBvbiB0aGUgc2VydmVyLiBObyBmdXJ0aGVyIHBvbGxpbmcgaXMgZG9uZS5cbiAgICAgICAgICogICAgLSBgZXJyb3JgOiBBIGZ1bmN0aW9uIGAoZXJyKWAgaW52b2tlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcG9sbGluZy4gTm8gZnVydGhlciBwb2xsaW5nIGlzIGRvbmUuXG4gICAgICAgICAqIE9yLCBpZiBhIGZ1bmN0aW9uIGAoam9iKWAsIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBpdCBhcyBhIGBkb25lYCBjYWxsYmFjay5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgdHJhY2s6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgdmFyIHBlcmlvZCA9IG9wdGlvbnMucGVyaW9kIHx8IDUwMDsgLy8gbXNcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oY2FsbGJhY2tzKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG5vQ2FsbGJhY2tzQWZ0ZXJSZWFkeSA9IChcbiAgICAgICAgICAgICAgICAhY2FsbGJhY2tzLnByb2dyZXNzICYmXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5kb25lICYmXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5mYWlsZWQgJiZcbiAgICAgICAgICAgICAgICAhY2FsbGJhY2tzLmVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFja3MucmVhZHkgPSBjYWxsYmFja3MucmVhZHkgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wcm9ncmVzcyA9IGNhbGxiYWNrcy5wcm9ncmVzcyB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgY2FsbGJhY2tzLmRvbmUgPSBjYWxsYmFja3MuZG9uZSB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgY2FsbGJhY2tzLmZhaWxlZCA9IGNhbGxiYWNrcy5mYWlsZWQgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5lcnJvciA9IGNhbGxiYWNrcy5lcnJvciB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgdXNlIGJ5IHRlc3RzIG9ubHlcbiAgICAgICAgICAgIGNhbGxiYWNrcy5fcHJlcmVhZHkgPSBjYWxsYmFja3MuX3ByZXJlYWR5IHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBjYWxsYmFja3MuX3N0b3BwZWRBZnRlclJlYWR5ID0gY2FsbGJhY2tzLl9zdG9wcGVkQWZ0ZXJSZWFkeSB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgZW1pdHRlZFJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZG9uZUxvb3BpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIEFzeW5jLndoaWxzdChcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuICFkb25lTG9vcGluZzsgfSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbihuZXh0SXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZmV0Y2goZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlcmF0aW9uKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGF0Y2hTdGF0ZSA9IGpvYi5wcm9wZXJ0aWVzKCkuZGlzcGF0Y2hTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3RSZWFkeSA9IGRpc3BhdGNoU3RhdGUgPT09IFwiUVVFVUVEXCIgfHwgZGlzcGF0Y2hTdGF0ZSA9PT0gXCJQQVJTSU5HXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm90UmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuX3ByZXJlYWR5KGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtaXR0ZWRSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucmVhZHkoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlZFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogRG9uJ3Qga2VlcCBwb2xsaW5nIHRoZSBqb2IgaWYgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlciBvbmx5IGNhcmVzIGFib3V0IHRoZSBgcmVhZHlgIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9DYWxsYmFja3NBZnRlclJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuX3N0b3BwZWRBZnRlclJlYWR5KGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucHJvZ3Jlc3Moam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBqb2IucHJvcGVydGllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaFN0YXRlID09PSBcIkRPTkVcIiAmJiBwcm9wcy5pc0RvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmRvbmUoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZXJhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpc3BhdGNoU3RhdGUgPT09IFwiRkFJTEVEXCIgJiYgcHJvcHMuaXNGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZhaWxlZChqb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxvb3BpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jLnNsZWVwKHBlcmlvZCwgbmV4dEl0ZXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzdW1lcyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IudW5wYXVzZShmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgVU5QQVVTRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHVucGF1c2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwidW5wYXVzZVwifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBzZWFyY2ggam9icy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgc2VhcmNoIFxuICAgICAqIGpvYnMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgc2VhcmNoIGpvYi5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9ic1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuSm9icyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmpvYnM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgbmV3IGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSm9ifSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Kb2JgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9ic1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgc2lkID0gcHJvcHMuY29udGVudC5zaWQ7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkpvYih0aGlzLnNlcnZpY2UsIHNpZCwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuSm9ic2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYnN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9ic1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICAvLyBXZSBwZXJmb3JtIHRoZSBiaW5kaW5ncyBzbyB0aGF0IGV2ZXJ5IGZ1bmN0aW9uIHdvcmtzIFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgd2hlbiBpdCBpcyBwYXNzZWQgYXMgYSBjYWxsYmFjay5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5jcmVhdGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2VhcmNoIGpvYiB3aXRoIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYGV4ZWNfbW9kZWAgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBzZWFyY2g6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9bm9ybWFsYCB0byByZXR1cm4gYSBzZWFyY2ggam9iIElEIGltbWVkaWF0ZWx5IChkZWZhdWx0KS5cbiAgICAgICAgICogICAgICBQb2xsIGZvciBjb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4geW91IGNhbiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0cy4gXG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9YmxvY2tpbmdgIHRvIHJldHVybiB0aGUgc2VhcmNoIGpvYiBJRCB3aGVuIHRoZSBzZWFyY2ggaGFzIGZpbmlzaGVkLlxuICAgICAgICAgKiBcbiAgICAgICAgICogVG8gcnVuIGEgb25lc2hvdCBzZWFyY2gsIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBidXQgcmF0aGVyIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHRzLCB1c2UgYFNlcnZpY2UuSm9icy5vbmVzaG90U2VhcmNoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBzZWFyY2ggam9iLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGNyZWF0ZWQgam9iOiBgKGVyciwgY3JlYXRlZEpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24ocXVlcnksIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbGVkIHVzIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUgb2YgKHBhcmFtcywgY2FsbGJhY2spLFxuICAgICAgICAgICAgLy8gbGV0cyBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChxdWVyeSkgJiYgdXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHF1ZXJ5O1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcGFyYW1zLnNlYXJjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IHF1ZXJ5OyBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKChwYXJhbXMuZXhlY19tb2RlIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwib25lc2hvdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHVzZSBzcGx1bmtqcy5TZXJ2aWNlLkpvYnMub25lc2hvdFNlYXJjaCBmb3IgZXhlY19tb2RlPW9uZXNob3RcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKFwiTXVzdCBwcm92aWRlIGEgcXVlcnkgdG8gY3JlYXRlIGEgc2VhcmNoIGpvYlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdChcIlwiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgam9iID0gbmV3IHJvb3QuSm9iKHRoYXQuc2VydmljZSwgcmVzcG9uc2UuZGF0YS5zaWQsIHRoYXQubmFtZXNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgam9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzZWFyY2ggam9iIHdpdGggYSBnaXZlbiBzZWFyY2ggcXVlcnkgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBgZXhlY19tb2RlYCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHNlYXJjaDpcbiAgICAgICAgICpcbiAgICAgICAgICogICAgLSBVc2UgYGV4ZWNfbW9kZT1ub3JtYWxgIHRvIHJldHVybiBhIHNlYXJjaCBqb2IgSUQgaW1tZWRpYXRlbHkgKGRlZmF1bHQpLlxuICAgICAgICAgKiAgICAgIFBvbGwgZm9yIGNvbXBsZXRpb24gdG8gZmluZCBvdXQgd2hlbiB5b3UgY2FuIHJldHJpZXZlIHNlYXJjaCByZXN1bHRzLiBcbiAgICAgICAgICpcbiAgICAgICAgICogICAgLSBVc2UgYGV4ZWNfbW9kZT1ibG9ja2luZ2AgdG8gcmV0dXJuIHRoZSBzZWFyY2ggam9iIElEIHdoZW4gdGhlIHNlYXJjaCBoYXMgZmluaXNoZWQuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBUbyBydW4gYSBvbmVzaG90IHNlYXJjaCwgd2hpY2ggZG9lcyBub3QgY3JlYXRlIGEgam9iIGJ1dCByYXRoZXIgcmV0dXJucyB0aGUgc2VhcmNoIHJlc3VsdHMsIHVzZSBgU2VydmljZS5Kb2JzLm9uZXNob3RTZWFyY2hgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2JzID0gc2VydmljZS5qb2JzKCk7XG4gICAgICAgICAqICAgICAgam9icy5zZWFyY2goXCJzZWFyY2ggRVJST1JcIiwge2lkOiBcIm15am9iXzEyM1wifSwgZnVuY3Rpb24oZXJyLCBuZXdKb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCI6IG5ld0pvYi5zaWQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiAgICAgICAgKipOb3RlOioqIFRoaXMgbWV0aG9kIHRocm93cyBhbiBlcnJvciBpZiB0aGUgYGV4ZWNfbW9kZT1vbmVzaG90YCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIHdpdGggdGhlIHByb3BlcnRpZXMgZGljdGlvbmFyeS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBzZWFyY2ggam9iOiBgKGVyciwgY3JlYXRlZEpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIHNlYXJjaDogZnVuY3Rpb24ocXVlcnksIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShxdWVyeSwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgb25lc2hvdCBzZWFyY2ggZnJvbSBhIGdpdmVuIHNlYXJjaCBxdWVyeSBhbmQgcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9icyA9IHNlcnZpY2Uuam9icygpO1xuICAgICAgICAgKiAgICAgIGpvYnMub25lc2hvdFNlYXJjaChcInNlYXJjaCBFUlJPUlwiLCB7aWQ6IFwibXlqb2JfMTIzXCJ9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJSRVNVTFQgRklFTERTXCI6IHJlc3VsdHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuIFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoOlxuICAgICAgICAgKiAgICAtIGBvdXRwdXRfbW9kZWAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSByZXN1bHRzIChYTUwsIEpTT04sIG9yIENTVikuXG4gICAgICAgICAqICAgIC0gYGVhcmxpZXN0X3RpbWVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgZWFybGllc3QgdGltZSBpbiB0aGUgdGltZSByYW5nZSB0byBzZWFyY2guIFRoZSB0aW1lIHN0cmluZyBjYW4gYmUgYSBVVEMgdGltZSAod2l0aCBmcmFjdGlvbmFsIHNlY29uZHMpLCBhIHJlbGF0aXZlIHRpbWUgc3BlY2lmaWVyICh0byBub3cpLCBvciBhIGZvcm1hdHRlZCB0aW1lIHN0cmluZy5cbiAgICAgICAgICogICAgLSBgbGF0ZXN0X3RpbWVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgbGF0ZXN0IHRpbWUgaW4gdGhlIHRpbWUgcmFuZ2UgdG8gc2VhcmNoLiBUaGUgdGltZSBzdHJpbmcgY2FuIGJlIGEgVVRDIHRpbWUgKHdpdGggZnJhY3Rpb25hbCBzZWNvbmRzKSwgYSByZWxhdGl2ZSB0aW1lIHNwZWNpZmllciAodG8gbm93KSwgb3IgYSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXG4gICAgICAgICAqICAgIC0gYHJmYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgb25lIG9yIG1vcmUgZmllbGRzIHRvIGFkZCB0byB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoOiBgKGVyciwgcmVzdWx0cylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIG9uZXNob3RTZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QocXVlcnkpICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHBhcmFtcy5zZWFyY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSBxdWVyeTsgXG4gICAgICAgICAgICBwYXJhbXMuZXhlY19tb2RlID0gXCJvbmVzaG90XCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKFwiTXVzdCBwcm92aWRlIGEgcXVlcnkgdG8gY3JlYXRlIGEgc2VhcmNoIGpvYlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG91dHB1dE1vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLnF1YWxpZmllZFBhdGg7XG4gICAgICAgICAgICB2YXIgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgdmFyIHBvc3QgPSBwYXJhbXM7XG4gICAgICAgICAgICB2YXIgZ2V0ID0ge291dHB1dF9tb2RlOiBvdXRwdXRNb2RlfTtcbiAgICAgICAgICAgIHZhciBib2R5ID0gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMuc2VydmljZS5yZXF1ZXN0KFxuICAgICAgICAgICAgICAgIHBhdGgsIFxuICAgICAgICAgICAgICAgIG1ldGhvZCwgXG4gICAgICAgICAgICAgICAgZ2V0LCBcbiAgICAgICAgICAgICAgICBwb3N0LCBcbiAgICAgICAgICAgICAgICBib2R5LCBcbiAgICAgICAgICAgICAgICBoZWFkZXJzLCBcbiAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBmaWVsZCBvZiBhIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIGBEYXRhTW9kZWxDYWxjdWxhdGlvbmBcbiAgICAgKiBhbmQgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICpcbiAgICAgKiBIYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKiAgICAtIGBmaWVsZE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoaXMgZmllbGQuXG4gICAgICogICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6ICBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQuXG4gICAgICogICAgLSBgdHlwZWAgKF9zdHJpbmdfKTogVGhlIHR5cGUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKiAgICAtIGBtdWx0aXZhbHVlZGAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBtdWx0aXZhbHVlZC5cbiAgICAgKiAgICAtIGByZXF1aXJlZGAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cbiAgICAgKiAgICAtIGBoaWRkZW5gIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIGRhdGEgbW9kZWwgVUkuXG4gICAgICogICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZC5cbiAgICAgKiAgICAtIGBjb21tZW50YCAoX3N0cmluZ18pOiBBIGNvbW1lbnQgZm9yIHRoaXMgZmllbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBpc24ndCBvbmUuXG4gICAgICogICAgLSBgZmllbGRTZWFyY2hgIChfc3RyaW5nXyk6IEEgc2VhcmNoIHF1ZXJ5IGZyYWdtZW50IGZvciB0aGlzIGZpZWxkLlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogQW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiB0aGUgbGluZWFnZSBvZiB0aGUgZGF0YSBtb2RlbFxuICAgICAqICAgICAgICAgIG9uIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC5cbiAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHR5cGVzIGZvciBhIGRhdGEgbW9kZWwgZmllbGQ6XG4gICAgICogICAgLSBgc3RyaW5nYFxuICAgICAqICAgIC0gYGJvb2xlYW5gXG4gICAgICogICAgLSBgbnVtYmVyYFxuICAgICAqICAgIC0gYHRpbWVzdGFtcGBcbiAgICAgKiAgICAtIGBvYmplY3RDb3VudGBcbiAgICAgKiAgICAtIGBjaGlsZENvdW50YFxuICAgICAqICAgIC0gYGlwdjRgXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsRmllbGQgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICBfdHlwZXM6IFsgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJ0aW1lc3RhbXBcIiwgXCJvYmplY3RDb3VudFwiLCBcImNoaWxkQ291bnRcIiwgXCJpcHY0XCIsIFwiYm9vbGVhblwiXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBmaWVsZC5cbiAgICAgICAgICogU0RLIHVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAgLSBgZmllbGROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGlzIGZpZWxkLlxuICAgICAgICAgKiAgICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZC5cbiAgICAgICAgICogICAgIC0gYHR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgZmllbGQsIHNlZSB2YWxpZCB0eXBlcyBpbiBjbGFzcyBkb2NzLlxuICAgICAgICAgKiAgICAgLSBgbXVsdGl2YWx1ZWAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBtdWx0aXZhbHVlZC5cbiAgICAgICAgICogICAgIC0gYHJlcXVpcmVkYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9uIGV2ZW50cyBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAqICAgICAtIGBoaWRkZW5gIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIGRhdGEgbW9kZWwgVUkuXG4gICAgICAgICAqICAgICAtIGBlZGl0YWJsZWAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gYmUgZWRpdGVkLlxuICAgICAgICAgKiAgICAgLSBgY29tbWVudGAgKF9zdHJpbmdfKTogQSBjb21tZW50IGZvciB0aGlzIGZpZWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAgICAgKiAgICAgLSBgZmllbGRTZWFyY2hgIChfc3RyaW5nXyk6IEEgc2VhcmNoIHF1ZXJ5IGZyYWdtZW50IGZvciB0aGlzIGZpZWxkLlxuICAgICAgICAgKiAgICAgLSBgbGluZWFnZWAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgZmllbGRcbiAgICAgICAgICogICAgICAgICAgaXMgZGVmaW5lZCwgaXRlbXMgYXJlIGRlbGltaXRlZCBieSBhIGRvdC4gVGhpcyBpcyBjb252ZXJ0ZWQgaW50byBhbiBhcnJheSBvZlxuICAgICAgICAgKiAgICAgICAgICBzdHJpbmdzIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgICAgICAgICAgcHJvcHMub3duZXIgPSBwcm9wcy5vd25lciB8fCBcIlwiO1xuXG4gICAgICAgICAgICB0aGlzLm5hbWUgICAgICAgICAgID0gcHJvcHMuZmllbGROYW1lO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSAgICA9IHByb3BzLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdGhpcy50eXBlICAgICAgICAgICA9IHByb3BzLnR5cGU7XG4gICAgICAgICAgICB0aGlzLm11bHRpdmFsdWVkICAgID0gcHJvcHMubXVsdGl2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWQgICAgICAgPSBwcm9wcy5yZXF1aXJlZDtcbiAgICAgICAgICAgIHRoaXMuaGlkZGVuICAgICAgICAgPSBwcm9wcy5oaWRkZW47XG4gICAgICAgICAgICB0aGlzLmVkaXRhYmxlICAgICAgID0gcHJvcHMuZWRpdGFibGU7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgICAgICAgID0gcHJvcHMuY29tbWVudCB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlYXJjaCAgICA9IHByb3BzLmZpZWxkU2VhcmNoO1xuICAgICAgICAgICAgdGhpcy5saW5lYWdlICAgICAgICA9IHByb3BzLm93bmVyLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICAgIHRoaXMub3duZXIgICAgICAgICAgPSB0aGlzLmxpbmVhZ2VbdGhpcy5saW5lYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBzdHJpbmc/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIG51bWJlcj9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgZmllbGQgaXMgb2YgdHlwZSBudW1iZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNOdW1iZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgdGltZXN0YW1wP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIHRpbWVzdGFtcC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc1RpbWVzdGFtcDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0aW1lc3RhbXBcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBvYmplY3QgY291bnQ/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGNvdW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2JqZWN0Y291bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0Q291bnRcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBjaGlsZCBjb3VudD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgZmllbGQgaXMgb2YgdHlwZSBjaGlsZCBjb3VudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc0NoaWxkY291bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiY2hpbGRDb3VudFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIGlwdjQ/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgaXB2NC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc0lQdjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiaXB2NFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIGJvb2xlYW4/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgYm9vbGVhbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc0Jvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYm9vbGVhblwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29uc3RyYWludCBvbiBhIGBEYXRhTW9kZWxPYmplY3RgIG9yIGEgYERhdGFNb2RlbEZpZWxkYC5cbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYHF1ZXJ5YCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IGRlZmluaW5nIHRoaXMgZGF0YSBtb2RlbCBjb25zdHJhaW50LlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogVGhlIGxpbmVhZ2Ugb2YgdGhpcyBkYXRhIG1vZGVsIGNvbnN0cmFpbnQuXG4gICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCB0aGF0IG93bnNcbiAgICAgKiAgICAgICAgICB0aGlzIGRhdGEgbW9kZWwgY29uc3RyYWludC5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENvbnN0cmFpbnRcbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbENvbnN0cmFpbnQgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBjb25zdHJhaW50LlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byBzZXQ6XG4gICAgICAgICAqICAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgc2VhcmNoIHF1ZXJ5IHRoaXMgY29uc3RyYWludCBzcGVjaWZpZXMuXG4gICAgICAgICAqICAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHRoYXQgb3ducyB0aGlzXG4gICAgICAgICAqICAgICAgICAgIGNvbnN0cmFpbnQsIGl0ZW1zIGFyZSBkZWxpbWl0ZWQgYnkgYSBkb3QuIFRoaXMgaXMgY29udmVydGVkIGludG9cbiAgICAgICAgICogICAgICAgICAgYW4gYXJyYXkgb2Ygc3RyaW5ncyB1cG9uIGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENvbnN0cmFpbnRcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgICAgICAgICAgcHJvcHMub3duZXIgPSBwcm9wcy5vd25lciB8fCBcIlwiO1xuXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5ICAgPSBwcm9wcy5zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLmxpbmVhZ2UgPSBwcm9wcy5vd25lci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB0aGlzLm93bmVyICAgPSB0aGlzLmxpbmVhZ2VbdGhpcy5saW5lYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogVXNlZCBmb3Igc3BlY2lmeWluZyBhIGNhbGN1bGF0aW9uIG9uIGEgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICpcbiAgICAgKiBIYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKiAgICAtIGBpZGAgKF9zdHJpbmdfKTogVGhlIElEIGZvciB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24uXG4gICAgICogICAgLSBgdHlwZWAgKF9zdHJpbmdfKTogVGhlIHR5cGUgb2YgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLlxuICAgICAqICAgIC0gYGNvbW1lbnRgIChfc3RyaW5nX3xfbnVsbF8pOiBUaGUgY29tbWVudCBmb3IgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLCBvciBgbnVsbGAuXG4gICAgICogICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBUcnVlIGlmIHRoaXMgY2FsY3VsYXRpb24gY2FuIGJlIGVkaXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgY2FsY3VsYXRpb25cbiAgICAgKiAgICAgICAgICBpcyBkZWZpbmVkIGluIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBkYXRhIG1vZGVsIHRoYXQgdGhpcyBjYWxjdWxhdGlvbiBiZWxvbmdzIHRvLlxuICAgICAqICAgIC0gYG91dHB1dEZpZWxkc2AgKF9hcnJheV8pOiBUaGUgZmllbGRzIG91dHB1dCBieSB0aGlzIGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIFJleCBhbmQgRXZhbCB0eXBlcyBoYXZlIGFuIGFkZGl0aW9uYWwgcHJvcGVydHk6XG4gICAgICogICAgLSBgZXhwcmVzc2lvbmAgKF9zdHJpbmdfKTogVGhlIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGlzIGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIFJleCBhbmQgR2VvSVAgdHlwZXMgaGF2ZSBhbiBhZGRpdGlvbmFsIHByb3BlcnR5OlxuICAgICAqICAgIC0gYGlucHV0RmllbGRgIChfc3RyaW5nXyk6IFRoZSBmaWVsZCB0byB1c2UgZm9yIGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIExvb2t1cCB0eXBlIGhhcyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgbG9va3VwTmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhlIGxvb2t1cCB0byBwZXJmb3JtLlxuICAgICAqICAgIC0gYGlucHV0RmllbGRNYXBwaW5nc2AgKF9vYmplY3RfKTogVGhlIG1hcHBpbmdzIGZyb20gZmllbGRzIGluIHRoZSBldmVudHMgdG8gZmllbGRzIGluIHRoZSBsb29rdXAuXG4gICAgICpcbiAgICAgKiBWYWxpZCB0eXBlcyBvZiBjYWxjdWxhdGlvbnMgYXJlOlxuICAgICAqICAgIC0gYExvb2t1cGBcbiAgICAgKiAgICAtIGBFdmFsYFxuICAgICAqICAgIC0gYEdlb0lQYFxuICAgICAqICAgIC0gYFJleGBcbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICovXG4gICAgcm9vdC5EYXRhTW9kZWxDYWxjdWxhdGlvbiA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIF90eXBlczogW1wiTG9va3VwXCIsIFwiRXZhbFwiLCBcIkdlb0lQXCIsIFwiUmV4XCJdLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byBzZXQ6XG4gICAgICAgICAqICAgICAtIGBjYWxjdWxhdGlvbklEYCAoX3N0cmluZ18pOiBUaGUgSUQgb2YgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgICAgICogICAgIC0gYGNhbGN1bGF0aW9uVHlwZWAgKF9zdHJpbmdfKTogVGhlIHR5cGUgb2YgdGhpcyBjYWxjdWxhdGlvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiAgICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgY2FsY3VsYXRpb24gY2FuIGJlIGVkaXRlZC5cbiAgICAgICAgICogICAgIC0gYGNvbW1lbnRgIChfc3RyaW5nXyk6IEEgY29tbWVudCBmb3IgdGhpcyBjYWxjdWxhdGlvbiwgb3IgYG51bGxgIGlmIHRoZXJlIGlzbid0IG9uZS5cbiAgICAgICAgICogICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgbGluZWFnZSBvZiB0aGUgZGF0YSBtb2RlbCBvYmplY3Qgb24gd2hpY2ggdGhpcyBjYWxjdWxhdGlvblxuICAgICAgICAgKiAgICAgICAgICBpcyBkZWZpbmVkLCBpdGVtcyBhcmUgZGVsaW1pdGVkIGJ5IGEgZG90LiBUaGlzIGlzIGNvbnZlcnRlZCBpbnRvIGFuIGFycmF5IG9mXG4gICAgICAgICAqICAgICAgICAgIHN0cmluZ3MgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAqICAgICAtIGBvdXRwdXRGaWVsZHNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgdGhlIGZpZWxkcyB0aGlzIGNhbGN1bGF0aW9uIGdlbmVyYXRlcy5cbiAgICAgICAgICogICAgIC0gYGV4cHJlc3Npb25gIChfc3RyaW5nXyk6IFRoZSBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhpcyBjYWxjdWxhdGlvbjsgZXhjbHVzaXZlIHRvIGBFdmFsYCBhbmQgYFJleGAgY2FsY3VsYXRpb25zIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYGlucHV0RmllbGRgIChfc3RyaW5nXyk6IFRoZSBmaWVsZCB0byB1c2UgZm9yIGNhbGN1bGF0aW9uOyBleGNsdXNpdmUgdG8gYEdlb0lQYCBhbmQgYFJleGAgY2FsY3VsYXRpb25zIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYGxvb2t1cE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBsb29rdXAgdG8gcGVyZm9ybTsgZXhjbHVzaXZlIHRvIGBMb29rdXBgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBpbnB1dEZpZWxkTWFwcGluZ3NgIChfYXJyYXlfKTogT25lIGVsZW1lbnQgYXJyYXkgY29udGFpbmluZyBhbiBvYmplY3Qgd2l0aCB0aGUgbWFwcGluZ3MgZnJvbSBmaWVsZHMgaW4gdGhlIGV2ZW50cyB0byBmaWVsZHNcbiAgICAgICAgICogICAgICAgICBpbiB0aGUgbG9va3VwOyBleGNsdXNpdmUgdG8gYExvb2t1cGAgY2FsY3VsYXRpb25zIChvcHRpb25hbClcbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIHByb3BzLm93bmVyID0gcHJvcHMub3duZXIgfHwgXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5pZCAgICAgICAgICAgICA9IHByb3BzLmNhbGN1bGF0aW9uSUQ7XG4gICAgICAgICAgICB0aGlzLnR5cGUgICAgICAgICAgID0gcHJvcHMuY2FsY3VsYXRpb25UeXBlO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50ICAgICAgICA9IHByb3BzLmNvbW1lbnQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGUgICAgICAgPSBwcm9wcy5lZGl0YWJsZTtcbiAgICAgICAgICAgIHRoaXMubGluZWFnZSAgICAgICAgPSBwcm9wcy5vd25lci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB0aGlzLm93bmVyICAgICAgICAgID0gdGhpcy5saW5lYWdlW3RoaXMubGluZWFnZS5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgdGhpcy5vdXRwdXRGaWVsZHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMub3V0cHV0RmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRGaWVsZHNbcHJvcHMub3V0cHV0RmllbGRzW2ldLmZpZWxkTmFtZV0gPSBuZXcgcm9vdC5EYXRhTW9kZWxGaWVsZChwcm9wcy5vdXRwdXRGaWVsZHNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJFdmFsXCIgPT09IHRoaXMudHlwZSB8fCBcIlJleFwiID09PSB0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBwcm9wcy5leHByZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiR2VvSVBcIiA9PT0gdGhpcy50eXBlIHx8IFwiUmV4XCIgPT09IHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGaWVsZCA9IHByb3BzLmlucHV0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJMb29rdXBcIiA9PT0gdGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb29rdXBOYW1lID0gcHJvcHMubG9va3VwTmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RmllbGRNYXBwaW5ncyA9IHByb3BzLmxvb2t1cElucHV0c1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIG9mIG91dHB1dCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgb2Ygb3V0cHV0IGZpZWxkIG5hbWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIG91dHB1dEZpZWxkTmFtZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMub3V0cHV0RmllbGRzKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGVkaXRhYmxlP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBpcyBlZGl0YWJsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc0VkaXRhYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZWRpdGFibGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBvZiB0eXBlIGxvb2t1cD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgb2YgdHlwZSBsb29rdXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaXNMb29rdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTG9va3VwXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIG9mIHR5cGUgZXZhbD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgb2YgdHlwZSBldmFsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzRXZhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJFdmFsXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gb2YgdHlwZSBSZXg/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGlzIG9mIHR5cGUgUmV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzUmV4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlJleFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBvZiB0eXBlIEdlb0lQP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBpcyBvZiB0eXBlIEdlb0lQLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzR2VvSVA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiR2VvSVBcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUGl2b3QgcmVwcmVzZW50cyBkYXRhIGFib3V0IGEgcGl2b3QgcmVwb3J0IHJldHVybmVkIGJ5IHRoZSBTcGx1bmsgU2VydmVyLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgc2VydmljZWAgKF9zcGx1bmtqcy5TZXJ2aWNlXyk6IEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAqICAgIC0gYHNlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBzdHJpbmcgZm9yIHJ1bm5pbmcgdGhlIHBpdm90IHJlcG9ydC5cbiAgICAgKiAgICAtIGBkcmlsbGRvd25TZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggZm9yIHJ1bm5pbmcgdGhpcyBwaXZvdCByZXBvcnQgdXNpbmcgZHJpbGxkb3duLlxuICAgICAqICAgIC0gYG9wZW5JblNlYXJjaGAgKF9zdHJpbmdfKTogRXF1aXZhbGVudCB0byBzZWFyY2ggcGFyYW1ldGVyLCBidXQgbGlzdGVkIG1vcmUgc2ltcGx5LlxuICAgICAqICAgIC0gYHByZXR0eVF1ZXJ5YCAoX3N0cmluZ18pOiBFcXVpdmFsZW50IHRvIGBvcGVuSW5TZWFyY2hgLlxuICAgICAqICAgIC0gYHBpdm90U2VhcmNoYCAoX3N0cmluZ18pOiBBIHBpdm90IHNlYXJjaCBjb21tYW5kIGJhc2VkIG9uIHRoZSBuYW1lZCBkYXRhIG1vZGVsLlxuICAgICAqICAgIC0gYHRzdGF0c1NlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBmb3IgcnVubmluZyB0aGlzIHBpdm90IHJlcG9ydCB1c2luZyB0c3RhdHMuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5QaXZvdFxuICAgICAqL1xuICAgIHJvb3QuUGl2b3QgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgcGl2b3QuXG4gICAgICAgICAqIFNESyB1c2VycyBhcmUgbm90IGV4cGVjdGVkIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggc3RyaW5nIGZvciBydW5uaW5nIHRoZSBwaXZvdCByZXBvcnQuXG4gICAgICAgICAqICAgIC0gYGRyaWxsZG93bl9zZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggZm9yIHJ1bm5pbmcgdGhpcyBwaXZvdCByZXBvcnQgdXNpbmcgZHJpbGxkb3duLlxuICAgICAgICAgKiAgICAtIGBvcGVuX2luX3NlYXJjaGAgKF9zdHJpbmdfKTogRXF1aXZhbGVudCB0byBzZWFyY2ggcGFyYW1ldGVyLCBidXQgbGlzdGVkIG1vcmUgc2ltcGx5LlxuICAgICAgICAgKiAgICAtIGBwaXZvdF9zZWFyY2hgIChfc3RyaW5nXyk6IEEgcGl2b3Qgc2VhcmNoIGNvbW1hbmQgYmFzZWQgb24gdGhlIG5hbWVkIGRhdGEgbW9kZWwuXG4gICAgICAgICAqICAgIC0gYHRzdGF0c19zZWFyY2hgIChfc3RyaW5nX3xfbnVsbF8pOiBUaGUgc2VhcmNoIGZvciBydW5uaW5nIHRoaXMgcGl2b3QgcmVwb3J0IHVzaW5nIHRzdGF0cywgbnVsbCBpZiBhY2NlbGVyYXRpb24gaXMgZGlzYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaCA9IHByb3BzLnNlYXJjaDtcbiAgICAgICAgICAgIHRoaXMuZHJpbGxkb3duU2VhcmNoID0gcHJvcHMuZHJpbGxkb3duX3NlYXJjaDtcbiAgICAgICAgICAgIHRoaXMucHJldHR5UXVlcnkgPSB0aGlzLm9wZW5JblNlYXJjaCA9IHByb3BzLm9wZW5faW5fc2VhcmNoO1xuICAgICAgICAgICAgdGhpcy5waXZvdFNlYXJjaCA9IHByb3BzLnBpdm90X3NlYXJjaDtcbiAgICAgICAgICAgIHRoaXMudHN0YXRzU2VhcmNoID0gcHJvcHMudHN0YXRzX3NlYXJjaCB8fCBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnJ1biA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5ydW4pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydHMgYSBzZWFyY2ggam9iIHJ1bm5pbmcgdGhpcyBwaXZvdCwgYWNjZWxlcmF0ZWQgaWYgcG9zc2libGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYiAob3B0aW9uYWwpLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogICAgICAgICoqTm90ZToqKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBleGVjX21vZGU9b25lc2hvdGAgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBwcm9wZXJ0aWVzIGRpY3Rpb25hcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUgY3JlYXRpbmcgdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90XG4gICAgICAgICAqL1xuICAgICAgICBydW46IGZ1bmN0aW9uKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhcmdzO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXJncyB8fCBPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhcmdzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRzdGF0cyBpcyB1bmRlZmluZWQsIHVzZSBwaXZvdFNlYXJjaCAodHJ5IHRvIHJ1biBhbiBhY2NlbGVyYXRlZCBzZWFyY2ggaWYgcG9zc2libGUpXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2VhcmNoKHRoaXMudHN0YXRzU2VhcmNoIHx8IHRoaXMucGl2b3RTZWFyY2gsIGFyZ3MsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUGl2b3RTcGVjaWZpY2F0aW9uIHJlcHJlc2VudHMgYSBwaXZvdCB0byBiZSBkb25lIG9uIGEgcGFydGljdWxhciBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgKiBUaGUgdXNlciBjcmVhdGVzIGEgUGl2b3RTcGVjaWZpY2F0aW9uIG9uIHNvbWUgZGF0YSBtb2RlbCBvYmplY3QsIGFkZHMgZmlsdGVycywgcm93IHNwbGl0cyxcbiAgICAgKiBjb2x1bW4gc3BsaXRzLCBhbmQgY2VsbCB2YWx1ZXMsIHRoZW4gY2FsbHMgdGhlIHBpdm90IG1ldGhvZCB0byBxdWVyeSBzcGx1bmtkIGFuZFxuICAgICAqIGdldCBhIHNldCBvZiBTUEwgcXVlcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIENhbGwgdGhlIGBwaXZvdGAgbWV0aG9kIHRvIHF1ZXJ5IFNwbHVuayBmb3IgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHBpdm90LlxuICAgICAqXG4gICAgICogVGhpcyBjbGFzcyBzdXBwb3J0cyBhIGZsdWVudCBBUEksIGVhY2ggZnVuY3Rpb24gZXhjZXB0IGBpbml0YCwgYHRvSnNvbk9iamVjdGAgJiBgcGl2b3RgXG4gICAgICogcmV0dXJuIHRoZSBtb2RpZmllZCBgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25gIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICogICAgICAgICB2YXIgc2VhcmNoZXMgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAqICAgICAgICAgdmFyIHBpdm90U3BlY2lmaWNhdGlvbiA9IHNlYXJjaGVzLmNyZWF0ZVBpdm90U3BlY2lmaWNhdGlvbigpO1xuICAgICAqICAgICAgICAgcGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICogICAgICAgICAgICAgLmFkZFJvd1NwbGl0KFwidXNlclwiLCBcIkV4ZWN1dGluZyB1c2VyXCIpXG4gICAgICogICAgICAgICAgICAgLmFkZFJhbmdlQ29sdW1uU3BsaXQoXCJleGVjX3RpbWVcIiwge2xpbWl0OiA0fSlcbiAgICAgKiAgICAgICAgICAgICAuYWRkQ2VsbFZhbHVlKFwic2VhcmNoXCIsIFwiU2VhcmNoIFF1ZXJ5XCIsIFwidmFsdWVzXCIpXG4gICAgICogICAgICAgICAgICAgLnBpdm90KGZ1bmN0aW9uKGVyciwgcGl2b3QpIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHb3QgYSBQaXZvdCBvYmplY3QgZnJvbSB0aGUgU3BsdW5rIHNlcnZlciFcIik7XG4gICAgICogICAgICAgICAgICAgfSk7XG4gICAgICogICAgIH0pO1xuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZGF0YU1vZGVsT2JqZWN0YCAoX3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0Xyk6IFRoZSBgRGF0YU1vZGVsT2JqZWN0YCBmcm9tIHdoaWNoXG4gICAgICogICAgICAgIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAgd2FzIGNyZWF0ZWQuXG4gICAgICogICAgLSBgY29sdW1uc2AgKF9hcnJheV8pOiBUaGUgY29sdW1uIHNwbGl0cyBvbiB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAqICAgIC0gYHJvd3NgIChfYXJyYXlfKTogVGhlIHJvdyBzcGxpdHMgb24gdGhpcyBgUGl2b3RTcGVjaWZpY2F0aW9uYC5cbiAgICAgKiAgICAtIGBmaWx0ZXJzYCAoX2FycmF5Xyk6IFRoZSBmaWx0ZXJzIG9uIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICogICAgLSBgY2VsbHNgIChfYXJyYXlfKTogVGhlIGNlbGwgYWdncmVnYXRpb25zIGZvciB0aGlzYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICogICAgLSBgYWNjZWxlcmF0aW9uTmFtZXNwYWNlYCAoX3N0cmluZ198X251bGxfKTogVGhlIG5hbWUgb2YgdGhlIGBEYXRhTW9kZWxgIHRoYXQgb3ducyB0aGUgYERhdGFNb2RlbE9iamVjdGBcbiAgICAgKiAgICAgICAgb24gd2hpY2ggdGhpcyBgUGl2b3RTcGVjaWZpY2F0aW9uYCB3YXMgY3JlYXRlZCBpZiB0aGUgYERhdGFNb2RlbGAgaXMgYWNjZWxlcmF0ZWQuIEFsdGVybmF0aXZlbHksXG4gICAgICogICAgICAgIHlvdSBjYW4gc2V0IHRoaXMgcHJvcGVydHkgbWFudWFsbHkgdG8gdGhlIHNpZCBvZiBhbiBhY2NlbGVyYXRpb24gam9iIGluIHRoZSBmb3JtYXQgYHNpZD08c2lkPmAuXG4gICAgICpcbiAgICAgKiBWYWxpZCBjb21wYXJpc29uIHR5cGVzIGFyZTpcbiAgICAgKiAgICAtIGBib29sZWFuYFxuICAgICAqICAgIC0gYHN0cmluZ2BcbiAgICAgKiAgICAtIGBudW1iZXJgXG4gICAgICogICAgLSBgaXB2NGBcbiAgICAgKlxuICAgICAqIFZhbGlkIGJvb2xlYW4gY29tcGFyaXNvbnMgYXJlOlxuICAgICAqICAgIC0gYD1gXG4gICAgICogICAgLSBgaXNgXG4gICAgICogICAgLSBgaXNOdWxsYFxuICAgICAqICAgIC0gYGlzTm90TnVsbGBcbiAgICAgKlxuICAgICAqIFZhbGlkIHN0cmluZyBjb21wYXJpc29ucyBhcmU6XG4gICAgICogICAgLSBgPWBcbiAgICAgKiAgICAtIGBpc2BcbiAgICAgKiAgICAtIGBpc051bGxgXG4gICAgICogICAgLSBgaXNOb3ROdWxsYFxuICAgICAqICAgIC0gYGNvbnRhaW5zYFxuICAgICAqICAgIC0gYGRvZXNOb3RDb250YWluYFxuICAgICAqICAgIC0gYHN0YXJ0c1dpdGhgXG4gICAgICogICAgLSBgZW5kc1dpdGhgXG4gICAgICogICAgLSBgcmVnZXhgXG4gICAgICpcbiAgICAgKiBWYWxpZCBudW1iZXIgY29tcGFyaXNvbnMgYXJlOlxuICAgICAqICAgIC0gYD1gXG4gICAgICogICAgLSBgIT1gXG4gICAgICogICAgLSBgPGBcbiAgICAgKiAgICAtIGA+YFxuICAgICAqICAgIC0gYDw9YFxuICAgICAqICAgIC0gYD49YFxuICAgICAqICAgIC0gYGlzYFxuICAgICAqICAgIC0gYGlzTnVsbGBcbiAgICAgKiAgICAtIGBpc05vdE51bGxgXG4gICAgICpcbiAgICAgKiBWYWxpZCBpcHY0IGNvbXBhcmlzb25zIGFyZTpcbiAgICAgKiAgICAtIGBpc2BcbiAgICAgKiAgICAtIGBpc051bGxgXG4gICAgICogICAgLSBgaXNOb3ROdWxsYFxuICAgICAqICAgIC0gYGNvbnRhaW5zYFxuICAgICAqICAgIC0gYGRvZXNOb3RDb250YWluYFxuICAgICAqICAgIC0gYHN0YXJ0c1dpdGhgXG4gICAgICpcbiAgICAgKiBWYWxpZCBiaW5uaW5nIHZhbHVlcyBhcmU6XG4gICAgICogICAgLSBgYXV0b2BcbiAgICAgKiAgICAtIGB5ZWFyYFxuICAgICAqICAgIC0gYG1vbnRoYFxuICAgICAqICAgIC0gYGRheWBcbiAgICAgKiAgICAtIGBob3VyYFxuICAgICAqICAgIC0gYG1pbnV0ZWBcbiAgICAgKiAgICAtIGBzZWNvbmRgXG4gICAgICpcbiAgICAgKiBWYWxpZCBzb3J0IGRpcmVjdGlvbnMgYXJlOlxuICAgICAqICAgIC0gYEFTQ0VORElOR2BcbiAgICAgKiAgICAtIGBERUNFTkRJTkdgXG4gICAgICogICAgLSBgREVGQVVMVGBcbiAgICAgKlxuICAgICAqIFZhbGlkIHN0YXRzIGZ1bmN0aW9ucyBhcmU6XG4gICAgICogICAgLSBgbGlzdGBcbiAgICAgKiAgICAtIGB2YWx1ZXNgXG4gICAgICogICAgLSBgZmlyc3RgXG4gICAgICogICAgLSBgbGFzdGBcbiAgICAgKiAgICAtIGBjb3VudGBcbiAgICAgKiAgICAtIGBkY2BcbiAgICAgKiAgICAtIGBzdW1gXG4gICAgICogICAgLSBgYXZlcmFnZWBcbiAgICAgKiAgICAtIGBtYXhgXG4gICAgICogICAgLSBgbWluYFxuICAgICAqICAgIC0gYHN0ZGV2YFxuICAgICAqICAgIC0gYGR1cmF0aW9uYFxuICAgICAqICAgIC0gYGVhcmxpZXN0YFxuICAgICAqICAgIC0gYGxhdGVzdGBcbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAqL1xuICAgIHJvb3QuUGl2b3RTcGVjaWZpY2F0aW9uID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgX2NvbXBhcmlzb25zOiB7XG4gICAgICAgICAgICBib29sZWFuOiBbXCI9XCIsIFwiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIl0sXG4gICAgICAgICAgICBzdHJpbmc6IFtcIj1cIiwgXCJpc1wiLCBcImlzTnVsbFwiLCBcImlzTm90TnVsbFwiLCBcImNvbnRhaW5zXCIsIFwiZG9lc05vdENvbnRhaW5cIiwgXCJzdGFydHNXaXRoXCIsIFwiZW5kc1dpdGhcIiwgXCJyZWdleFwiXSxcbiAgICAgICAgICAgIG51bWJlcjogW1wiPVwiLCBcIiE9XCIsIFwiPFwiLCBcIj5cIiwgXCI8PVwiLCBcIj49XCIsIFwiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIl0sXG4gICAgICAgICAgICBpcHY0OiBbXCJpc1wiLCBcImlzTnVsbFwiLCBcImlzTm90TnVsbFwiLCBcImNvbnRhaW5zXCIsIFwiZG9lc05vdENvbnRhaW5cIiwgXCJzdGFydHNXaXRoXCJdXG4gICAgICAgIH0sXG4gICAgICAgIF9iaW5uaW5nOiBbXCJhdXRvXCIsIFwieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiXSxcbiAgICAgICAgX3NvcnREaXJlY3Rpb246IFtcIkFTQ0VORElOR1wiLCBcIkRFU0NFTkRJTkdcIiwgXCJERUZBVUxUXCJdLFxuICAgICAgICBfc3RhdHNGdW5jdGlvbnM6IFtcImxpc3RcIiwgXCJ2YWx1ZXNcIiwgXCJmaXJzdFwiLCBcImxhc3RcIiwgXCJjb3VudFwiLCBcImRjXCIsIFwic3VtXCIsIFwiYXZlcmFnZVwiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGV2XCIsIFwiZHVyYXRpb25cIiwgXCJlYXJsaWVzdFwiLCBcImxhdGVzdFwiXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWx9IHBhcmVudERhdGFNb2RlbCBUaGUgYERhdGFNb2RlbGAgdGhhdCBvd25zIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKGRhdGFNb2RlbE9iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWxPYmplY3QgPSBkYXRhTW9kZWxPYmplY3Q7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgICAgICAgICB0aGlzLmNlbGxzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uTmFtZXNwYWNlID0gZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5pc0FjY2VsZXJhdGVkKCkgPyBcbiAgICAgICAgICAgICAgICBkYXRhTW9kZWxPYmplY3QuZGF0YU1vZGVsLm5hbWUgOiBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnJ1biAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnJ1bik7XG4gICAgICAgICAgICB0aGlzLnBpdm90ID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnBpdm90KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIGFjY2VsZXJhdGlvbiBjYWNoZSBmb3IgdGhpcyBwaXZvdCBzcGVjaWZpY2F0aW9uIHRvIGEgam9iLFxuICAgICAgICAgKiB1c3VhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVMb2NhbEFjY2VsZXJhdGlvbkpvYiBvbiBhIERhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKiBpbnN0YW5jZSwgYXMgdGhlIGFjY2VsZXJhdGlvbiBjYWNoZSBmb3IgdGhpcyBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xzcGx1bmtqcy5TZXJ2aWNlLkpvYn0gc2lkIFRoZSBzaWQgb2YgYW4gYWNjZWxlcmF0aW9uIGpvYixcbiAgICAgICAgICogICAgIG9yLCBhIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBY2NlbGVyYXRpb25Kb2I6IGZ1bmN0aW9uKHNpZCkge1xuICAgICAgICAgICAgLy8gSWYgYSBzZWFyY2ggb2JqZWN0IGlzIHBhc3NlZCBpbiwgZ2V0IGl0cyBzaWRcbiAgICAgICAgICAgIGlmIChzaWQgJiYgc2lkIGluc3RhbmNlb2YgU2VydmljZS5Kb2IpIHtcbiAgICAgICAgICAgICAgICBzaWQgPSBzaWQuc2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXNpZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpZCB0byB1c2UgZm9yIGFjY2VsZXJhdGlvbiBtdXN0IG5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY2NlbGVyYXRpb25OYW1lc3BhY2UgPSBcInNpZD1cIiArIHNpZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBmaWx0ZXIgb24gYSBib29sZWFuIHZhbHVlZCBmaWVsZC4gVGhlIGZpbHRlciB3aWxsIGJlIGEgY29uc3RyYWludCBvZiB0aGUgZm9ybVxuICAgICAgICAgKiBgZmllbGQgYGNvbXBhcmlzb25gIGNvbXBhcmVUb2AsIGZvciBleGFtcGxlOiBgaXNfcmVtb3RlID0gZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIGZpbHRlciBvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcGFyaXNvblR5cGUgVGhlIHR5cGUgb2YgY29tcGFyaXNvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcGFyaXNvbk9wIFRoZSBjb21wYXJpc29uLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgY29tcGFyaXNvbnMsIGJhc2VkIG9uIHR5cGUuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb21wYXJlVG8gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGZpZWxkIHRvLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkRmlsdGVyOiBmdW5jdGlvbihmaWVsZE5hbWUsIGNvbXBhcmlzb25UeXBlLCBjb21wYXJpc29uT3AsIGNvbXBhcmVUbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBmaWx0ZXIgb24gYSBub25leGlzdGVudCBmaWVsZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGFyaXNvblR5cGUgIT09IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSkudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3QgYWRkIFwiICsgY29tcGFyaXNvblR5cGUgKyAgXG4gICAgICAgICAgICAgICAgICAgIFwiIGZpbHRlciBvbiBcIiArIGZpZWxkTmFtZSArIFxuICAgICAgICAgICAgICAgICAgICBcIiBiZWNhdXNlIGl0IGlzIG9mIHR5cGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyh0aGlzLl9jb21wYXJpc29uc1tjb21wYXJpc29uVHlwZV0sIGNvbXBhcmlzb25PcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IGFkZCBcIiArIGNvbXBhcmlzb25UeXBlICsgXG4gICAgICAgICAgICAgICAgICAgIFwiIGZpbHRlciBiZWNhdXNlIFwiICsgY29tcGFyaXNvbk9wICtcbiAgICAgICAgICAgICAgICAgICAgXCIgaXMgbm90IGEgdmFsaWQgY29tcGFyaXNvbiBvcGVyYXRvclwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKS5saW5lYWdlLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IGNvbXBhcmlzb25UeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB0eXBlIGRlcGVuZGVudFxuICAgICAgICAgICAgaWYgKHV0aWxzLmNvbnRhaW5zKFtcImJvb2xlYW5cIiwgXCJzdHJpbmdcIiwgXCJpcHY0XCIsIFwibnVtYmVyXCJdLCByZXQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXQucnVsZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcjogY29tcGFyaXNvbk9wLFxuICAgICAgICAgICAgICAgICAgICBjb21wYXJlVG86IGNvbXBhcmVUb1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChyZXQpO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIGxpbWl0IG9uIHRoZSBldmVudHMgc2hvd24gaW4gYSBwaXZvdCBieSBzb3J0aW5nIHRoZW0gYWNjb3JkaW5nIHRvIHNvbWUgZmllbGQsIHRoZW4gdGFraW5nXG4gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgbnVtYmVyIGZyb20gdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gZmlsdGVyIG9uLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc29ydEF0dHJpYnV0ZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gdXNlIGZvciBzb3J0aW5nLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc29ydERpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgZXZlbnRzLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgdHlwZXMuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW1pdCBUaGUgbnVtYmVyIG9mIHZhbHVlcyBmcm9tIHRoZSBzb3J0ZWQgbGlzdCB0byBhbGxvdyB0aHJvdWdoIHRoaXMgZmlsdGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdHNGdW5jdGlvbiBUaGUgc3RhdHMgZnVuY3Rpb24gdG8gdXNlIGZvciBhZ2dyZWdhdGlvbiBiZWZvcmUgc29ydGluZywgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkTGltaXRGaWx0ZXI6IGZ1bmN0aW9uKGZpZWxkTmFtZSwgc29ydEF0dHJpYnV0ZSwgc29ydERpcmVjdGlvbiwgbGltaXQsIHN0YXRzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhZGQgbGltaXQgZmlsdGVyIG9uIGEgbm9uZXhpc3RlbnQgZmllbGQuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSk7XG5cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnMoW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwib2JqZWN0Q291bnRcIl0sIGYudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGxpbWl0IGZpbHRlciBvbiBcIiArIGZpZWxkTmFtZSArIFwiIGJlY2F1c2UgaXQgaXMgb2YgdHlwZSBcIiArIGYudHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09PSBmLnR5cGUgJiYgIXV0aWxzLmNvbnRhaW5zKFtcImNvdW50XCIsIFwiZGNcIl0sIHN0YXRzRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gZm9yIGZpZWxkcyBvZiB0eXBlIHN0cmluZyBtdXN0IGJlIENPVU5UIG9yIERJU1RJTkNUX0NPVU5UOyBmb3VuZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzRnVuY3Rpb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PT0gZi50eXBlICYmICF1dGlscy5jb250YWlucyhbXCJjb3VudFwiLCBcImRjXCIsIFwiYXZlcmFnZVwiLCBcInN1bVwiXSwgc3RhdHNGdW5jdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBmb3IgZmllbGRzIG9mIHR5cGUgbnVtYmVyIG11c3QgYmUgb25lIG9mIENPVU5ULCBESVNUSU5DVF9DT1VOVCwgU1VNLCBvciBBVkVSQUdFOyBmb3VuZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzRnVuY3Rpb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJvYmplY3RDb3VudFwiID09PSBmLnR5cGUgJiYgIXV0aWxzLmNvbnRhaW5zKFtcImNvdW50XCJdLCBzdGF0c0Z1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIGZvciBmaWVsZHMgb2YgdHlwZSBvYmplY3QgY291bnQgbXVzdCBiZSBDT1VOVDsgZm91bmQgXCIgKyBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGZpbHRlciA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5saW5lYWdlLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBzb3J0QXR0cmlidXRlLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU93bmVyOiB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShzb3J0QXR0cmlidXRlKS5saW5lYWdlLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgICAgIHNvcnREaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXG4gICAgICAgICAgICAgICAgbGltaXRBbW91bnQ6IGxpbWl0LFxuICAgICAgICAgICAgICAgIHN0YXRzRm46IHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBBc3N1bWVkIFwiaGlnaGVzdFwiIGlzIHByZWZlcnJlZCBmb3Igd2hlbiBzb3J0RGlyZWN0aW9uIGlzIFwiREVGQVVMVFwiXG4gICAgICAgICAgICBmaWx0ZXIubGltaXRUeXBlID0gXCJBU0NFTkRJTkdcIiA9PT0gc29ydERpcmVjdGlvbiA/IFwibG93ZXN0XCIgOiBcImhpZ2hlc3RcIjtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5wdXNoKGZpbHRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSByb3cgc3BsaXQgb24gYSBudW1lcmljIG9yIHN0cmluZyB2YWx1ZWQgZmllbGQsIHNwbGl0dGluZyBvbiBlYWNoIGRpc3RpbmN0IHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFJvd1NwbGl0OiBmdW5jdGlvbihmaWVsZE5hbWUsIGxhYmVsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyhbXCJudW1iZXJcIiwgXCJzdHJpbmdcIl0sIGYudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCBudW1iZXIgb3Igc3RyaW5nLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJvdyA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgcm93LmRpc3BsYXkgPSBcImFsbFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaChyb3cpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgcm93IHNwbGl0IG9uIGEgbnVtZXJpYyBmaWVsZCwgc3BsaXR0aW5nIGludG8gbnVtZXJpYyByYW5nZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgc3BsaXQgZ2VuZXJhdGVzIGJpbnMgd2l0aCBlZGdlcyBlcXVpdmFsZW50IHRvIHRoZVxuICAgICAgICAgKiBjbGFzc2ljIGxvb3AgJ2ZvciBpIGluIDxzdGFydD4gdG8gPGVuZD4gYnkgPHN0ZXA+JyBidXQgd2l0aCBhIG1heGltdW1cbiAgICAgICAgICogbnVtYmVyIG9mIGJpbnMgPGxpbWl0Pi4gVGhpcyBkaXNwYXRjaGVzIHRvIHRoZSBzdGF0cyBhbmQgeHlzZXJpZXMgc2VhcmNoIGNvbW1hbmRzLlxuICAgICAgICAgKiBTZWUgdGhlaXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQW4gb3B0aW9uYWwgZGljdGlvbmFyeSBvZiBjb2xsZWN0aW9uIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbiBvcHRpb25zOlxuICAgICAgICAgKiAgICAtIGBzdGFydGAgKF9pbnRlZ2VyXyk6IFRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHJhbmdlLCBvciBudWxsIHRvIHRha2UgdGhlIGxvd2VzdCB2YWx1ZSBpbiB0aGUgZXZlbnRzLlxuICAgICAgICAgKiAgICAtIGBlbmRgIChfaW50ZWdlcl8pOiBUaGUgdmFsdWUgZm9yIHRoZSBlbmQgb2YgdGhlIGxhc3QgcmFuZ2UsIG9yIG51bGwgdG8gdGFrZSB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgZXZlbnRzLlxuICAgICAgICAgKiAgICAtIGBzdGVwYCAoX2ludGVnZXJfKTogVGhlIHRoZSB3aWR0aCBvZiBlYWNoIHJhbmdlLCBvciBudWxsIHRvIGhhdmUgU3BsdW5rIGNhbGN1bGF0ZSBpdC5cbiAgICAgICAgICogICAgLSBgbGltaXRgIChfaW50ZWdlcl8pOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmFuZ2VzIHRvIHNwbGl0IGludG8sIG9yIG51bGwgZm9yIG5vIGxpbWl0LlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkUmFuZ2VSb3dTcGxpdDogZnVuY3Rpb24oZmllbGQsIGxhYmVsLCByYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgbnVtYmVyLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB1cGRhdGVSYW5nZXMgPSB7fTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLnN0YXJ0KSAmJiByYW5nZXMuc3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZXMuc3RhcnQgPSByYW5nZXMuc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5lbmQpICYmIHJhbmdlcy5lbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZXMuZW5kID0gcmFuZ2VzLmVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLnN0ZXApICYmIHJhbmdlcy5zdGVwICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLnNpemUgPSByYW5nZXMuc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLmxpbWl0KSAmJiByYW5nZXMubGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZXMubWF4TnVtYmVyT2YgPSByYW5nZXMubGltaXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLm93bmVyLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJyYW5nZXNcIixcbiAgICAgICAgICAgICAgICByYW5nZXM6IHVwZGF0ZVJhbmdlc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSByb3cgc3BsaXQgb24gYSBib29sZWFuIHZhbHVlZCBmaWVsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRydWVEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgdHJ1ZSB2YWx1ZWQgcm93IGxhYmVsLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmFsc2VEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgZmFsc2UgdmFsdWVkIHJvdyBsYWJlbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZEJvb2xlYW5Sb3dTcGxpdDogZnVuY3Rpb24oZmllbGQsIGxhYmVsLCB0cnVlRGlzcGxheVZhbHVlLCBmYWxzZURpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChcImJvb2xlYW5cIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgYm9vbGVhbi5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLm93bmVyLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgdHJ1ZUxhYmVsOiB0cnVlRGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGZhbHNlTGFiZWw6IGZhbHNlRGlzcGxheVZhbHVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIHJvdyBzcGxpdCBvbiBhIHRpbWVzdGFtcCB2YWx1ZWQgZmllbGQsIGJpbm5lZCBieSB0aGUgc3BlY2lmaWVkIGJ1Y2tldCBzaXplLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGFiZWwgQSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGlzIHNldCBvZiByb3dzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmlubmluZyBUaGUgc2l6ZSBvZiBiaW5zIHRvIHVzZSwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkVGltZXN0YW1wUm93U3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBsYWJlbCwgYmlubmluZykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChcInRpbWVzdGFtcFwiICE9PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCB0aW1lc3RhbXAuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyh0aGlzLl9iaW5uaW5nLCBiaW5uaW5nKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmlubmluZyBcIiArIGJpbm5pbmcgKyBcIiBmb3VuZC4gVmFsaWQgdmFsdWVzIGFyZTogXCIgKyB0aGlzLl9iaW5uaW5nLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLm93bmVyLFxuICAgICAgICAgICAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBiaW5uaW5nXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7ICAgICAgICAgICAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZWQgZmllbGQsIHByb2R1Y2luZyBhIGNvbHVtbiBmb3JcbiAgICAgICAgICogZWFjaCBkaXN0aW5jdCB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRDb2x1bW5TcGxpdDogZnVuY3Rpb24oZmllbGROYW1lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKCF1dGlscy5jb250YWlucyhbXCJudW1iZXJcIiwgXCJzdHJpbmdcIl0sIGYudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCBudW1iZXIgb3Igc3RyaW5nLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbCA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb2wuZGlzcGxheSA9IFwiYWxsXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBjb2x1bW4gc3BsaXQgb24gYSBudW1lcmljIGZpZWxkLCBzcGxpdHRpbmcgdGhlIHZhbHVlcyBpbnRvIHJhbmdlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgc3RhcnRgIChfaW50ZWdlcl8pOiBUaGUgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByYW5nZSwgb3IgbnVsbCB0byB0YWtlIHRoZSBsb3dlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgZW5kYCAoX2ludGVnZXJfKTogVGhlIHZhbHVlIGZvciB0aGUgZW5kIG9mIHRoZSBsYXN0IHJhbmdlLCBvciBudWxsIHRvIHRha2UgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgc3RlcGAgKF9pbnRlZ2VyXyk6IFRoZSB0aGUgd2lkdGggb2YgZWFjaCByYW5nZSwgb3IgbnVsbCB0byBoYXZlIFNwbHVuayBjYWxjdWxhdGUgaXQuXG4gICAgICAgICAqICAgIC0gYGxpbWl0YCAoX2ludGVnZXJfKTogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJhbmdlcyB0byBzcGxpdCBpbnRvLCBvciBudWxsIGZvciBubyBsaW1pdC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFJhbmdlQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSwgcmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIG51bWJlci5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluIFNwbHVuayA2LjAuMS4xLCBkYXRhIG1vZGVscyBpbmNvcnJlY3RseSBleHBlY3Qgc3RyaW5ncyBmb3IgdGhlc2UgZmllbGRzXG4gICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIG51bWJlcnMuIEluIDYuMSwgdGhpcyBpcyBmaXhlZCBhbmQgYm90aCBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICB2YXIgdXBkYXRlZFJhbmdlcyA9IHt9O1xuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuc3RhcnQpICYmIHJhbmdlcy5zdGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWRSYW5nZXMuc3RhcnQgPSByYW5nZXMuc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5lbmQpICYmIHJhbmdlcy5lbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLmVuZCA9IHJhbmdlcy5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5zdGVwKSAmJiByYW5nZXMuc3RlcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWRSYW5nZXMuc2l6ZSA9IHJhbmdlcy5zdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMubGltaXQpICYmIHJhbmdlcy5saW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWRSYW5nZXMubWF4TnVtYmVyT2YgPSByYW5nZXMubGltaXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJyYW5nZXNcIixcbiAgICAgICAgICAgICAgICByYW5nZXM6IHVwZGF0ZWRSYW5nZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBjb2x1bW4gc3BsaXQgb24gYSBib29sZWFuIHZhbHVlZCBmaWVsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRydWVEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgdHJ1ZSB2YWx1ZWQgY29sdW1uIGxhYmVsLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmFsc2VEaXNwbGF5VmFsdWUgQSBzdHJpbmcgdG8gZGlzcGxheSBpbiB0aGUgZmFsc2UgdmFsdWVkIGNvbHVtbiBsYWJlbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZEJvb2xlYW5Db2x1bW5TcGxpdDogZnVuY3Rpb24oZmllbGROYW1lLCB0cnVlRGlzcGxheVZhbHVlLCBmYWxzZURpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmIChcImJvb2xlYW5cIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgYm9vbGVhbi5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgdHJ1ZUxhYmVsOiB0cnVlRGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGZhbHNlTGFiZWw6IGZhbHNlRGlzcGxheVZhbHVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgdGltZXN0YW1wIHZhbHVlZCBmaWVsZCwgYmlubmVkIGJ5IHRoZSBzcGVjaWZpZWQgYnVja2V0IHNpemUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBiaW5uaW5nIFRoZSBzaXplIG9mIGJpbnMgdG8gdXNlLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgdHlwZXMuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRUaW1lc3RhbXBDb2x1bW5TcGxpdDogZnVuY3Rpb24oZmllbGQsIGJpbm5pbmcpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJ0aW1lc3RhbXBcIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgdGltZXN0YW1wLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnModGhpcy5fYmlubmluZywgYmlubmluZykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJpbm5pbmcgXCIgKyBiaW5uaW5nICsgXCIgZm91bmQuIFZhbGlkIHZhbHVlcyBhcmU6IFwiICsgdGhpcy5fYmlubmluZy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBiaW5uaW5nXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7ICAgICAgICAgICAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGFuIGFnZ3JlZ2F0ZSB0byBlYWNoIGNlbGwgb2YgdGhlIHBpdm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIGFnZ3JlZ2F0ZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIGEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBhZ2dyZWdhdGUuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0c0Z1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB1c2UgZm9yIGFnZ3JlZ2F0aW9uLCBzZWUgY2xhc3MgZG9jcyBmb3IgdmFsaWQgc3RhdHMgZnVuY3Rpb25zLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkQ2VsbFZhbHVlOiBmdW5jdGlvbihmaWVsZE5hbWUsIGxhYmVsLCBzdGF0c0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaWQgbm90IGZpbmQgZmllbGQgXCIgKyBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAodXRpbHMuY29udGFpbnMoW1wic3RyaW5nXCIsIFwiaXB2NFwiXSwgZi50eXBlKSAmJlxuICAgICAgICAgICAgICAgICF1dGlscy5jb250YWlucyhbXG4gICAgICAgICAgICAgICAgICAgIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZhbHVlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImZpcnN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGFzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGNcIl0sIHN0YXRzRnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gb24gc3RyaW5nIGFuZCBJUHY0IGZpZWxkcyBtdXN0IGJlIG9uZSBvZjpcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGxpc3QsIGRpc3RpbmN0X3ZhbHVlcywgZmlyc3QsIGxhc3QsIGNvdW50LCBvciBkaXN0aW5jdF9jb3VudDsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFwibnVtYmVyXCIgPT09IGYudHlwZSAmJiBcbiAgICAgICAgICAgICAgICAhdXRpbHMuY29udGFpbnMoW1xuICAgICAgICAgICAgICAgICAgICBcInN1bVwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYXZlcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0ZGV2XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIF0sIHN0YXRzRnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gb24gbnVtYmVyIGZpZWxkIG11c3QgYmUgbXVzdCBiZSBvbmUgb2Y6XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBzdW0sIGNvdW50LCBhdmVyYWdlLCBtYXgsIG1pbiwgc3RkZXYsIGxpc3QsIG9yIGRpc3RpbmN0X3ZhbHVlczsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChcInRpbWVzdGFtcFwiID09PSBmLnR5cGUgJiZcbiAgICAgICAgICAgICAgICAhdXRpbHMuY29udGFpbnMoW1xuICAgICAgICAgICAgICAgICAgICBcImR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWFybGllc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsYXRlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwidmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgXSwgc3RhdHNGdW5jdGlvbilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBvbiB0aW1lc3RhbXAgZmllbGQgbXVzdCBiZSBvbmUgb2Y6XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBkdXJhdGlvbiwgZWFybGllc3QsIGxhdGVzdCwgbGlzdCwgb3IgZGlzdGluY3QgdmFsdWVzOyBmb3VuZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHV0aWxzLmNvbnRhaW5zKFtcIm9iamVjdENvdW50XCIsIFwiY2hpbGRDb3VudFwiXSwgZi50eXBlKSAmJlxuICAgICAgICAgICAgICAgIFwiY291bnRcIiAhPT0gc3RhdHNGdW5jdGlvblxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIG9uIGNoaWxkY291bnQgYW5kIG9iamVjdGNvdW50IGZpZWxkcyBtdXN0IGJlIGNvdW50OyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZm91bmQgXCIgKyBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFwiYm9vbGVhblwiID09PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIGJvb2xlYW4gdmFsdWVkIGZpZWxkcyBhcyBjZWxsIHZhbHVlcy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2VsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHNwYXJrbGluZTogZmFsc2UsIC8vIE5vdCBwcm9wZXJseSBpbXBsZW1lbnRlZCBpbiBjb3JlIHlldC5cbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RhdHNGdW5jdGlvblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlYWR5IG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIEpTT04gcmVhZHkgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdG9Kc29uT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YU1vZGVsOiB0aGlzLmRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwubmFtZSxcbiAgICAgICAgICAgICAgICBiYXNlQ2xhc3M6IHRoaXMuZGF0YU1vZGVsT2JqZWN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgcm93czogdGhpcy5yb3dzLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBjZWxsczogdGhpcy5jZWxscyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1ZXJ5IFNwbHVuayBmb3IgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byBhIHBpdm90IHJlcG9ydFxuICAgICAgICAgKiBmb3IgdGhpcyBkYXRhIG1vZGVsLCBkZWZpbmVkIGJ5IHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBzZWFyY2hlcyA9IGRhdGFNb2RlbHMuaXRlbShcImludGVybmFsX2F1ZGl0X2xvZ3NcIikub2JqZWN0QnlOYW1lKFwic2VhcmNoZXNcIik7XG4gICAgICAgICAqICAgICAgICAgIHZhciBwaXZvdFNwZWMgPSBzZWFyY2hlcy5jcmVhdGVQaXZvdFNwZWNpZmljYXRpb24oKTtcbiAgICAgICAgICogICAgICAgICAgLy8gVXNlIG9mIHRoZSBmbHVlbnQgQVBJXG4gICAgICAgICAqICAgICAgICAgIHBpdm90U3BlYy5hZGRSb3dTcGxpdChcInVzZXJcIiwgXCJFeGVjdXRpbmcgdXNlclwiKVxuICAgICAgICAgKiAgICAgICAgICAgICAgLmFkZFJhbmdlQ29sdW1uU3BsaXQoXCJleGVjX3RpbWVcIiwge3N0YXJ0OiAwLCBlbmQ6IDEyLCBzdGVwOiA1LCBsaW1pdDogNH0pXG4gICAgICAgICAqICAgICAgICAgICAgICAuYWRkQ2VsbFZhbHVlKFwic2VhcmNoXCIsIFwiU2VhcmNoIFF1ZXJ5XCIsIFwidmFsdWVzXCIpXG4gICAgICAgICAqICAgICAgICAgICAgICAucGl2b3QoZnVuY3Rpb24ocGl2b3RFcnIsIHBpdm90KSB7XG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQaXZvdCBzZWFyY2ggaXM6XCIsIHBpdm90LnNlYXJjaCk7XG4gICAgICAgICAqICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gZG9uZSBnZXR0aW5nIHRoZSBwaXZvdDogYChlcnIsIHBpdm90KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHBpdm90OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHN2YyA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5zZXJ2aWNlO1xuXG4gICAgICAgICAgICB2YXIgYXJncyA9IHtcbiAgICAgICAgICAgICAgICBwaXZvdF9qc29uOiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSnNvbk9iamVjdCgpKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZCh0aGlzLmFjY2VsZXJhdGlvbk5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzLm5hbWVzcGFjZSA9IHRoaXMuYWNjZWxlcmF0aW9uTmFtZXNwYWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gc3ZjLmdldChQYXRocy5waXZvdCArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5uYW1lKSwgYXJncywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVyci5kYXRhLm1lc3NhZ2VzWzBdLnRleHQpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5lbnRyeSAmJiByZXNwb25zZS5kYXRhLmVudHJ5WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG5ldyByb290LlBpdm90KHN2YywgcmVzcG9uc2UuZGF0YS5lbnRyeVswXS5jb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoXCJEaWRuJ3QgZ2V0IGEgUGl2b3QgcmVwb3J0IGJhY2sgZnJvbSBTcGx1bmtcIiksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHdyYXAgdXAgdGhlIGBQaXZvdFNwZWNpZmljYXRpb24ucGl2b3QoKWAgYW5kXG4gICAgICAgICAqIGBQaXZvdC5ydW4oKWAgZnVuY3Rpb24gY2FsbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFF1ZXJ5IFNwbHVuayBmb3IgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byBhIHBpdm90IHJlcG9ydFxuICAgICAgICAgKiBmb3IgdGhpcyBkYXRhIG1vZGVsLCBkZWZpbmVkIGJ5IHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmA7IHRoZW4sXG4gICAgICAgICAqIHN0YXJ0cyBhIHNlYXJjaCBqb2IgcnVubmluZyB0aGlzIHBpdm90LCBhY2NlbGVyYXRlZCBpZiBwb3NzaWJsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmRhdGFNb2RlbHMoKS5mZXRjaChmdW5jdGlvbihmZXRjaEVyciwgZGF0YU1vZGVscykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgc2VhcmNoZXMgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAgICAgKiAgICAgICAgICB2YXIgcGl2b3RTcGVjID0gc2VhcmNoZXMuY3JlYXRlUGl2b3RTcGVjaWZpY2F0aW9uKCk7XG4gICAgICAgICAqICAgICAgICAgIC8vIFVzZSBvZiB0aGUgZmx1ZW50IEFQSVxuICAgICAgICAgKiAgICAgICAgICBwaXZvdFNwZWMuYWRkUm93U3BsaXQoXCJ1c2VyXCIsIFwiRXhlY3V0aW5nIHVzZXJcIilcbiAgICAgICAgICogICAgICAgICAgICAgIC5hZGRSYW5nZUNvbHVtblNwbGl0KFwiZXhlY190aW1lXCIsIHtzdGFydDogMCwgZW5kOiAxMiwgc3RlcDogNSwgbGltaXQ6IDR9KVxuICAgICAgICAgKiAgICAgICAgICAgICAgLmFkZENlbGxWYWx1ZShcInNlYXJjaFwiLCBcIlNlYXJjaCBRdWVyeVwiLCBcInZhbHVlc1wiKVxuICAgICAgICAgKiAgICAgICAgICAgICAgLnJ1bihmdW5jdGlvbihlcnIsIGpvYiwgcGl2b3QpIHtcbiAgICAgICAgICogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkpvYiBTSUQgaXM6XCIsIGpvYi5zaWQpO1xuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGl2b3Qgc2VhcmNoIGlzOlwiLCBwaXZvdC5zZWFyY2gpO1xuICAgICAgICAgKiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYiAob3B0aW9uYWwpLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogICAgICAgICoqTm90ZToqKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBleGVjX21vZGU9b25lc2hvdGAgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBwcm9wZXJ0aWVzIGRpY3Rpb25hcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUgZ2V0dGluZyB0aGUgcGl2b3Q6IGAoZXJyLCBqb2IsIHBpdm90KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHJ1bjogZnVuY3Rpb24oYXJncywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgYXJncyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyA9IGFyZ3MgfHwge307XG5cbiAgICAgICAgICAgIHRoaXMucGl2b3QoZnVuY3Rpb24oZXJyLCBwaXZvdCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpdm90LnJ1bihhcmdzLCBBc3luYy5hdWdtZW50KGNhbGxiYWNrLCBwaXZvdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIG9uZSBvZiB0aGUgc3RydWN0dXJlZCB2aWV3cyBpbiBhIGBEYXRhTW9kZWxgLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZGF0YU1vZGVsYCAoX3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXyk6IFRoZSBgRGF0YU1vZGVsYCB0byB3aGljaCB0aGlzIGBEYXRhTW9kZWxPYmplY3RgIGJlbG9uZ3MuXG4gICAgICogICAgLSBgbmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhpcyBgRGF0YU1vZGVsT2JqZWN0YC5cbiAgICAgKiAgICAtIGBkaXNwbGF5TmFtZWAgKF9zdHJpbmdfKTogVGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhpcyBgRGF0YU1vZGVsT2JqZWN0YC5cbiAgICAgKiAgICAtIGBwYXJlbnROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGBEYXRhTW9kZWxPYmplY3RgIHRvIHRoaXMgb25lLlxuICAgICAqICAgIC0gYGxpbmVhZ2VgIChfYXJyYXlfKTogQW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiB0aGUgbGluZWFnZSBvZiB0aGUgZGF0YSBtb2RlbFxuICAgICAqICAgICAgICAgIG9uIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC5cbiAgICAgKiAgICAtIGBmaWVsZHNgIChfb2JqZWN0Xyk6IEEgZGljdGlvbmFyeSBvZiBgRGF0YU1vZGVsRmllbGRgIG9iamVjdHMsIGFjY2Vzc2libGUgYnkgbmFtZS5cbiAgICAgKiAgICAtIGBjb25zdHJhaW50c2AgKF9hcnJheV8pOiBBbiBhcnJheSBvZiBgRGF0YU1vZGVsQ29uc3RyYWludGAgb2JqZWN0cy5cbiAgICAgKiAgICAtIGBjYWxjdWxhdGlvbnNgIChfb2JqZWN0Xyk6IEEgZGljdGlvbmFyeSBvZiBgRGF0YU1vZGVsQ2FsY3VsYXRpb25gIG9iamVjdHMsIGFjY2Vzc2libGUgYnkgSUQuXG4gICAgICpcbiAgICAgKiBCYXNlU2VhcmNoIGhhcyBhbiBhZGRpdGlvbmFsIHByb3BlcnR5OlxuICAgICAqICAgIC0gYGJhc2VTZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggcXVlcnkgd3JhcHBlZCBieSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAqXG4gICAgICogQmFzZVRyYW5zYWN0aW9uIGhhcyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZ3JvdXBCeUZpZWxkc2AgKF9zdHJpbmdfKTogVGhlIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBncm91cCBldmVudHMgaW50byB0cmFuc2FjdGlvbnMuXG4gICAgICogICAgLSBgb2JqZWN0c1RvR3JvdXBgIChfYXJyYXlfKTogTmFtZXMgb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSB1bmlvbmVkXG4gICAgICogICAgICAgIGFuZCBzcGxpdCBpbnRvIHRyYW5zYWN0aW9ucy5cbiAgICAgKiAgICAtIGBtYXhTcGFuYCAoX3N0cmluZ18pOiBUaGUgbWF4aW11bSB0aW1lIHNwYW4gb2YgYSB0cmFuc2FjdGlvbi5cbiAgICAgKiAgICAtIGBtYXhQYXVzZWAgKF9zdHJpbmdfKTogVGhlIG1heGltdW0gcGF1c2UgdGltZSBvZiBhIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICovXG4gICAgcm9vdC5EYXRhTW9kZWxPYmplY3QgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqIFNESyB1c2VycyBhcmUgbm90IGV4cGVjdGVkIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHRvIHNldDpcbiAgICAgICAgICogICAgIC0gYG9iamVjdE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIGZvciB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKiAgICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICogICAgIC0gYHBhcmVudE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKiAgICAgLSBgbGluZWFnZWAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgdGhhdCBvd25zIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QsXG4gICAgICAgICAqICAgICAgICAgIGl0ZW1zIGFyZSBkZWxpbWl0ZWQgYnkgYSBkb3QuIFRoaXMgaXMgY29udmVydGVkIGludG8gYW4gYXJyYXkgb2ZcbiAgICAgICAgICogICAgICAgICAgc3RyaW5ncyB1cG9uIGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICogICAgIC0gYGZpZWxkc2AgKF9hcnJheV8pOiBBbiBhcnJheSBvZiBkYXRhIG1vZGVsIGZpZWxkcy5cbiAgICAgICAgICogICAgIC0gYGNvbnN0cmFpbnRzYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIGRhdGEgbW9kZWwgY29uc3RyYWludHMuXG4gICAgICAgICAqICAgICAtIGBjYWxjdWxhdGlvbnNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqICAgICAtIGBiYXNlU2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHdyYXBwZWQgYnkgdGhpcyBkYXRhIG1vZGVsIG9iamVjdDsgZXhjbHVzaXZlIHRvIEJhc2VTZWFyY2ggKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgZ3JvdXBCeUZpZWxkc2AgKF9hcnJheV8pOiBUaGUgZmllbGRzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdyb3VwIGV2ZW50cyBpbnRvIHRyYW5zYWN0aW9uczsgZXhjbHVzaXZlIHRvIEJhc2VUcmFuc2FjdGlvbiAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBvYmplY3RzVG9Hcm91cGAgKF9hcnJheV8pOiBOYW1lcyBvZiB0aGUgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHVuaW9uZWRcbiAgICAgICAgICogICAgICAgICBhbmQgc3BsaXQgaW50byB0cmFuc2FjdGlvbnM7IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgbWF4U3BhbmAgKF9zdHJpbmdfKTogVGhlIG1heGltdW0gdGltZSBzcGFuIG9mIGEgdHJhbnNhY3Rpb247IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgbWF4UGF1c2VgIChfc3RyaW5nXyk6IFRoZSBtYXhpbXVtIHBhdXNlIHRpbWUgb2YgYSB0cmFuc2FjdGlvbjsgZXhjbHVzaXZlIHRvIEJhc2VUcmFuc2FjdGlvbiAob3B0aW9uYWwpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWx9IHBhcmVudERhdGFNb2RlbCBUaGUgYERhdGFNb2RlbGAgdGhhdCBvd25zIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHByb3BzLCBwYXJlbnREYXRhTW9kZWwpIHtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgfHwge307XG4gICAgICAgICAgICBwcm9wcy5vd25lciA9IHByb3BzLm93bmVyIHx8IFwiXCI7XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsICAgICAgICAgICAgICA9IHBhcmVudERhdGFNb2RlbDtcbiAgICAgICAgICAgIHRoaXMubmFtZSAgICAgICAgICAgICAgICAgICA9IHByb3BzLm9iamVjdE5hbWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lICAgICAgICAgICAgPSBwcm9wcy5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50TmFtZSAgICAgICAgICAgICA9IHByb3BzLnBhcmVudE5hbWU7XG4gICAgICAgICAgICB0aGlzLmxpbmVhZ2UgICAgICAgICAgICAgICAgPSBwcm9wcy5saW5lYWdlLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICAgICAgLy8gUHJvcGVydGllcyBleGNsdXNpdmUgdG8gQmFzZVRyYW5zYWN0aW9uXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJncm91cEJ5RmllbGRzXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cEJ5RmllbGRzID0gcHJvcHMuZ3JvdXBCeUZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShcIm9iamVjdHNUb0dyb3VwXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzVG9Hcm91cCA9IHByb3BzLm9iamVjdHNUb0dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwidHJhbnNhY3Rpb25NYXhUaW1lU3BhblwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4U3BhbiA9IHByb3BzLnRyYW5zYWN0aW9uTWF4VGltZVNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJ0cmFuc2FjdGlvbk1heFBhdXNlXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXhQYXVzZSA9IHByb3BzLnRyYW5zYWN0aW9uTWF4UGF1c2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3BlcnR5IGV4Y2x1c2l2ZSB0byBCYXNlU2VhcmNoXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJiYXNlU2VhcmNoXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlU2VhcmNoID0gcHJvcHMuYmFzZVNlYXJjaDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUGFyc2UgZmllbGRzXG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkc1twcm9wcy5maWVsZHNbaV0uZmllbGROYW1lXSA9IG5ldyByb290LkRhdGFNb2RlbEZpZWxkKHByb3BzLmZpZWxkc1tpXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJhaW50cy5wdXNoKG5ldyByb290LkRhdGFNb2RlbENvbnN0cmFpbnQocHJvcHMuY29uc3RyYWludHNbal0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUGFyc2UgY2FsY3VsYXRpb25zXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwcm9wcy5jYWxjdWxhdGlvbnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0aW9uc1twcm9wcy5jYWxjdWxhdGlvbnNba10uY2FsY3VsYXRpb25JRF0gPSBuZXcgcm9vdC5EYXRhTW9kZWxDYWxjdWxhdGlvbihwcm9wcy5jYWxjdWxhdGlvbnNba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGEgQmFzZVNlYXJjaD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGlzIHRoZSByb290IHR5cGUsIEJhc2VTZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGlzQmFzZVNlYXJjaDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHRoaXMuYmFzZVNlYXJjaCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QgaXMgYSBCYXNlVHJhbnNhY3Rpb24/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCBpcyB0aGUgcm9vdCB0eXBlLCBCYXNlVHJhbnNhY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGlzQmFzZVRyYW5zYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQodGhpcy5tYXhTcGFuKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB0aGUgbmFtZXMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGZpZWxkcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGZpZWxkTmFtZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmllbGRzKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGRhdGEgbW9kZWwgZmllbGQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIGZpZWxkIG9uIHRoaXNcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkfG51bGx9IFRoZSBkYXRhIG1vZGVsIGZpZWxkXG4gICAgICAgICAqIGZyb20gdGhpcyBkYXRhIG1vZGVsIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgbnVsbCBpZiBpdCB0aGUgXG4gICAgICAgICAqIGZpZWxkIGJ5IHRoYXQgbmFtZSBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBmaWVsZEJ5TmFtZTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZEZpZWxkcygpW25hbWVdIHx8IHRoaXMuZmllbGRzW25hbWVdIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIG1vZGVsIGZpZWxkcyBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMsIGFuZCB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3MgZmllbGRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgYHNwbHVuay5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkYCBvYmplY3RzXG4gICAgICAgICAqIHdoaWNoIGluY2x1ZGVzIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBmaWVsZHMsIGFuZCB0aGUgZmllbGRzIGZyb21cbiAgICAgICAgICogdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgYWxsRmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIG1lcmdlIGZpZWxkcyBhbmQgY2FsY3VsYXRlZEZpZWxkcygpXG4gICAgICAgICAgICB2YXIgY29tYmluZWRGaWVsZHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZiBpbiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcy5oYXNPd25Qcm9wZXJ0eShmKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZEZpZWxkc1tmXSA9IHRoaXMuZmllbGRzW2ZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNhbGN1bGF0ZWRGaWVsZHMgPSB0aGlzLmNhbGN1bGF0ZWRGaWVsZHMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGNmIGluIGNhbGN1bGF0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShjZikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRGaWVsZHNbY2ZdID0gY2FsY3VsYXRlZEZpZWxkc1tjZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29tYmluZWRGaWVsZHM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgb2YgdGhlIGZpZWxkIG5hbWVzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMsIGFuZCB0aGUgbmFtZXMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGZpZWxkcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMsIGFuZCB0aGUgbmFtZXMgb2YgZmllbGRzIG9uIFxuICAgICAgICAgKiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBhbGxGaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFsbEZpZWxkcygpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIG1vZGVsIGZpZWxkcyBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBgc3BsdW5rLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRgIG9iamVjdHNcbiAgICAgICAgICogb2YgdGhlIGZpZWxkcyBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNhbGN1bGF0ZWRGaWVsZHM6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgZmllbGRzID0ge307XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGNhbGN1bGF0aW9ucywgZ2V0IHRoZWlyIGZpZWxkc1xuICAgICAgICAgICAgdmFyIGtleXMgPSB0aGlzLmNhbGN1bGF0aW9uSURzKCk7XG4gICAgICAgICAgICB2YXIgY2FsY3VsYXRpb25zID0gdGhpcy5jYWxjdWxhdGlvbnM7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY3VsYXRpb24gPSBjYWxjdWxhdGlvbnNba2V5c1tpXV07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCBjYWxjdWxhdGlvbi5vdXRwdXRGaWVsZE5hbWVzKCkubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzW2NhbGN1bGF0aW9uLm91dHB1dEZpZWxkTmFtZXMoKVtmXV0gPSBjYWxjdWxhdGlvbi5vdXRwdXRGaWVsZHNbY2FsY3VsYXRpb24ub3V0cHV0RmllbGROYW1lcygpW2ZdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIFxuICAgICAgICAgKiBkYXRhIG1vZGVsIG9iamVjdCdzIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgY2FsY3VsYXRlZEZpZWxkTmFtZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2FsY3VsYXRlZEZpZWxkcygpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QgY29udGFpbnMgdGhlIGZpZWxkIHdpdGggdGhlXG4gICAgICAgICAqIG5hbWUgcGFzc2VkIGluIHRoZSBgZmllbGROYW1lYCBwYXJhbWV0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGxvb2sgZm9yLlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjb250YWlucyB0aGUgZmllbGQgYnkgbmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgaGFzRmllbGQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmNvbnRhaW5zKHRoaXMuYWxsRmllbGROYW1lcygpLCBmaWVsZE5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBJRHMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzXG4gICAgICAgICAqIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgSURzIG9mIHRoaXMgZGF0YSBtb2RlbFxuICAgICAgICAgKiBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNhbGN1bGF0aW9uSURzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhbGN1bGF0aW9ucyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvY2FsIGFjY2VsZXJhdGlvbiBpcyB0c2lkeCBhY2NlbGVyYXRpb24gb2YgYSBkYXRhIG1vZGVsIG9iamVjdCB0aGF0IGlzIGhhbmRsZWRcbiAgICAgICAgICogbWFudWFsbHkgYnkgYSB1c2VyLiBZb3UgY3JlYXRlIGEgam9iIHdoaWNoIGdlbmVyYXRlcyBhbiBpbmRleCwgYW5kIHRoZW4gdXNlIHRoYXRcbiAgICAgICAgICogaW5kZXggaW4geW91ciBwaXZvdHMgb24gdGhlIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgbmFtZXNwYWNlIGNyZWF0ZWQgYnkgdGhlIGpvYiBpcyAnc2lkPXtzaWR9JyB3aGVyZSB7c2lkfSBpcyB0aGUgam9iJ3Mgc2lkLiBZb3VcbiAgICAgICAgICogd291bGQgdXNlIGl0IGluIGFub3RoZXIgam9iIGJ5IHN0YXJ0aW5nIHlvdXIgc2VhcmNoIHF1ZXJ5IHdpdGggYHwgdHN0YXRzIC4uLiBmcm9tIHNpZD17c2lkfSB8IC4uLmBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHRzaWR4IGluZGV4IGNyZWF0ZWQgYnkgdGhpcyBqb2IgaXMgZGVsZXRlZCB3aGVuIHRoZSBqb2IgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgYnkgU3BsdW5rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1hbmFnZSB0aGlzIGpvYiwgaW5jbHVkaW5nIGNhbmNlbGxpbmcgaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBvYmplY3QgPSBkYXRhTW9kZWxzLml0ZW0oXCJzb21lX2RhdGFfbW9kZWxcIikub2JqZWN0QnlOYW1lKFwic29tZV9vYmplY3RcIik7XG4gICAgICAgICAqICAgICAgICAgIG9iamVjdC5jcmVhdGVMb2NhbEFjY2VsZXJhdGlvbkpvYihcIi0xZFwiLCBmdW5jdGlvbihlcnIsIGFjY2VsZXJhdGlvbkpvYikge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgam9iIGhhcyBuYW1lOlwiLCBhY2NlbGVyYXRpb25Kb2IubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH0pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZWFybGllc3RUaW1lIEEgdGltZSBtb2RpZmllciAoZS5nLiwgXCItMndcIikgc2V0dGluZyB0aGUgZWFybGllc3QgdGltZSB0byBpbmRleC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBhY2NlbGVyYXRpb25Kb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlTG9jYWxBY2NlbGVyYXRpb25Kb2I6IGZ1bmN0aW9uKGVhcmxpZXN0VGltZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIGVhcmxpZXN0VGltZSBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBzZXQgY2FsbGJhY2sgdG8gaXRzIHZhbHVlXG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24oZWFybGllc3RUaW1lKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZWFybGllc3RUaW1lO1xuICAgICAgICAgICAgICAgIGVhcmxpZXN0VGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gXCJ8IGRhdGFtb2RlbCBcXFwiXCIgKyB0aGlzLmRhdGFNb2RlbC5uYW1lICsgXCJcXFwiIFwiICsgdGhpcy5uYW1lICsgXCIgc2VhcmNoIHwgdHNjb2xsZWN0XCI7XG4gICAgICAgICAgICB2YXIgYXJncyA9IGVhcmxpZXN0VGltZSA/IHtlYXJsaWVzdF90aW1lOiBlYXJsaWVzdFRpbWV9IDoge307XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLnNlcnZpY2Uuc2VhcmNoKHF1ZXJ5LCBhcmdzLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN0YXJ0IGEgc2VhcmNoIGpvYiB0aGF0IGFwcGxpZXMgcXVlcnlTdWZmaXggdG8gYWxsIHRoZSBldmVudHMgaW4gdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmRhdGFNb2RlbHMoKS5mZXRjaChmdW5jdGlvbihlcnIsIGRhdGFNb2RlbHMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIG9iamVjdCA9IGRhdGFNb2RlbHMuaXRlbShcImludGVybmFsX2F1ZGl0X2xvZ3NcIikub2JqZWN0QnlOYW1lKFwic2VhcmNoZXNcIik7XG4gICAgICAgICAqICAgICAgICAgIG9iamVjdC5zdGFydFNlYXJjaCh7fSwgXCJ8IGhlYWQgNVwiLCBmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgam9iIGhhcyBuYW1lOlwiLCBqb2IubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH0pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqICAgICAgICAqKk5vdGU6KiogVGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBgZXhlY19tb2RlPW9uZXNob3RgIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcHJvcGVydGllcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcXVlcnlTdWZmaXggQSBzZWFyY2ggcXVlcnksIHN0YXJ0aW5nIHdpdGggYSAnfCcgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBjb21tYW5kIHRvIGZldGNoIHRoZSBjb250ZW50cyBvZiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IChlLmcuLCBcInwgaGVhZCAzXCIpLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgc2VhcmNoIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBzdGFydFNlYXJjaDogZnVuY3Rpb24ocGFyYW1zLCBxdWVyeVN1ZmZpeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBxdWVyeSA9IFwifCBkYXRhbW9kZWwgXCIgKyB0aGlzLmRhdGFNb2RlbC5uYW1lICsgXCIgXCIgKyB0aGlzLm5hbWUgKyBcIiBzZWFyY2hcIjtcbiAgICAgICAgICAgIC8vIFByZXBlbmQgYSBzcGFjZSB0byB0aGUgcXVlcnlTdWZmaXgsIG9yIHNldCBpdCB0byBhbiBlbXB0eSBzdHJpbmcgaWYgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIHF1ZXJ5U3VmZml4ID0gKHF1ZXJ5U3VmZml4KSA/IChcIiBcIiArIHF1ZXJ5U3VmZml4KSA6IChcIlwiKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLnNlcnZpY2Uuc2VhcmNoKHF1ZXJ5ICsgcXVlcnlTdWZmaXgsIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHRoaXMgb25lIGluaGVyaXRzIGZyb20gaWYgaXQgaXMgYSB1c2VyIGRlZmluZWQsXG4gICAgICAgICAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3R8bnVsbH0gVGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIHBhcmVudFxuICAgICAgICAgKiAgICAgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIHVzZXIgZGVmaW5lZCBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgcGFyZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFNb2RlbC5vYmplY3RCeU5hbWUodGhpcy5wYXJlbnROYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgbmV3IFBpdm90IFNwZWNpZmljYXRpb24sIGFjY2VwdHMgbm8gcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IEEgbmV3IHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBpdm90U3BlY2lmaWNhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBQYXNzIGluIHRoaXMgRGF0YU1vZGVsT2JqZWN0IHRvIGNyZWF0ZSBhIFBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlBpdm90U3BlY2lmaWNhdGlvbih0aGlzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBkYXRhIG1vZGVsIG9uIHRoZSBzZXJ2ZXIuIERhdGEgbW9kZWxzXG4gICAgICogY29udGFpbiBgRGF0YU1vZGVsT2JqZWN0YCBpbnN0YW5jZXMsIHdoaWNoIHNwZWNpZnkgc3RydWN0dXJlZFxuICAgICAqIHZpZXdzIG9uIFNwbHVuayBkYXRhLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGFtb2RlbC9tb2RlbC97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsID0gU2VydmljZS5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmRhdGFNb2RlbHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBuZXcgZGF0YSBtb2RlbC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSAoT3B0aW9uYWwpIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgb2YgdGhpcyBkYXRhIG1vZGVsOlxuICAgICAgICAgKiAgICAtIGBhY2NlbGVyYXRpb25gIChfc3RyaW5nXyk6IEEgSlNPTiBvYmplY3Qgd2l0aCBhbiBgZW5hYmxlZGAga2V5LCByZXByZXNlbnRpbmcgaWYgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LlxuICAgICAgICAgKiAgICAtIGBjb25jaXNlYCAoX3N0cmluZ18pOiBJbmRpY2F0ZXMgd2hldGhlciB0byBsaXN0IGEgY29uY2lzZSBKU09OIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIG1vZGVsLCBzaG91bGQgYWx3YXlzIGJlIFwiMFwiLlxuICAgICAgICAgKiAgICAtIGBkZXNjcmlwdGlvbmAgKF9zdHJpbmdfKTogVGhlIEpTT04gZGVzY3JpYmluZyB0aGUgZGF0YSBtb2RlbC5cbiAgICAgICAgICogICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIGRpc3BsYXllZCBmb3IgdGhlIGRhdGEgbW9kZWwgaW4gU3BsdW5rIFdlYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlLCBwcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgbm90IGdpdmVuIGEgNHRoIGFyZywgYXNzdW1lIHRoZSBuYW1lc3BhY2Ugd2FzIG9taXR0ZWRcbiAgICAgICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBwcm9wcyA9IG5hbWVzcGFjZTtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLmFjY2VsZXJhdGlvbiA9IEpTT04ucGFyc2UocHJvcHMuY29udGVudC5hY2NlbGVyYXRpb24pIHx8IHt9O1xuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZWxlcmF0aW9uLmhhc093blByb3BlcnR5KFwiZW5hYmxlZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGVuYWJsZWQgcHJvcGVydHkgdG8gYSBib29sZWFuXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24uZW5hYmxlZCA9ICEhdGhpcy5hY2NlbGVyYXRpb24uZW5hYmxlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29uY2lzZT0wIChmYWxzZSkgZm9yY2VzIHRoZSBzZXJ2ZXIgdG8gcmV0dXJuIGFsbCBkZXRhaWxzIG9mIHRoZSBuZXdseSBjcmVhdGVkIGRhdGEgbW9kZWwuXG4gICAgICAgICAgICAvLyB3ZSBkbyBub3Qgd2FudCBhIHN1bW1hcnkgb2YgdGhpcyBkYXRhIG1vZGVsXG4gICAgICAgICAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KFwiY29uY2lzZVwiKSB8fCB1dGlscy5pc1VuZGVmaW5lZChwcm9wcy5jb25jaXNlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2lzZSA9IFwiMFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGF0YU1vZGVsRGVmaW5pdGlvbiA9IEpTT04ucGFyc2UocHJvcHMuY29udGVudC5kZXNjcmlwdGlvbik7XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0TmFtZXMgPSBkYXRhTW9kZWxEZWZpbml0aW9uLm9iamVjdE5hbWVMaXN0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRhdGFNb2RlbERlZmluaXRpb24uZGlzcGxheU5hbWU7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YU1vZGVsRGVmaW5pdGlvbi5kZXNjcmlwdGlvbjtcblxuICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG9iamVjdHMgZm9yIHRoaXMgZGF0YSBtb2RlbCAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgb2JqcyA9IGRhdGFNb2RlbERlZmluaXRpb24ub2JqZWN0cztcbiAgICAgICAgICAgIHRoaXMub2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzLnB1c2gobmV3IHJvb3QuRGF0YU1vZGVsT2JqZWN0KG9ianNbaV0sIHRoaXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW1vdmUgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVwZGF0ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZCBvciBub3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgaXNBY2NlbGVyYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmFjY2VsZXJhdGlvbi5lbmFibGVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgZGF0YSBtb2RlbCBvYmplY3QgZnJvbSB0aGlzIGRhdGEgbW9kZWxcbiAgICAgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fG51bGx9IGEgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIG9iamVjdEJ5TmFtZTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmplY3RzW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0c1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIGV4aXN0cyBpbiB0aGlzIGRhdGEgbW9kZWwgb3Igbm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGhhcyBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICAgICAqL1xuICAgICAgICBoYXNPYmplY3Q6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5jb250YWlucyh0aGlzLm9iamVjdE5hbWVzLCBuYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgZGF0YSBtb2RlbCBvbiB0aGUgc2VydmVyLCB1c2VkIHRvIHVwZGF0ZSBhY2NlbGVyYXRpb24gc2V0dGluZ3MuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byB1cGRhdGUgdGhlIG9iamVjdCB3aXRoOlxuICAgICAgICAgKiAgICAgLSBgYWNjZWxlcmF0aW9uYCAoX29iamVjdF8pOiBUaGUgYWNjZWxlcmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZGF0YSBtb2RlbC5cbiAgICAgICAgICogICAgICAgICBWYWxpZCBrZXlzIGFyZTogYGVuYWJsZWRgLCBgZWFybGllc3RUaW1lYCwgYGNyb25TY2hlZHVsZWAuXG4gICAgICAgICAqICAgICAgICAgQW55IGtleXMgbm90IHNldCB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSBhY2NlbGVyYXRpb24gc2V0dGluZ3MgYWxyZWFkeVxuICAgICAgICAgKiAgICAgICAgIHNldCBvbiB0aGlzIGRhdGEgbW9kZWwuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBkYXRhIG1vZGVsIGlzIHVwZGF0ZWQ6IGAoZXJyLCBkYXRhTW9kZWwpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9wcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc1VuZGVmaW5lZChjYWxsYmFjaykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHByb3BzO1xuICAgICAgICAgICAgICAgIHByb3BzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoXCJNdXN0IHNwZWNpZnkgYSBwcm9wcyBhcmd1bWVudCB0byB1cGRhdGUgYSBkYXRhIG1vZGVsLlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBFeGl0IGlmIHByb3BzIGlzbid0IHNldCwgdG8gYXZvaWQgY2FsbGluZyB0aGUgY2FsbGJhY2sgdHdpY2UuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiQ2Fubm90IHNldCAnbmFtZScgZmllbGQgaW4gJ3VwZGF0ZSdcIiksIHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRXhpdCBpZiB0aGUgbmFtZSBpcyBzZXQsIHRvIGF2b2lkIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHR3aWNlLlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdXBkYXRlZFByb3BzID0ge1xuICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbjogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBwcm9wcy5hY2NjZWxlcmF0aW9uICYmIHByb3BzLmFjY2VsZXJhdGlvbi5lbmFibGVkIHx8IHRoaXMuYWNjZWxlcmF0aW9uLmVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGVhcmxpZXN0X3RpbWU6IHByb3BzLmFjY2NlbGVyYXRpb24gJiYgcHJvcHMuYWNjZWxlcmF0aW9uLmVhcmxpZXN0VGltZSB8fCB0aGlzLmFjY2VsZXJhdGlvbi5lYXJsaWVzdFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGNyb25fc2NoZWR1bGU6IHByb3BzLmFjY2NlbGVyYXRpb24gJiYgcHJvcHMuYWNjZWxlcmF0aW9uLmNyb25TY2hlZHVsZSB8fCB0aGlzLmFjY2VsZXJhdGlvbi5jcm9uU2NoZWR1bGVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdChcIlwiLCB1cGRhdGVkUHJvcHMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YU1vZGVsTmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocmVzcG9uc2UuZGF0YS5lbnRyeVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG5ldyByb290LkRhdGFNb2RlbCh0aGF0LnNlcnZpY2UsIHJlc3BvbnNlLmRhdGEuZW50cnlbMF0ubmFtZSwgZGF0YU1vZGVsTmFtZXNwYWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBkYXRhIG1vZGVscy4gWW91IGNhbiBjcmVhdGUgYW5kXG4gICAgICogbGlzdCBkYXRhIG1vZGVscyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvclxuICAgICAqIGdldCBhIHNwZWNpZmljIGRhdGEgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgZGF0YW1vZGVsL21vZGVsXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVscyA9IFNlcnZpY2UuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmRhdGFNb2RlbHM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzYC5cbiAgICAgICAgICogXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgKE9wdGlvbmFsKSBuYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2UgfHwge307XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmNyZWF0ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYERhdGFNb2RlbGAgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEl0IGlzIHByZWZlcnJlZCB0aGF0IHlvdSBjcmVhdGUgZGF0YSBtb2RlbHMgdGhyb3VnaCB0aGUgU3BsdW5rXG4gICAgICAgICAqIEVudGVycHJpc2Ugd2l0aCBhIGJyb3dzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIHRvIGNyZWF0ZS4gSWYgaXQgY29udGFpbnMgc3BhY2VzIHRoZXkgd2lsbCBiZSByZXBsYWNlZFxuICAgICAgICAgKiAgICAgd2l0aCB1bmRlcnNjb3Jlcy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBgRGF0YU1vZGVsYCBvYmplY3Q6IGAoZXJyLCBjcmVhdGVkRGF0YU1vZGVsKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKG5hbWUsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGdldCAobmFtZSwgY2FsbGJhY2spIGluc3RlYWQgb2YgKG5hbWUsIHBhcmFtcywgY2FsbGJhY2spXG4gICAgICAgICAgICAvLyBkbyB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlIHN3YXBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XG5cbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3QoXCJcIiwge25hbWU6IG5hbWUsIGRlc2NyaXB0aW9uOiBKU09OLnN0cmluZ2lmeShwYXJhbXMpfSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhTW9kZWwgPSBuZXcgcm9vdC5EYXRhTW9kZWwodGhhdC5zZXJ2aWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdLm5hbWUsIHRoYXQubmFtZXNwYWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdXNlZCB0byBjcmVhdGUgYSBcbiAgICAgICAgICogYERhdGFNb2RlbGAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsfSBBIG5ldyBgRGF0YU1vZGVsYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5EYXRhTW9kZWwodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UsIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyohKi9cbiAgICAvLyBJdGVyYXRlcyBvdmVyIGFuIGVuZHBvaW50J3MgcmVzdWx0cy5cbiAgICByb290LlBhZ2luYXRlZEVuZHBvaW50SXRlcmF0b3IgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICBpbml0OiBmdW5jdGlvbihlbmRwb2ludCwgcGFyYW1zKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX2VuZHBvaW50ID0gZW5kcG9pbnQ7XG4gICAgICAgICAgICB0aGlzLl9wYWdlc2l6ZSA9IHBhcmFtcy5wYWdlc2l6ZSB8fCAwO1xuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8vIEZldGNoZXMgdGhlIG5leHQgcGFnZSBmcm9tIHRoZSBlbmRwb2ludC5cbiAgICAgICAgbmV4dDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDogdGhpcy5fcGFnZXNpemUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLl9vZmZzZXRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5kcG9pbnQocGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1SZXN1bHRzID0gKHJlc3VsdHMucm93cyA/IHJlc3VsdHMucm93cy5sZW5ndGggOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb2Zmc2V0ICs9IG51bVJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzLCBudW1SZXN1bHRzID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKCk7Il19 \ No newline at end of file diff --git a/node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js b/node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js deleted file mode 100644 index 2b64393bb..000000000 --- a/node_modules/.cache/nyc/service-ee0af46cf9fea320d5dd2acc484d81786a58e3cde0369210c14b0a65c62d3b58.js +++ /dev/null @@ -1,2875 +0,0 @@ -function cov_1ks4ntaci2(){var path="/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js";var hash="1e13507780108878ff5a225bb0ab3d0d383df74e";var global=new Function("return this")();var gcv="__coverage__";var coverageData={path:"/Users/vmalaviya/DVPL-7124/splunk-sdk-javascript/lib/service.js",statementMap:{"0":{start:{line:16,column:0},end:{line:5803,column:5}},"1":{start:{line:19,column:22},end:{line:19,column:42}},"2":{start:{line:20,column:22},end:{line:20,column:39}},"3":{start:{line:21,column:22},end:{line:21,column:40}},"4":{start:{line:22,column:22},end:{line:22,column:46}},"5":{start:{line:23,column:22},end:{line:23,column:53}},"6":{start:{line:24,column:22},end:{line:24,column:40}},"7":{start:{line:26,column:15},end:{line:26,column:30}},"8":{start:{line:27,column:18},end:{line:27,column:22}},"9":{start:{line:37,column:22},end:{line:41,column:6}},"10":{start:{line:39,column:12},end:{line:39,column:47}},"11":{start:{line:51,column:4},end:{line:664,column:7}},"12":{start:{line:73,column:12},end:{line:73,column:47}},"13":{start:{line:77,column:12},end:{line:77,column:72}},"14":{start:{line:78,column:12},end:{line:78,column:66}},"15":{start:{line:79,column:12},end:{line:79,column:76}},"16":{start:{line:80,column:12},end:{line:80,column:69}},"17":{start:{line:81,column:12},end:{line:81,column:75}},"18":{start:{line:82,column:12},end:{line:82,column:66}},"19":{start:{line:83,column:12},end:{line:83,column:67}},"20":{start:{line:84,column:12},end:{line:84,column:73}},"21":{start:{line:85,column:12},end:{line:85,column:67}},"22":{start:{line:86,column:12},end:{line:86,column:78}},"23":{start:{line:87,column:12},end:{line:87,column:72}},"24":{start:{line:106,column:12},end:{line:116,column:15}},"25":{start:{line:136,column:12},end:{line:136,column:47}},"26":{start:{line:164,column:12},end:{line:164,column:60}},"27":{start:{line:192,column:12},end:{line:192,column:53}},"28":{start:{line:218,column:12},end:{line:218,column:59}},"29":{start:{line:244,column:12},end:{line:244,column:62}},"30":{start:{line:271,column:12},end:{line:271,column:71}},"31":{start:{line:300,column:12},end:{line:300,column:50}},"32":{start:{line:312,column:12},end:{line:312,column:56}},"33":{start:{line:337,column:12},end:{line:337,column:40}},"34":{start:{line:366,column:12},end:{line:366,column:51}},"35":{start:{line:397,column:12},end:{line:400,column:13}},"36":{start:{line:398,column:16},end:{line:398,column:37}},"37":{start:{line:399,column:16},end:{line:399,column:33}},"38":{start:{line:402,column:23},end:{line:402,column:53}},"39":{start:{line:403,column:12},end:{line:403,column:56}},"40":{start:{line:420,column:12},end:{line:423,column:13}},"41":{start:{line:421,column:16},end:{line:421,column:37}},"42":{start:{line:422,column:16},end:{line:422,column:33}},"43":{start:{line:424,column:22},end:{line:424,column:56}},"44":{start:{line:425,column:12},end:{line:425,column:43}},"45":{start:{line:453,column:12},end:{line:456,column:13}},"46":{start:{line:454,column:16},end:{line:454,column:37}},"47":{start:{line:455,column:16},end:{line:455,column:33}},"48":{start:{line:458,column:23},end:{line:458,column:53}},"49":{start:{line:459,column:12},end:{line:459,column:63}},"50":{start:{line:478,column:12},end:{line:478,column:49}},"51":{start:{line:480,column:23},end:{line:480,column:27}},"52":{start:{line:481,column:22},end:{line:497,column:14}},"53":{start:{line:482,column:16},end:{line:496,column:17}},"54":{start:{line:483,column:20},end:{line:483,column:34}},"55":{start:{line:486,column:35},end:{line:486,column:74}},"56":{start:{line:487,column:31},end:{line:487,column:60}},"57":{start:{line:488,column:20},end:{line:495,column:23}},"58":{start:{line:489,column:24},end:{line:494,column:25}},"59":{start:{line:490,column:28},end:{line:490,column:35}},"60":{start:{line:493,column:28},end:{line:493,column:60}},"61":{start:{line:499,column:12},end:{line:499,column:23}},"62":{start:{line:517,column:12},end:{line:517,column:49}},"63":{start:{line:519,column:29},end:{line:519,column:54}},"64":{start:{line:520,column:12},end:{line:520,column:46}},"65":{start:{line:544,column:12},end:{line:547,column:13}},"66":{start:{line:545,column:16},end:{line:545,column:34}},"67":{start:{line:546,column:16},end:{line:546,column:28}},"68":{start:{line:549,column:12},end:{line:549,column:49}},"69":{start:{line:550,column:12},end:{line:550,column:34}},"70":{start:{line:552,column:12},end:{line:552,column:29}},"71":{start:{line:554,column:12},end:{line:561,column:15}},"72":{start:{line:555,column:16},end:{line:560,column:17}},"73":{start:{line:556,column:20},end:{line:556,column:34}},"74":{start:{line:559,column:20},end:{line:559,column:50}},"75":{start:{line:581,column:12},end:{line:584,column:13}},"76":{start:{line:582,column:16},end:{line:582,column:33}},"77":{start:{line:583,column:16},end:{line:583,column:27}},"78":{start:{line:586,column:12},end:{line:586,column:49}},"79":{start:{line:587,column:25},end:{line:590,column:13}},"80":{start:{line:592,column:12},end:{line:600,column:15}},"81":{start:{line:593,column:16},end:{line:599,column:17}},"82":{start:{line:594,column:20},end:{line:594,column:34}},"83":{start:{line:597,column:34},end:{line:597,column:63}},"84":{start:{line:598,column:20},end:{line:598,column:50}},"85":{start:{line:625,column:12},end:{line:628,column:13}},"86":{start:{line:626,column:16},end:{line:626,column:34}},"87":{start:{line:627,column:16},end:{line:627,column:28}},"88":{start:{line:630,column:12},end:{line:630,column:49}},"89":{start:{line:631,column:12},end:{line:631,column:34}},"90":{start:{line:634,column:12},end:{line:636,column:13}},"91":{start:{line:635,column:16},end:{line:635,column:46}},"92":{start:{line:638,column:23},end:{line:638,column:45}},"93":{start:{line:639,column:25},end:{line:639,column:31}},"94":{start:{line:640,column:26},end:{line:640,column:56}},"95":{start:{line:641,column:23},end:{line:641,column:28}},"96":{start:{line:642,column:22},end:{line:642,column:28}},"97":{start:{line:643,column:23},end:{line:643,column:25}},"98":{start:{line:645,column:22},end:{line:660,column:13}},"99":{start:{line:653,column:20},end:{line:658,column:21}},"100":{start:{line:654,column:24},end:{line:654,column:38}},"101":{start:{line:657,column:24},end:{line:657,column:54}},"102":{start:{line:662,column:12},end:{line:662,column:23}},"103":{start:{line:674,column:4},end:{line:815,column:7}},"104":{start:{line:686,column:12},end:{line:688,column:13}},"105":{start:{line:687,column:16},end:{line:687,column:61}},"106":{start:{line:690,column:12},end:{line:692,column:13}},"107":{start:{line:691,column:16},end:{line:691,column:60}},"108":{start:{line:694,column:12},end:{line:694,column:35}},"109":{start:{line:695,column:12},end:{line:695,column:47}},"110":{start:{line:699,column:12},end:{line:699,column:53}},"111":{start:{line:700,column:12},end:{line:700,column:56}},"112":{start:{line:701,column:12},end:{line:701,column:54}},"113":{start:{line:702,column:12},end:{line:702,column:53}},"114":{start:{line:722,column:22},end:{line:722,column:40}},"115":{start:{line:726,column:12},end:{line:728,column:13}},"116":{start:{line:727,column:16},end:{line:727,column:42}},"117":{start:{line:730,column:12},end:{line:734,column:14}},"118":{start:{line:738,column:22},end:{line:738,column:40}},"119":{start:{line:742,column:12},end:{line:744,column:13}},"120":{start:{line:743,column:16},end:{line:743,column:42}},"121":{start:{line:746,column:12},end:{line:749,column:14}},"122":{start:{line:769,column:22},end:{line:769,column:40}},"123":{start:{line:773,column:12},end:{line:775,column:13}},"124":{start:{line:774,column:16},end:{line:774,column:42}},"125":{start:{line:777,column:12},end:{line:781,column:14}},"126":{start:{line:801,column:22},end:{line:801,column:40}},"127":{start:{line:805,column:12},end:{line:807,column:13}},"128":{start:{line:806,column:16},end:{line:806,column:42}},"129":{start:{line:809,column:12},end:{line:813,column:14}},"130":{start:{line:828,column:4},end:{line:916,column:7}},"131":{start:{line:844,column:27},end:{line:844,column:60}},"132":{start:{line:846,column:12},end:{line:846,column:43}},"133":{start:{line:847,column:12},end:{line:847,column:39}},"134":{start:{line:848,column:12},end:{line:848,column:34}},"135":{start:{line:849,column:12},end:{line:849,column:29}},"136":{start:{line:853,column:12},end:{line:853,column:60}},"137":{start:{line:854,column:12},end:{line:854,column:60}},"138":{start:{line:855,column:12},end:{line:855,column:65}},"139":{start:{line:856,column:12},end:{line:856,column:60}},"140":{start:{line:857,column:12},end:{line:857,column:59}},"141":{start:{line:866,column:12},end:{line:866,column:50}},"142":{start:{line:878,column:12},end:{line:878,column:48}},"143":{start:{line:879,column:12},end:{line:879,column:43}},"144":{start:{line:892,column:12},end:{line:892,column:50}},"145":{start:{line:903,column:12},end:{line:903,column:36}},"146":{start:{line:914,column:12},end:{line:914,column:31}},"147":{start:{line:929,column:4},end:{line:1238,column:7}},"148":{start:{line:954,column:12},end:{line:954,column:50}},"149":{start:{line:958,column:12},end:{line:958,column:58}},"150":{start:{line:959,column:12},end:{line:959,column:58}},"151":{start:{line:960,column:12},end:{line:960,column:59}},"152":{start:{line:961,column:12},end:{line:961,column:59}},"153":{start:{line:962,column:12},end:{line:962,column:59}},"154":{start:{line:963,column:12},end:{line:963,column:58}},"155":{start:{line:964,column:12},end:{line:964,column:56}},"156":{start:{line:965,column:12},end:{line:965,column:59}},"157":{start:{line:966,column:12},end:{line:966,column:60}},"158":{start:{line:967,column:12},end:{line:967,column:62}},"159":{start:{line:968,column:12},end:{line:968,column:59}},"160":{start:{line:969,column:12},end:{line:969,column:60}},"161":{start:{line:970,column:12},end:{line:970,column:59}},"162":{start:{line:973,column:12},end:{line:973,column:34}},"163":{start:{line:974,column:12},end:{line:974,column:34}},"164":{start:{line:975,column:12},end:{line:975,column:34}},"165":{start:{line:976,column:12},end:{line:976,column:34}},"166":{start:{line:988,column:12},end:{line:988,column:80}},"167":{start:{line:992,column:12},end:{line:997,column:14}},"168":{start:{line:999,column:12},end:{line:999,column:36}},"169":{start:{line:1002,column:12},end:{line:1002,column:58}},"170":{start:{line:1003,column:12},end:{line:1003,column:74}},"171":{start:{line:1004,column:12},end:{line:1004,column:58}},"172":{start:{line:1005,column:12},end:{line:1005,column:58}},"173":{start:{line:1006,column:12},end:{line:1006,column:60}},"174":{start:{line:1007,column:12},end:{line:1007,column:60}},"175":{start:{line:1008,column:12},end:{line:1008,column:60}},"176":{start:{line:1020,column:12},end:{line:1020,column:32}},"177":{start:{line:1032,column:12},end:{line:1032,column:29}},"178":{start:{line:1044,column:12},end:{line:1044,column:31}},"179":{start:{line:1055,column:12},end:{line:1055,column:32}},"180":{start:{line:1066,column:12},end:{line:1066,column:33}},"181":{start:{line:1077,column:12},end:{line:1077,column:35}},"182":{start:{line:1096,column:12},end:{line:1099,column:13}},"183":{start:{line:1097,column:16},end:{line:1097,column:35}},"184":{start:{line:1098,column:16},end:{line:1098,column:29}},"185":{start:{line:1100,column:12},end:{line:1100,column:49}},"186":{start:{line:1102,column:12},end:{line:1102,column:36}},"187":{start:{line:1104,column:23},end:{line:1104,column:27}},"188":{start:{line:1105,column:12},end:{line:1113,column:15}},"189":{start:{line:1106,column:16},end:{line:1112,column:17}},"190":{start:{line:1107,column:20},end:{line:1107,column:34}},"191":{start:{line:1110,column:20},end:{line:1110,column:75}},"192":{start:{line:1111,column:20},end:{line:1111,column:41}},"193":{start:{line:1125,column:12},end:{line:1125,column:49}},"194":{start:{line:1127,column:23},end:{line:1127,column:27}},"195":{start:{line:1128,column:12},end:{line:1130,column:15}},"196":{start:{line:1129,column:16},end:{line:1129,column:30}},"197":{start:{line:1143,column:12},end:{line:1143,column:49}},"198":{start:{line:1145,column:12},end:{line:1147,column:13}},"199":{start:{line:1146,column:16},end:{line:1146,column:71}},"200":{start:{line:1149,column:23},end:{line:1149,column:27}},"201":{start:{line:1150,column:22},end:{line:1168,column:14}},"202":{start:{line:1151,column:16},end:{line:1167,column:17}},"203":{start:{line:1152,column:20},end:{line:1152,column:52}},"204":{start:{line:1153,column:20},end:{line:1153,column:40}},"205":{start:{line:1155,column:21},end:{line:1167,column:17}},"206":{start:{line:1156,column:20},end:{line:1163,column:23}},"207":{start:{line:1157,column:24},end:{line:1162,column:25}},"208":{start:{line:1158,column:28},end:{line:1158,column:35}},"209":{start:{line:1161,column:28},end:{line:1161,column:60}},"210":{start:{line:1166,column:20},end:{line:1166,column:40}},"211":{start:{line:1170,column:12},end:{line:1170,column:23}},"212":{start:{line:1182,column:12},end:{line:1182,column:49}},"213":{start:{line:1184,column:23},end:{line:1184,column:27}},"214":{start:{line:1185,column:12},end:{line:1192,column:15}},"215":{start:{line:1186,column:16},end:{line:1191,column:17}},"216":{start:{line:1187,column:20},end:{line:1187,column:34}},"217":{start:{line:1190,column:20},end:{line:1190,column:41}},"218":{start:{line:1204,column:12},end:{line:1204,column:49}},"219":{start:{line:1206,column:23},end:{line:1206,column:27}},"220":{start:{line:1207,column:12},end:{line:1214,column:15}},"221":{start:{line:1208,column:16},end:{line:1213,column:17}},"222":{start:{line:1209,column:20},end:{line:1209,column:34}},"223":{start:{line:1212,column:20},end:{line:1212,column:41}},"224":{start:{line:1226,column:12},end:{line:1226,column:49}},"225":{start:{line:1228,column:23},end:{line:1228,column:27}},"226":{start:{line:1229,column:12},end:{line:1236,column:15}},"227":{start:{line:1230,column:16},end:{line:1235,column:17}},"228":{start:{line:1231,column:20},end:{line:1231,column:34}},"229":{start:{line:1234,column:20},end:{line:1234,column:41}},"230":{start:{line:1248,column:4},end:{line:1579,column:7}},"231":{start:{line:1273,column:12},end:{line:1273,column:50}},"232":{start:{line:1277,column:12},end:{line:1277,column:66}},"233":{start:{line:1278,column:12},end:{line:1278,column:66}},"234":{start:{line:1279,column:12},end:{line:1279,column:67}},"235":{start:{line:1280,column:12},end:{line:1280,column:65}},"236":{start:{line:1281,column:12},end:{line:1281,column:65}},"237":{start:{line:1282,column:12},end:{line:1282,column:78}},"238":{start:{line:1285,column:12},end:{line:1285,column:38}},"239":{start:{line:1286,column:12},end:{line:1286,column:38}},"240":{start:{line:1287,column:12},end:{line:1287,column:38}},"241":{start:{line:1288,column:12},end:{line:1288,column:38}},"242":{start:{line:1289,column:12},end:{line:1289,column:38}},"243":{start:{line:1301,column:12},end:{line:1301,column:50}},"244":{start:{line:1314,column:12},end:{line:1314,column:36}},"245":{start:{line:1316,column:27},end:{line:1316,column:29}},"246":{start:{line:1317,column:33},end:{line:1317,column:35}},"247":{start:{line:1318,column:37},end:{line:1318,column:59}},"248":{start:{line:1319,column:12},end:{line:1331,column:13}},"249":{start:{line:1319,column:24},end:{line:1319,column:25}},"250":{start:{line:1320,column:28},end:{line:1320,column:49}},"251":{start:{line:1321,column:29},end:{line:1321,column:58}},"252":{start:{line:1322,column:16},end:{line:1322,column:36}},"253":{start:{line:1323,column:16},end:{line:1323,column:38}},"254":{start:{line:1325,column:16},end:{line:1330,column:17}},"255":{start:{line:1326,column:20},end:{line:1326,column:61}},"256":{start:{line:1329,column:20},end:{line:1329,column:59}},"257":{start:{line:1332,column:12},end:{line:1332,column:44}},"258":{start:{line:1333,column:12},end:{line:1333,column:50}},"259":{start:{line:1334,column:12},end:{line:1334,column:62}},"260":{start:{line:1335,column:12},end:{line:1335,column:62}},"261":{start:{line:1336,column:12},end:{line:1336,column:64}},"262":{start:{line:1348,column:12},end:{line:1348,column:31}},"263":{start:{line:1359,column:12},end:{line:1359,column:32}},"264":{start:{line:1370,column:12},end:{line:1370,column:33}},"265":{start:{line:1389,column:12},end:{line:1392,column:13}},"266":{start:{line:1390,column:16},end:{line:1390,column:35}},"267":{start:{line:1391,column:16},end:{line:1391,column:29}},"268":{start:{line:1393,column:12},end:{line:1393,column:49}},"269":{start:{line:1395,column:12},end:{line:1395,column:36}},"270":{start:{line:1396,column:12},end:{line:1398,column:13}},"271":{start:{line:1397,column:16},end:{line:1397,column:34}},"272":{start:{line:1400,column:23},end:{line:1400,column:27}},"273":{start:{line:1401,column:22},end:{line:1409,column:14}},"274":{start:{line:1402,column:16},end:{line:1408,column:17}},"275":{start:{line:1403,column:20},end:{line:1403,column:34}},"276":{start:{line:1406,column:20},end:{line:1406,column:46}},"277":{start:{line:1407,column:20},end:{line:1407,column:41}},"278":{start:{line:1411,column:12},end:{line:1411,column:23}},"279":{start:{line:1415,column:12},end:{line:1415,column:36}},"280":{start:{line:1416,column:12},end:{line:1418,column:13}},"281":{start:{line:1417,column:16},end:{line:1417,column:34}},"282":{start:{line:1420,column:23},end:{line:1420,column:27}},"283":{start:{line:1421,column:27},end:{line:1421,column:57}},"284":{start:{line:1423,column:12},end:{line:1423,column:38}},"285":{start:{line:1424,column:12},end:{line:1424,column:24}},"286":{start:{line:1449,column:12},end:{line:1451,column:13}},"287":{start:{line:1450,column:16},end:{line:1450,column:33}},"288":{start:{line:1453,column:12},end:{line:1455,column:13}},"289":{start:{line:1454,column:16},end:{line:1454,column:64}},"290":{start:{line:1457,column:12},end:{line:1459,column:13}},"291":{start:{line:1458,column:16},end:{line:1458,column:136}},"292":{start:{line:1461,column:27},end:{line:1461,column:31}},"293":{start:{line:1462,column:12},end:{line:1504,column:13}},"294":{start:{line:1463,column:31},end:{line:1463,column:55}},"295":{start:{line:1465,column:16},end:{line:1500,column:17}},"296":{start:{line:1470,column:20},end:{line:1470,column:39}},"297":{start:{line:1472,column:21},end:{line:1500,column:17}},"298":{start:{line:1476,column:20},end:{line:1476,column:84}},"299":{start:{line:1477,column:20},end:{line:1482,column:21}},"300":{start:{line:1478,column:24},end:{line:1478,column:43}},"301":{start:{line:1481,column:24},end:{line:1481,column:36}},"302":{start:{line:1484,column:21},end:{line:1500,column:17}},"303":{start:{line:1488,column:20},end:{line:1488,column:77}},"304":{start:{line:1493,column:20},end:{line:1499,column:21}},"305":{start:{line:1493,column:32},end:{line:1493,column:33}},"306":{start:{line:1494,column:37},end:{line:1494,column:48}},"307":{start:{line:1495,column:24},end:{line:1495,column:88}},"308":{start:{line:1496,column:24},end:{line:1498,column:25}},"309":{start:{line:1497,column:28},end:{line:1497,column:42}},"310":{start:{line:1503,column:16},end:{line:1503,column:28}},"311":{start:{line:1525,column:12},end:{line:1525,column:49}},"312":{start:{line:1526,column:23},end:{line:1526,column:27}},"313":{start:{line:1527,column:22},end:{line:1554,column:14}},"314":{start:{line:1528,column:16},end:{line:1553,column:17}},"315":{start:{line:1529,column:20},end:{line:1529,column:34}},"316":{start:{line:1532,column:32},end:{line:1532,column:51}},"317":{start:{line:1533,column:20},end:{line:1535,column:21}},"318":{start:{line:1534,column:24},end:{line:1534,column:41}},"319":{start:{line:1537,column:33},end:{line:1537,column:62}},"320":{start:{line:1538,column:20},end:{line:1538,column:40}},"321":{start:{line:1540,column:20},end:{line:1552,column:21}},"322":{start:{line:1541,column:24},end:{line:1548,column:27}},"323":{start:{line:1542,column:28},end:{line:1547,column:29}},"324":{start:{line:1543,column:32},end:{line:1543,column:39}},"325":{start:{line:1546,column:32},end:{line:1546,column:64}},"326":{start:{line:1551,column:24},end:{line:1551,column:47}},"327":{start:{line:1556,column:12},end:{line:1556,column:23}},"328":{start:{line:1575,column:12},end:{line:1575,column:49}},"329":{start:{line:1577,column:12},end:{line:1577,column:47}},"330":{start:{line:1589,column:4},end:{line:1843,column:7}},"331":{start:{line:1596,column:12},end:{line:1596,column:77}},"332":{start:{line:1614,column:12},end:{line:1614,column:29}},"333":{start:{line:1615,column:12},end:{line:1615,column:57}},"334":{start:{line:1617,column:12},end:{line:1617,column:67}},"335":{start:{line:1618,column:12},end:{line:1618,column:64}},"336":{start:{line:1619,column:12},end:{line:1619,column:63}},"337":{start:{line:1620,column:12},end:{line:1620,column:68}},"338":{start:{line:1637,column:12},end:{line:1637,column:78}},"339":{start:{line:1657,column:12},end:{line:1657,column:49}},"340":{start:{line:1659,column:23},end:{line:1659,column:27}},"341":{start:{line:1660,column:22},end:{line:1662,column:14}},"342":{start:{line:1661,column:16},end:{line:1661,column:36}},"343":{start:{line:1664,column:12},end:{line:1664,column:23}},"344":{start:{line:1689,column:12},end:{line:1692,column:13}},"345":{start:{line:1690,column:16},end:{line:1690,column:35}},"346":{start:{line:1691,column:16},end:{line:1691,column:29}},"347":{start:{line:1694,column:12},end:{line:1694,column:49}},"348":{start:{line:1695,column:12},end:{line:1695,column:36}},"349":{start:{line:1697,column:23},end:{line:1697,column:27}},"350":{start:{line:1698,column:22},end:{line:1708,column:14}},"351":{start:{line:1699,column:16},end:{line:1702,column:17}},"352":{start:{line:1700,column:20},end:{line:1700,column:34}},"353":{start:{line:1701,column:20},end:{line:1701,column:27}},"354":{start:{line:1704,column:26},end:{line:1704,column:43}},"355":{start:{line:1705,column:26},end:{line:1705,column:73}},"356":{start:{line:1707,column:16},end:{line:1707,column:42}},"357":{start:{line:1710,column:12},end:{line:1710,column:23}},"358":{start:{line:1726,column:12},end:{line:1726,column:69}},"359":{start:{line:1749,column:12},end:{line:1752,column:13}},"360":{start:{line:1750,column:16},end:{line:1750,column:35}},"361":{start:{line:1751,column:16},end:{line:1751,column:29}},"362":{start:{line:1754,column:12},end:{line:1754,column:49}},"363":{start:{line:1755,column:12},end:{line:1755,column:36}},"364":{start:{line:1757,column:23},end:{line:1757,column:27}},"365":{start:{line:1758,column:12},end:{line:1776,column:15}},"366":{start:{line:1759,column:16},end:{line:1762,column:17}},"367":{start:{line:1760,column:20},end:{line:1760,column:34}},"368":{start:{line:1761,column:20},end:{line:1761,column:27}},"369":{start:{line:1764,column:27},end:{line:1764,column:29}},"370":{start:{line:1765,column:27},end:{line:1765,column:52}},"371":{start:{line:1766,column:16},end:{line:1773,column:17}},"372":{start:{line:1766,column:28},end:{line:1766,column:29}},"373":{start:{line:1767,column:34},end:{line:1767,column:56}},"374":{start:{line:1768,column:36},end:{line:1768,column:74}},"375":{start:{line:1769,column:30},end:{line:1769,column:81}},"376":{start:{line:1771,column:20},end:{line:1771,column:39}},"377":{start:{line:1772,column:20},end:{line:1772,column:35}},"378":{start:{line:1775,column:16},end:{line:1775,column:43}},"379":{start:{line:1795,column:12},end:{line:1795,column:49}},"380":{start:{line:1797,column:23},end:{line:1797,column:27}},"381":{start:{line:1798,column:12},end:{line:1800,column:15}},"382":{start:{line:1799,column:16},end:{line:1799,column:65}},"383":{start:{line:1816,column:12},end:{line:1816,column:34}},"384":{start:{line:1818,column:12},end:{line:1841,column:13}},"385":{start:{line:1819,column:29},end:{line:1819,column:40}},"386":{start:{line:1820,column:26},end:{line:1835,column:18}},"387":{start:{line:1821,column:20},end:{line:1834,column:21}},"388":{start:{line:1822,column:24},end:{line:1822,column:38}},"389":{start:{line:1825,column:24},end:{line:1825,column:67}},"390":{start:{line:1826,column:24},end:{line:1833,column:27}},"391":{start:{line:1827,column:28},end:{line:1832,column:29}},"392":{start:{line:1828,column:32},end:{line:1828,column:39}},"393":{start:{line:1831,column:32},end:{line:1831,column:64}},"394":{start:{line:1837,column:16},end:{line:1837,column:27}},"395":{start:{line:1840,column:16},end:{line:1840,column:53}},"396":{start:{line:1854,column:4},end:{line:1893,column:7}},"397":{start:{line:1861,column:12},end:{line:1861,column:39}},"398":{start:{line:1873,column:34},end:{line:1873,column:70}},"399":{start:{line:1874,column:12},end:{line:1874,column:83}},"400":{start:{line:1891,column:12},end:{line:1891,column:57}},"401":{start:{line:1903,column:4},end:{line:1931,column:7}},"402":{start:{line:1910,column:12},end:{line:1910,column:80}},"403":{start:{line:1928,column:12},end:{line:1928,column:29}},"404":{start:{line:1929,column:12},end:{line:1929,column:57}},"405":{start:{line:1941,column:4},end:{line:1991,column:7}},"406":{start:{line:1957,column:12},end:{line:1957,column:42}},"407":{start:{line:1971,column:34},end:{line:1971,column:70}},"408":{start:{line:1972,column:12},end:{line:1972,column:87}},"409":{start:{line:1989,column:12},end:{line:1989,column:57}},"410":{start:{line:2002,column:4},end:{line:2143,column:7}},"411":{start:{line:2009,column:12},end:{line:2009,column:75}},"412":{start:{line:2021,column:12},end:{line:2021,column:51}},"413":{start:{line:2031,column:12},end:{line:2031,column:56}},"414":{start:{line:2045,column:12},end:{line:2045,column:51}},"415":{start:{line:2057,column:12},end:{line:2057,column:70}},"416":{start:{line:2067,column:12},end:{line:2067,column:62}},"417":{start:{line:2078,column:12},end:{line:2078,column:66}},"418":{start:{line:2088,column:12},end:{line:2088,column:49}},"419":{start:{line:2098,column:12},end:{line:2098,column:58}},"420":{start:{line:2110,column:12},end:{line:2110,column:67}},"421":{start:{line:2122,column:12},end:{line:2122,column:74}},"422":{start:{line:2140,column:12},end:{line:2140,column:29}},"423":{start:{line:2141,column:12},end:{line:2141,column:57}},"424":{start:{line:2154,column:4},end:{line:2243,column:7}},"425":{start:{line:2161,column:12},end:{line:2161,column:75}},"426":{start:{line:2173,column:12},end:{line:2173,column:78}},"427":{start:{line:2194,column:12},end:{line:2197,column:13}},"428":{start:{line:2195,column:16},end:{line:2195,column:35}},"429":{start:{line:2196,column:16},end:{line:2196,column:29}},"430":{start:{line:2199,column:12},end:{line:2199,column:49}},"431":{start:{line:2200,column:12},end:{line:2200,column:36}},"432":{start:{line:2202,column:23},end:{line:2202,column:27}},"433":{start:{line:2203,column:12},end:{line:2220,column:15}},"434":{start:{line:2204,column:16},end:{line:2207,column:17}},"435":{start:{line:2205,column:20},end:{line:2205,column:34}},"436":{start:{line:2206,column:20},end:{line:2206,column:27}},"437":{start:{line:2209,column:34},end:{line:2209,column:36}},"438":{start:{line:2210,column:27},end:{line:2210,column:52}},"439":{start:{line:2211,column:16},end:{line:2217,column:17}},"440":{start:{line:2211,column:29},end:{line:2211,column:30}},"441":{start:{line:2212,column:41},end:{line:2212,column:63}},"442":{start:{line:2213,column:36},end:{line:2213,column:81}},"443":{start:{line:2214,column:37},end:{line:2214,column:102}},"444":{start:{line:2215,column:20},end:{line:2215,column:53}},"445":{start:{line:2216,column:20},end:{line:2216,column:49}},"446":{start:{line:2219,column:16},end:{line:2219,column:50}},"447":{start:{line:2238,column:12},end:{line:2238,column:29}},"448":{start:{line:2239,column:12},end:{line:2239,column:57}},"449":{start:{line:2241,column:12},end:{line:2241,column:52}},"450":{start:{line:2255,column:4},end:{line:2306,column:7}},"451":{start:{line:2262,column:12},end:{line:2262,column:37}},"452":{start:{line:2274,column:34},end:{line:2274,column:70}},"453":{start:{line:2275,column:12},end:{line:2275,column:87}},"454":{start:{line:2284,column:12},end:{line:2284,column:95}},"455":{start:{line:2301,column:12},end:{line:2301,column:57}},"456":{start:{line:2303,column:12},end:{line:2303,column:78}},"457":{start:{line:2304,column:12},end:{line:2304,column:56}},"458":{start:{line:2316,column:4},end:{line:2409,column:7}},"459":{start:{line:2331,column:12},end:{line:2331,column:68}},"460":{start:{line:2345,column:12},end:{line:2345,column:29}},"461":{start:{line:2346,column:12},end:{line:2346,column:50}},"462":{start:{line:2348,column:12},end:{line:2348,column:63}},"463":{start:{line:2349,column:12},end:{line:2349,column:64}},"464":{start:{line:2368,column:12},end:{line:2368,column:49}},"465":{start:{line:2370,column:23},end:{line:2370,column:27}},"466":{start:{line:2371,column:12},end:{line:2378,column:15}},"467":{start:{line:2372,column:16},end:{line:2377,column:17}},"468":{start:{line:2373,column:20},end:{line:2373,column:34}},"469":{start:{line:2376,column:20},end:{line:2376,column:70}},"470":{start:{line:2397,column:12},end:{line:2397,column:49}},"471":{start:{line:2399,column:23},end:{line:2399,column:27}},"472":{start:{line:2400,column:12},end:{line:2407,column:15}},"473":{start:{line:2401,column:16},end:{line:2406,column:17}},"474":{start:{line:2402,column:20},end:{line:2402,column:34}},"475":{start:{line:2405,column:20},end:{line:2405,column:70}},"476":{start:{line:2419,column:4},end:{line:2462,column:7}},"477":{start:{line:2435,column:12},end:{line:2435,column:30}},"478":{start:{line:2447,column:12},end:{line:2447,column:70}},"479":{start:{line:2460,column:12},end:{line:2460,column:50}},"480":{start:{line:2471,column:4},end:{line:2494,column:7}},"481":{start:{line:2478,column:12},end:{line:2478,column:30}},"482":{start:{line:2491,column:12},end:{line:2491,column:38}},"483":{start:{line:2492,column:12},end:{line:2492,column:50}},"484":{start:{line:2504,column:4},end:{line:2528,column:7}},"485":{start:{line:2511,column:12},end:{line:2511,column:69}},"486":{start:{line:2525,column:12},end:{line:2525,column:29}},"487":{start:{line:2526,column:12},end:{line:2526,column:50}},"488":{start:{line:2538,column:4},end:{line:2618,column:7}},"489":{start:{line:2554,column:12},end:{line:2554,column:31}},"490":{start:{line:2566,column:12},end:{line:2566,column:63}},"491":{start:{line:2579,column:12},end:{line:2579,column:50}},"492":{start:{line:2593,column:12},end:{line:2593,column:49}},"493":{start:{line:2595,column:23},end:{line:2595,column:27}},"494":{start:{line:2596,column:22},end:{line:2614,column:14}},"495":{start:{line:2597,column:16},end:{line:2613,column:17}},"496":{start:{line:2598,column:20},end:{line:2598,column:34}},"497":{start:{line:2602,column:32},end:{line:2602,column:51}},"498":{start:{line:2604,column:33},end:{line:2604,column:62}},"499":{start:{line:2605,column:20},end:{line:2612,column:23}},"500":{start:{line:2606,column:24},end:{line:2611,column:25}},"501":{start:{line:2607,column:28},end:{line:2607,column:35}},"502":{start:{line:2610,column:28},end:{line:2610,column:60}},"503":{start:{line:2616,column:12},end:{line:2616,column:23}},"504":{start:{line:2628,column:4},end:{line:2656,column:7}},"505":{start:{line:2635,column:12},end:{line:2635,column:69}},"506":{start:{line:2653,column:12},end:{line:2653,column:29}},"507":{start:{line:2654,column:12},end:{line:2654,column:57}},"508":{start:{line:2666,column:4},end:{line:2705,column:7}},"509":{start:{line:2673,column:12},end:{line:2673,column:31}},"510":{start:{line:2685,column:34},end:{line:2685,column:70}},"511":{start:{line:2686,column:12},end:{line:2686,column:76}},"512":{start:{line:2703,column:12},end:{line:2703,column:57}},"513":{start:{line:2714,column:4},end:{line:2792,column:7}},"514":{start:{line:2721,column:12},end:{line:2721,column:71}},"515":{start:{line:2739,column:12},end:{line:2739,column:29}},"516":{start:{line:2740,column:12},end:{line:2740,column:57}},"517":{start:{line:2742,column:12},end:{line:2742,column:66}},"518":{start:{line:2767,column:12},end:{line:2770,column:13}},"519":{start:{line:2768,column:16},end:{line:2768,column:34}},"520":{start:{line:2769,column:16},end:{line:2769,column:28}},"521":{start:{line:2772,column:12},end:{line:2772,column:49}},"522":{start:{line:2773,column:12},end:{line:2773,column:34}},"523":{start:{line:2776,column:12},end:{line:2776,column:40}},"524":{start:{line:2778,column:23},end:{line:2778,column:27}},"525":{start:{line:2779,column:12},end:{line:2781,column:15}},"526":{start:{line:2780,column:16},end:{line:2780,column:44}},"527":{start:{line:2785,column:12},end:{line:2790,column:13}},"528":{start:{line:2786,column:16},end:{line:2786,column:75}},"529":{start:{line:2789,column:16},end:{line:2789,column:45}},"530":{start:{line:2802,column:4},end:{line:2873,column:7}},"531":{start:{line:2809,column:12},end:{line:2809,column:33}},"532":{start:{line:2821,column:34},end:{line:2821,column:70}},"533":{start:{line:2822,column:12},end:{line:2822,column:77}},"534":{start:{line:2839,column:12},end:{line:2839,column:57}},"535":{start:{line:2862,column:12},end:{line:2866,column:13}},"536":{start:{line:2863,column:16},end:{line:2863,column:34}},"537":{start:{line:2864,column:16},end:{line:2864,column:30}},"538":{start:{line:2865,column:16},end:{line:2865,column:35}},"539":{start:{line:2868,column:12},end:{line:2868,column:34}},"540":{start:{line:2869,column:12},end:{line:2869,column:34}},"541":{start:{line:2871,column:12},end:{line:2871,column:49}},"542":{start:{line:2883,column:4},end:{line:2914,column:7}},"543":{start:{line:2890,column:23},end:{line:2890,column:67}},"544":{start:{line:2891,column:12},end:{line:2891,column:116}},"545":{start:{line:2910,column:12},end:{line:2910,column:29}},"546":{start:{line:2911,column:12},end:{line:2911,column:29}},"547":{start:{line:2912,column:12},end:{line:2912,column:57}},"548":{start:{line:2925,column:4},end:{line:3017,column:7}},"549":{start:{line:2932,column:12},end:{line:2932,column:83}},"550":{start:{line:2946,column:12},end:{line:2946,column:100}},"551":{start:{line:2958,column:34},end:{line:2958,column:70}},"552":{start:{line:2959,column:12},end:{line:2959,column:102}},"553":{start:{line:2977,column:12},end:{line:2977,column:29}},"554":{start:{line:2978,column:12},end:{line:2978,column:57}},"555":{start:{line:3001,column:12},end:{line:3005,column:13}},"556":{start:{line:3002,column:16},end:{line:3002,column:34}},"557":{start:{line:3003,column:16},end:{line:3003,column:36}},"558":{start:{line:3004,column:16},end:{line:3004,column:41}},"559":{start:{line:3007,column:12},end:{line:3010,column:13}},"560":{start:{line:3008,column:16},end:{line:3008,column:34}},"561":{start:{line:3009,column:16},end:{line:3009,column:28}},"562":{start:{line:3012,column:12},end:{line:3012,column:34}},"563":{start:{line:3013,column:12},end:{line:3013,column:40}},"564":{start:{line:3015,column:12},end:{line:3015,column:49}},"565":{start:{line:3027,column:4},end:{line:3213,column:7}},"566":{start:{line:3043,column:12},end:{line:3043,column:36}},"567":{start:{line:3055,column:12},end:{line:3055,column:88}},"568":{start:{line:3072,column:12},end:{line:3074,column:13}},"569":{start:{line:3073,column:16},end:{line:3073,column:84}},"570":{start:{line:3076,column:12},end:{line:3076,column:57}},"571":{start:{line:3098,column:12},end:{line:3100,column:13}},"572":{start:{line:3099,column:16},end:{line:3099,column:46}},"573":{start:{line:3102,column:12},end:{line:3102,column:49}},"574":{start:{line:3104,column:23},end:{line:3104,column:27}},"575":{start:{line:3105,column:22},end:{line:3120,column:14}},"576":{start:{line:3106,column:16},end:{line:3119,column:17}},"577":{start:{line:3107,column:20},end:{line:3107,column:34}},"578":{start:{line:3110,column:33},end:{line:3110,column:83}},"579":{start:{line:3111,column:20},end:{line:3118,column:23}},"580":{start:{line:3112,column:24},end:{line:3117,column:25}},"581":{start:{line:3113,column:28},end:{line:3113,column:35}},"582":{start:{line:3116,column:28},end:{line:3116,column:60}},"583":{start:{line:3122,column:12},end:{line:3122,column:23}},"584":{start:{line:3126,column:12},end:{line:3150,column:13}},"585":{start:{line:3127,column:27},end:{line:3127,column:31}},"586":{start:{line:3130,column:31},end:{line:3130,column:73}},"587":{start:{line:3133,column:28},end:{line:3133,column:83}},"588":{start:{line:3133,column:63},end:{line:3133,column:82}},"589":{start:{line:3136,column:16},end:{line:3138,column:17}},"590":{start:{line:3137,column:20},end:{line:3137,column:113}},"591":{start:{line:3141,column:40},end:{line:3141,column:90}},"592":{start:{line:3144,column:34},end:{line:3144,column:68}},"593":{start:{line:3146,column:16},end:{line:3146,column:43}},"594":{start:{line:3149,column:16},end:{line:3149,column:72}},"595":{start:{line:3154,column:12},end:{line:3168,column:13}},"596":{start:{line:3157,column:36},end:{line:3157,column:53}},"597":{start:{line:3159,column:16},end:{line:3164,column:17}},"598":{start:{line:3160,column:20},end:{line:3160,column:115}},"599":{start:{line:3163,column:20},end:{line:3163,column:51}},"600":{start:{line:3167,column:16},end:{line:3167,column:72}},"601":{start:{line:3172,column:12},end:{line:3172,column:49}},"602":{start:{line:3173,column:23},end:{line:3173,column:27}},"603":{start:{line:3176,column:40},end:{line:3176,column:74}},"604":{start:{line:3177,column:29},end:{line:3177,column:55}},"605":{start:{line:3180,column:12},end:{line:3189,column:13}},"606":{start:{line:3181,column:16},end:{line:3181,column:51}},"607":{start:{line:3182,column:16},end:{line:3182,column:68}},"608":{start:{line:3184,column:16},end:{line:3185,column:95}},"609":{start:{line:3185,column:38},end:{line:3185,column:92}},"610":{start:{line:3187,column:16},end:{line:3187,column:82}},"611":{start:{line:3188,column:16},end:{line:3188,column:57}},"612":{start:{line:3192,column:42},end:{line:3192,column:88}},"613":{start:{line:3193,column:31},end:{line:3193,column:61}},"614":{start:{line:3196,column:12},end:{line:3211,column:13}},"615":{start:{line:3197,column:16},end:{line:3197,column:53}},"616":{start:{line:3198,column:16},end:{line:3198,column:70}},"617":{start:{line:3200,column:16},end:{line:3203,column:19}},"618":{start:{line:3201,column:20},end:{line:3201,column:75}},"619":{start:{line:3202,column:20},end:{line:3202,column:31}},"620":{start:{line:3207,column:16},end:{line:3210,column:19}},"621":{start:{line:3208,column:20},end:{line:3208,column:75}},"622":{start:{line:3209,column:20},end:{line:3209,column:31}},"623":{start:{line:3223,column:4},end:{line:3814,column:7}},"624":{start:{line:3230,column:12},end:{line:3230,column:68}},"625":{start:{line:3248,column:12},end:{line:3248,column:28}},"626":{start:{line:3249,column:12},end:{line:3249,column:57}},"627":{start:{line:3250,column:12},end:{line:3250,column:27}},"628":{start:{line:3254,column:12},end:{line:3254,column:64}},"629":{start:{line:3255,column:12},end:{line:3255,column:72}},"630":{start:{line:3256,column:12},end:{line:3256,column:71}},"631":{start:{line:3257,column:12},end:{line:3257,column:64}},"632":{start:{line:3258,column:12},end:{line:3258,column:66}},"633":{start:{line:3259,column:12},end:{line:3259,column:63}},"634":{start:{line:3260,column:12},end:{line:3260,column:65}},"635":{start:{line:3261,column:12},end:{line:3261,column:65}},"636":{start:{line:3262,column:12},end:{line:3262,column:67}},"637":{start:{line:3263,column:12},end:{line:3263,column:69}},"638":{start:{line:3264,column:12},end:{line:3264,column:64}},"639":{start:{line:3265,column:12},end:{line:3265,column:65}},"640":{start:{line:3266,column:12},end:{line:3266,column:66}},"641":{start:{line:3267,column:12},end:{line:3267,column:63}},"642":{start:{line:3268,column:12},end:{line:3268,column:65}},"643":{start:{line:3287,column:22},end:{line:3287,column:72}},"644":{start:{line:3289,column:12},end:{line:3289,column:23}},"645":{start:{line:3308,column:12},end:{line:3308,column:49}},"646":{start:{line:3310,column:23},end:{line:3310,column:27}},"647":{start:{line:3311,column:22},end:{line:3313,column:14}},"648":{start:{line:3312,column:16},end:{line:3312,column:36}},"649":{start:{line:3315,column:12},end:{line:3315,column:23}},"650":{start:{line:3334,column:12},end:{line:3334,column:49}},"651":{start:{line:3336,column:23},end:{line:3336,column:27}},"652":{start:{line:3337,column:22},end:{line:3339,column:14}},"653":{start:{line:3338,column:16},end:{line:3338,column:36}},"654":{start:{line:3341,column:12},end:{line:3341,column:23}},"655":{start:{line:3361,column:12},end:{line:3361,column:49}},"656":{start:{line:3362,column:12},end:{line:3362,column:34}},"657":{start:{line:3363,column:12},end:{line:3363,column:67}},"658":{start:{line:3365,column:23},end:{line:3365,column:27}},"659":{start:{line:3366,column:12},end:{line:3373,column:15}},"660":{start:{line:3367,column:16},end:{line:3372,column:17}},"661":{start:{line:3368,column:20},end:{line:3368,column:34}},"662":{start:{line:3371,column:20},end:{line:3371,column:56}},"663":{start:{line:3392,column:12},end:{line:3392,column:49}},"664":{start:{line:3394,column:23},end:{line:3394,column:27}},"665":{start:{line:3395,column:22},end:{line:3397,column:14}},"666":{start:{line:3396,column:16},end:{line:3396,column:36}},"667":{start:{line:3399,column:12},end:{line:3399,column:23}},"668":{start:{line:3414,column:12},end:{line:3414,column:74}},"669":{start:{line:3433,column:12},end:{line:3433,column:49}},"670":{start:{line:3435,column:23},end:{line:3435,column:27}},"671":{start:{line:3436,column:22},end:{line:3438,column:14}},"672":{start:{line:3437,column:16},end:{line:3437,column:36}},"673":{start:{line:3440,column:12},end:{line:3440,column:23}},"674":{start:{line:3460,column:12},end:{line:3460,column:49}},"675":{start:{line:3461,column:12},end:{line:3461,column:34}},"676":{start:{line:3462,column:12},end:{line:3462,column:67}},"677":{start:{line:3464,column:23},end:{line:3464,column:27}},"678":{start:{line:3465,column:12},end:{line:3472,column:15}},"679":{start:{line:3466,column:16},end:{line:3471,column:17}},"680":{start:{line:3467,column:20},end:{line:3467,column:34}},"681":{start:{line:3470,column:20},end:{line:3470,column:56}},"682":{start:{line:3497,column:12},end:{line:3497,column:49}},"683":{start:{line:3498,column:12},end:{line:3498,column:34}},"684":{start:{line:3499,column:12},end:{line:3499,column:67}},"685":{start:{line:3501,column:23},end:{line:3501,column:27}},"686":{start:{line:3502,column:12},end:{line:3509,column:15}},"687":{start:{line:3503,column:16},end:{line:3508,column:17}},"688":{start:{line:3504,column:20},end:{line:3504,column:34}},"689":{start:{line:3507,column:20},end:{line:3507,column:56}},"690":{start:{line:3528,column:12},end:{line:3528,column:49}},"691":{start:{line:3530,column:23},end:{line:3530,column:27}},"692":{start:{line:3531,column:12},end:{line:3538,column:15}},"693":{start:{line:3532,column:16},end:{line:3537,column:17}},"694":{start:{line:3533,column:20},end:{line:3533,column:34}},"695":{start:{line:3536,column:20},end:{line:3536,column:56}},"696":{start:{line:3558,column:12},end:{line:3558,column:49}},"697":{start:{line:3560,column:23},end:{line:3560,column:27}},"698":{start:{line:3561,column:22},end:{line:3563,column:14}},"699":{start:{line:3562,column:16},end:{line:3562,column:36}},"700":{start:{line:3565,column:12},end:{line:3565,column:23}},"701":{start:{line:3586,column:12},end:{line:3586,column:49}},"702":{start:{line:3588,column:23},end:{line:3588,column:27}},"703":{start:{line:3589,column:22},end:{line:3591,column:14}},"704":{start:{line:3590,column:16},end:{line:3590,column:36}},"705":{start:{line:3593,column:12},end:{line:3593,column:23}},"706":{start:{line:3613,column:12},end:{line:3613,column:49}},"707":{start:{line:3615,column:23},end:{line:3615,column:27}},"708":{start:{line:3616,column:12},end:{line:3623,column:15}},"709":{start:{line:3617,column:16},end:{line:3622,column:17}},"710":{start:{line:3618,column:20},end:{line:3618,column:34}},"711":{start:{line:3621,column:20},end:{line:3621,column:56}},"712":{start:{line:3643,column:12},end:{line:3643,column:49}},"713":{start:{line:3645,column:23},end:{line:3645,column:27}},"714":{start:{line:3646,column:12},end:{line:3653,column:15}},"715":{start:{line:3647,column:16},end:{line:3652,column:17}},"716":{start:{line:3648,column:20},end:{line:3648,column:34}},"717":{start:{line:3651,column:20},end:{line:3651,column:56}},"718":{start:{line:3673,column:12},end:{line:3673,column:49}},"719":{start:{line:3675,column:23},end:{line:3675,column:27}},"720":{start:{line:3676,column:22},end:{line:3678,column:14}},"721":{start:{line:3677,column:16},end:{line:3677,column:36}},"722":{start:{line:3680,column:12},end:{line:3680,column:23}},"723":{start:{line:3700,column:25},end:{line:3700,column:46}},"724":{start:{line:3702,column:12},end:{line:3706,column:13}},"725":{start:{line:3703,column:16},end:{line:3705,column:18}},"726":{start:{line:3709,column:16},end:{line:3712,column:32}},"727":{start:{line:3715,column:12},end:{line:3715,column:63}},"728":{start:{line:3716,column:12},end:{line:3716,column:69}},"729":{start:{line:3717,column:12},end:{line:3717,column:61}},"730":{start:{line:3718,column:12},end:{line:3718,column:65}},"731":{start:{line:3719,column:12},end:{line:3719,column:63}},"732":{start:{line:3722,column:12},end:{line:3722,column:71}},"733":{start:{line:3723,column:12},end:{line:3723,column:89}},"734":{start:{line:3725,column:23},end:{line:3725,column:27}},"735":{start:{line:3726,column:31},end:{line:3726,column:36}},"736":{start:{line:3727,column:30},end:{line:3727,column:35}},"737":{start:{line:3728,column:12},end:{line:3786,column:14}},"738":{start:{line:3729,column:29},end:{line:3729,column:49}},"739":{start:{line:3731,column:20},end:{line:3779,column:23}},"740":{start:{line:3732,column:24},end:{line:3735,column:25}},"741":{start:{line:3733,column:28},end:{line:3733,column:47}},"742":{start:{line:3734,column:28},end:{line:3734,column:35}},"743":{start:{line:3737,column:44},end:{line:3737,column:74}},"744":{start:{line:3738,column:39},end:{line:3738,column:96}},"745":{start:{line:3739,column:24},end:{line:3776,column:25}},"746":{start:{line:3740,column:28},end:{line:3740,column:53}},"747":{start:{line:3743,column:28},end:{line:3756,column:29}},"748":{start:{line:3744,column:32},end:{line:3744,column:53}},"749":{start:{line:3745,column:32},end:{line:3745,column:52}},"750":{start:{line:3749,column:32},end:{line:3755,column:33}},"751":{start:{line:3750,column:36},end:{line:3750,column:70}},"752":{start:{line:3752,column:36},end:{line:3752,column:55}},"753":{start:{line:3753,column:36},end:{line:3753,column:52}},"754":{start:{line:3754,column:36},end:{line:3754,column:43}},"755":{start:{line:3758,column:28},end:{line:3758,column:52}},"756":{start:{line:3760,column:40},end:{line:3760,column:56}},"757":{start:{line:3762,column:28},end:{line:3775,column:29}},"758":{start:{line:3763,column:32},end:{line:3763,column:52}},"759":{start:{line:3765,column:32},end:{line:3765,column:51}},"760":{start:{line:3766,column:32},end:{line:3766,column:48}},"761":{start:{line:3767,column:32},end:{line:3767,column:39}},"762":{start:{line:3769,column:33},end:{line:3775,column:29}},"763":{start:{line:3770,column:32},end:{line:3770,column:54}},"764":{start:{line:3772,column:32},end:{line:3772,column:51}},"765":{start:{line:3773,column:32},end:{line:3773,column:48}},"766":{start:{line:3774,column:32},end:{line:3774,column:39}},"767":{start:{line:3778,column:24},end:{line:3778,column:59}},"768":{start:{line:3782,column:20},end:{line:3784,column:21}},"769":{start:{line:3783,column:24},end:{line:3783,column:45}},"770":{start:{line:3805,column:12},end:{line:3805,column:49}},"771":{start:{line:3807,column:23},end:{line:3807,column:27}},"772":{start:{line:3808,column:22},end:{line:3810,column:14}},"773":{start:{line:3809,column:16},end:{line:3809,column:36}},"774":{start:{line:3812,column:12},end:{line:3812,column:23}},"775":{start:{line:3824,column:4},end:{line:4015,column:7}},"776":{start:{line:3831,column:12},end:{line:3831,column:30}},"777":{start:{line:3843,column:22},end:{line:3843,column:39}},"778":{start:{line:3844,column:34},end:{line:3844,column:70}},"779":{start:{line:3845,column:12},end:{line:3845,column:68}},"780":{start:{line:3862,column:12},end:{line:3862,column:57}},"781":{start:{line:3866,column:12},end:{line:3866,column:60}},"782":{start:{line:3889,column:12},end:{line:3893,column:13}},"783":{start:{line:3890,column:16},end:{line:3890,column:34}},"784":{start:{line:3891,column:16},end:{line:3891,column:31}},"785":{start:{line:3892,column:16},end:{line:3892,column:38}},"786":{start:{line:3895,column:12},end:{line:3895,column:49}},"787":{start:{line:3896,column:12},end:{line:3896,column:34}},"788":{start:{line:3897,column:12},end:{line:3897,column:34}},"789":{start:{line:3899,column:12},end:{line:3901,column:13}},"790":{start:{line:3900,column:16},end:{line:3900,column:104}},"791":{start:{line:3903,column:12},end:{line:3906,column:13}},"792":{start:{line:3904,column:16},end:{line:3904,column:72}},"793":{start:{line:3905,column:16},end:{line:3905,column:23}},"794":{start:{line:3907,column:23},end:{line:3907,column:27}},"795":{start:{line:3908,column:12},end:{line:3916,column:15}},"796":{start:{line:3909,column:16},end:{line:3915,column:17}},"797":{start:{line:3910,column:20},end:{line:3910,column:34}},"798":{start:{line:3913,column:30},end:{line:3913,column:91}},"799":{start:{line:3914,column:20},end:{line:3914,column:40}},"800":{start:{line:3945,column:12},end:{line:3945,column:56}},"801":{start:{line:3972,column:12},end:{line:3976,column:13}},"802":{start:{line:3973,column:16},end:{line:3973,column:34}},"803":{start:{line:3974,column:16},end:{line:3974,column:31}},"804":{start:{line:3975,column:16},end:{line:3975,column:38}},"805":{start:{line:3978,column:12},end:{line:3978,column:49}},"806":{start:{line:3979,column:12},end:{line:3979,column:34}},"807":{start:{line:3980,column:12},end:{line:3980,column:34}},"808":{start:{line:3981,column:12},end:{line:3981,column:41}},"809":{start:{line:3983,column:12},end:{line:3985,column:13}},"810":{start:{line:3984,column:16},end:{line:3984,column:72}},"811":{start:{line:3987,column:29},end:{line:3987,column:62}},"812":{start:{line:3989,column:23},end:{line:3989,column:41}},"813":{start:{line:3990,column:25},end:{line:3990,column:31}},"814":{start:{line:3991,column:26},end:{line:3991,column:28}},"815":{start:{line:3992,column:23},end:{line:3992,column:29}},"816":{start:{line:3993,column:22},end:{line:3993,column:47}},"817":{start:{line:3994,column:23},end:{line:3994,column:27}},"818":{start:{line:3996,column:22},end:{line:4011,column:13}},"819":{start:{line:4004,column:20},end:{line:4009,column:21}},"820":{start:{line:4005,column:24},end:{line:4005,column:38}},"821":{start:{line:4008,column:24},end:{line:4008,column:54}},"822":{start:{line:4013,column:12},end:{line:4013,column:23}},"823":{start:{line:4047,column:4},end:{line:4164,column:7}},"824":{start:{line:4072,column:12},end:{line:4072,column:32}},"825":{start:{line:4073,column:12},end:{line:4073,column:44}},"826":{start:{line:4075,column:12},end:{line:4075,column:50}},"827":{start:{line:4076,column:12},end:{line:4076,column:52}},"828":{start:{line:4077,column:12},end:{line:4077,column:45}},"829":{start:{line:4078,column:12},end:{line:4078,column:51}},"830":{start:{line:4079,column:12},end:{line:4079,column:49}},"831":{start:{line:4080,column:12},end:{line:4080,column:47}},"832":{start:{line:4081,column:12},end:{line:4081,column:49}},"833":{start:{line:4082,column:12},end:{line:4082,column:56}},"834":{start:{line:4083,column:12},end:{line:4083,column:52}},"835":{start:{line:4084,column:12},end:{line:4084,column:57}},"836":{start:{line:4085,column:12},end:{line:4085,column:72}},"837":{start:{line:4096,column:12},end:{line:4096,column:42}},"838":{start:{line:4107,column:12},end:{line:4107,column:42}},"839":{start:{line:4118,column:12},end:{line:4118,column:45}},"840":{start:{line:4129,column:12},end:{line:4129,column:47}},"841":{start:{line:4140,column:12},end:{line:4140,column:46}},"842":{start:{line:4151,column:12},end:{line:4151,column:40}},"843":{start:{line:4162,column:12},end:{line:4162,column:43}},"844":{start:{line:4177,column:4},end:{line:4199,column:7}},"845":{start:{line:4192,column:12},end:{line:4192,column:32}},"846":{start:{line:4193,column:12},end:{line:4193,column:44}},"847":{start:{line:4195,column:12},end:{line:4195,column:40}},"848":{start:{line:4196,column:12},end:{line:4196,column:50}},"849":{start:{line:4197,column:12},end:{line:4197,column:65}},"850":{start:{line:4232,column:4},end:{line:4350,column:7}},"851":{start:{line:4258,column:12},end:{line:4258,column:32}},"852":{start:{line:4259,column:12},end:{line:4259,column:44}},"853":{start:{line:4261,column:12},end:{line:4261,column:54}},"854":{start:{line:4262,column:12},end:{line:4262,column:56}},"855":{start:{line:4263,column:12},end:{line:4263,column:56}},"856":{start:{line:4264,column:12},end:{line:4264,column:49}},"857":{start:{line:4265,column:12},end:{line:4265,column:57}},"858":{start:{line:4266,column:12},end:{line:4266,column:72}},"859":{start:{line:4268,column:12},end:{line:4268,column:35}},"860":{start:{line:4269,column:12},end:{line:4271,column:13}},"861":{start:{line:4269,column:25},end:{line:4269,column:26}},"862":{start:{line:4270,column:16},end:{line:4270,column:116}},"863":{start:{line:4273,column:12},end:{line:4275,column:13}},"864":{start:{line:4274,column:16},end:{line:4274,column:51}},"865":{start:{line:4276,column:12},end:{line:4278,column:13}},"866":{start:{line:4277,column:16},end:{line:4277,column:51}},"867":{start:{line:4279,column:12},end:{line:4282,column:13}},"868":{start:{line:4280,column:16},end:{line:4280,column:51}},"869":{start:{line:4281,column:16},end:{line:4281,column:64}},"870":{start:{line:4293,column:12},end:{line:4293,column:50}},"871":{start:{line:4304,column:12},end:{line:4304,column:35}},"872":{start:{line:4315,column:12},end:{line:4315,column:42}},"873":{start:{line:4326,column:12},end:{line:4326,column:40}},"874":{start:{line:4337,column:12},end:{line:4337,column:39}},"875":{start:{line:4348,column:12},end:{line:4348,column:41}},"876":{start:{line:4366,column:4},end:{line:4413,column:7}},"877":{start:{line:4383,column:12},end:{line:4383,column:35}},"878":{start:{line:4384,column:12},end:{line:4384,column:39}},"879":{start:{line:4385,column:12},end:{line:4385,column:58}},"880":{start:{line:4386,column:12},end:{line:4386,column:72}},"881":{start:{line:4387,column:12},end:{line:4387,column:50}},"882":{start:{line:4388,column:12},end:{line:4388,column:60}},"883":{start:{line:4390,column:12},end:{line:4390,column:50}},"884":{start:{line:4402,column:12},end:{line:4405,column:13}},"885":{start:{line:4403,column:16},end:{line:4403,column:32}},"886":{start:{line:4404,column:16},end:{line:4404,column:26}},"887":{start:{line:4406,column:12},end:{line:4408,column:13}},"888":{start:{line:4407,column:16},end:{line:4407,column:26}},"889":{start:{line:4411,column:12},end:{line:4411,column:87}},"890":{start:{line:4524,column:4},end:{line:5169,column:7}},"891":{start:{line:4544,column:12},end:{line:4544,column:51}},"892":{start:{line:4545,column:12},end:{line:4545,column:30}},"893":{start:{line:4546,column:12},end:{line:4546,column:27}},"894":{start:{line:4547,column:12},end:{line:4547,column:30}},"895":{start:{line:4548,column:12},end:{line:4548,column:28}},"896":{start:{line:4550,column:12},end:{line:4551,column:54}},"897":{start:{line:4553,column:12},end:{line:4553,column:52}},"898":{start:{line:4554,column:12},end:{line:4554,column:54}},"899":{start:{line:4570,column:12},end:{line:4572,column:13}},"900":{start:{line:4571,column:16},end:{line:4571,column:30}},"901":{start:{line:4574,column:12},end:{line:4576,column:13}},"902":{start:{line:4575,column:16},end:{line:4575,column:81}},"903":{start:{line:4578,column:12},end:{line:4578,column:54}},"904":{start:{line:4579,column:12},end:{line:4579,column:24}},"905":{start:{line:4595,column:12},end:{line:4597,column:13}},"906":{start:{line:4596,column:16},end:{line:4596,column:77}},"907":{start:{line:4598,column:12},end:{line:4604,column:13}},"908":{start:{line:4599,column:16},end:{line:4603,column:70}},"909":{start:{line:4605,column:12},end:{line:4610,column:13}},"910":{start:{line:4606,column:16},end:{line:4609,column:59}},"911":{start:{line:4612,column:22},end:{line:4616,column:13}},"912":{start:{line:4618,column:12},end:{line:4623,column:13}},"913":{start:{line:4619,column:16},end:{line:4622,column:18}},"914":{start:{line:4624,column:12},end:{line:4624,column:35}},"915":{start:{line:4626,column:12},end:{line:4626,column:24}},"916":{start:{line:4643,column:12},end:{line:4645,column:13}},"917":{start:{line:4644,column:16},end:{line:4644,column:83}},"918":{start:{line:4647,column:20},end:{line:4647,column:63}},"919":{start:{line:4649,column:12},end:{line:4651,column:13}},"920":{start:{line:4650,column:16},end:{line:4650,column:112}},"921":{start:{line:4653,column:12},end:{line:4656,column:13}},"922":{start:{line:4654,column:16},end:{line:4655,column:35}},"923":{start:{line:4658,column:12},end:{line:4661,column:13}},"924":{start:{line:4659,column:16},end:{line:4660,column:35}},"925":{start:{line:4663,column:12},end:{line:4665,column:13}},"926":{start:{line:4664,column:16},end:{line:4664,column:120}},"927":{start:{line:4667,column:25},end:{line:4676,column:13}},"928":{start:{line:4678,column:12},end:{line:4678,column:84}},"929":{start:{line:4679,column:12},end:{line:4679,column:38}},"930":{start:{line:4681,column:12},end:{line:4681,column:24}},"931":{start:{line:4694,column:12},end:{line:4696,column:13}},"932":{start:{line:4695,column:16},end:{line:4695,column:67}},"933":{start:{line:4697,column:20},end:{line:4697,column:63}},"934":{start:{line:4698,column:12},end:{line:4700,column:13}},"935":{start:{line:4699,column:16},end:{line:4699,column:96}},"936":{start:{line:4702,column:22},end:{line:4707,column:13}},"937":{start:{line:4709,column:12},end:{line:4711,column:13}},"938":{start:{line:4710,column:16},end:{line:4710,column:36}},"939":{start:{line:4713,column:12},end:{line:4713,column:32}},"940":{start:{line:4715,column:12},end:{line:4715,column:24}},"941":{start:{line:4738,column:12},end:{line:4740,column:13}},"942":{start:{line:4739,column:16},end:{line:4739,column:63}},"943":{start:{line:4741,column:20},end:{line:4741,column:59}},"944":{start:{line:4742,column:12},end:{line:4744,column:13}},"945":{start:{line:4743,column:16},end:{line:4743,column:86}},"946":{start:{line:4745,column:31},end:{line:4745,column:33}},"947":{start:{line:4746,column:12},end:{line:4748,column:13}},"948":{start:{line:4747,column:16},end:{line:4747,column:50}},"949":{start:{line:4749,column:12},end:{line:4751,column:13}},"950":{start:{line:4750,column:16},end:{line:4750,column:46}},"951":{start:{line:4752,column:12},end:{line:4754,column:13}},"952":{start:{line:4753,column:16},end:{line:4753,column:48}},"953":{start:{line:4755,column:12},end:{line:4757,column:13}},"954":{start:{line:4756,column:16},end:{line:4756,column:56}},"955":{start:{line:4759,column:12},end:{line:4766,column:15}},"956":{start:{line:4768,column:12},end:{line:4768,column:24}},"957":{start:{line:4783,column:12},end:{line:4785,column:13}},"958":{start:{line:4784,column:16},end:{line:4784,column:63}},"959":{start:{line:4786,column:20},end:{line:4786,column:59}},"960":{start:{line:4787,column:12},end:{line:4789,column:13}},"961":{start:{line:4788,column:16},end:{line:4788,column:87}},"962":{start:{line:4791,column:12},end:{line:4798,column:15}},"963":{start:{line:4800,column:12},end:{line:4800,column:24}},"964":{start:{line:4814,column:12},end:{line:4816,column:13}},"965":{start:{line:4815,column:16},end:{line:4815,column:63}},"966":{start:{line:4817,column:20},end:{line:4817,column:59}},"967":{start:{line:4818,column:12},end:{line:4820,column:13}},"968":{start:{line:4819,column:16},end:{line:4819,column:89}},"969":{start:{line:4821,column:12},end:{line:4823,column:13}},"970":{start:{line:4822,column:16},end:{line:4822,column:120}},"971":{start:{line:4825,column:12},end:{line:4831,column:15}},"972":{start:{line:4833,column:12},end:{line:4833,column:24}},"973":{start:{line:4846,column:12},end:{line:4848,column:13}},"974":{start:{line:4847,column:16},end:{line:4847,column:67}},"975":{start:{line:4849,column:20},end:{line:4849,column:63}},"976":{start:{line:4850,column:12},end:{line:4852,column:13}},"977":{start:{line:4851,column:16},end:{line:4851,column:96}},"978":{start:{line:4854,column:22},end:{line:4858,column:13}},"979":{start:{line:4860,column:12},end:{line:4862,column:13}},"980":{start:{line:4861,column:16},end:{line:4861,column:36}},"981":{start:{line:4864,column:12},end:{line:4864,column:35}},"982":{start:{line:4866,column:12},end:{line:4866,column:24}},"983":{start:{line:4883,column:12},end:{line:4885,column:13}},"984":{start:{line:4884,column:16},end:{line:4884,column:67}},"985":{start:{line:4886,column:20},end:{line:4886,column:63}},"986":{start:{line:4887,column:12},end:{line:4889,column:13}},"987":{start:{line:4888,column:16},end:{line:4888,column:86}},"988":{start:{line:4893,column:32},end:{line:4893,column:34}},"989":{start:{line:4894,column:12},end:{line:4896,column:13}},"990":{start:{line:4895,column:16},end:{line:4895,column:51}},"991":{start:{line:4897,column:12},end:{line:4899,column:13}},"992":{start:{line:4898,column:16},end:{line:4898,column:47}},"993":{start:{line:4900,column:12},end:{line:4902,column:13}},"994":{start:{line:4901,column:16},end:{line:4901,column:49}},"995":{start:{line:4903,column:12},end:{line:4905,column:13}},"996":{start:{line:4904,column:16},end:{line:4904,column:57}},"997":{start:{line:4907,column:12},end:{line:4913,column:15}},"998":{start:{line:4915,column:12},end:{line:4915,column:24}},"999":{start:{line:4929,column:12},end:{line:4931,column:13}},"1000":{start:{line:4930,column:16},end:{line:4930,column:67}},"1001":{start:{line:4932,column:20},end:{line:4932,column:63}},"1002":{start:{line:4933,column:12},end:{line:4935,column:13}},"1003":{start:{line:4934,column:16},end:{line:4934,column:87}},"1004":{start:{line:4937,column:12},end:{line:4943,column:15}},"1005":{start:{line:4945,column:12},end:{line:4945,column:24}},"1006":{start:{line:4958,column:12},end:{line:4960,column:13}},"1007":{start:{line:4959,column:16},end:{line:4959,column:63}},"1008":{start:{line:4961,column:20},end:{line:4961,column:59}},"1009":{start:{line:4962,column:12},end:{line:4964,column:13}},"1010":{start:{line:4963,column:16},end:{line:4963,column:89}},"1011":{start:{line:4965,column:12},end:{line:4967,column:13}},"1012":{start:{line:4966,column:16},end:{line:4966,column:120}},"1013":{start:{line:4969,column:12},end:{line:4974,column:15}},"1014":{start:{line:4976,column:12},end:{line:4976,column:24}},"1015":{start:{line:4990,column:12},end:{line:4992,column:13}},"1016":{start:{line:4991,column:16},end:{line:4991,column:67}},"1017":{start:{line:4994,column:20},end:{line:4994,column:63}},"1018":{start:{line:4995,column:12},end:{line:5047,column:13}},"1019":{start:{line:5004,column:16},end:{line:5006,column:35}},"1020":{start:{line:5008,column:17},end:{line:5047,column:13}},"1021":{start:{line:5020,column:16},end:{line:5023,column:22}},"1022":{start:{line:5025,column:17},end:{line:5047,column:13}},"1023":{start:{line:5034,column:16},end:{line:5037,column:22}},"1024":{start:{line:5039,column:17},end:{line:5047,column:13}},"1025":{start:{line:5042,column:16},end:{line:5043,column:46}},"1026":{start:{line:5045,column:17},end:{line:5047,column:13}},"1027":{start:{line:5046,column:16},end:{line:5046,column:84}},"1028":{start:{line:5049,column:12},end:{line:5056,column:15}},"1029":{start:{line:5058,column:12},end:{line:5058,column:24}},"1030":{start:{line:5069,column:12},end:{line:5076,column:14}},"1031":{start:{line:5102,column:22},end:{line:5102,column:60}},"1032":{start:{line:5104,column:23},end:{line:5106,column:13}},"1033":{start:{line:5108,column:12},end:{line:5110,column:13}},"1034":{start:{line:5109,column:16},end:{line:5109,column:60}},"1035":{start:{line:5112,column:12},end:{line:5124,column:15}},"1036":{start:{line:5113,column:16},end:{line:5116,column:17}},"1037":{start:{line:5114,column:20},end:{line:5114,column:77}},"1038":{start:{line:5115,column:20},end:{line:5115,column:27}},"1039":{start:{line:5118,column:16},end:{line:5123,column:17}},"1040":{start:{line:5119,column:20},end:{line:5119,column:88}},"1041":{start:{line:5122,column:20},end:{line:5122,column:96}},"1042":{start:{line:5154,column:12},end:{line:5157,column:13}},"1043":{start:{line:5155,column:16},end:{line:5155,column:32}},"1044":{start:{line:5156,column:16},end:{line:5156,column:26}},"1045":{start:{line:5158,column:12},end:{line:5158,column:30}},"1046":{start:{line:5160,column:12},end:{line:5167,column:15}},"1047":{start:{line:5161,column:16},end:{line:5166,column:17}},"1048":{start:{line:5162,column:20},end:{line:5162,column:46}},"1049":{start:{line:5165,column:20},end:{line:5165,column:68}},"1050":{start:{line:5197,column:4},end:{line:5515,column:7}},"1051":{start:{line:5225,column:12},end:{line:5225,column:32}},"1052":{start:{line:5226,column:12},end:{line:5226,column:44}},"1053":{start:{line:5228,column:12},end:{line:5228,column:58}},"1054":{start:{line:5229,column:12},end:{line:5229,column:59}},"1055":{start:{line:5230,column:12},end:{line:5230,column:60}},"1056":{start:{line:5231,column:12},end:{line:5231,column:59}},"1057":{start:{line:5232,column:12},end:{line:5232,column:67}},"1058":{start:{line:5235,column:12},end:{line:5237,column:13}},"1059":{start:{line:5236,column:16},end:{line:5236,column:57}},"1060":{start:{line:5238,column:12},end:{line:5240,column:13}},"1061":{start:{line:5239,column:16},end:{line:5239,column:59}},"1062":{start:{line:5241,column:12},end:{line:5243,column:13}},"1063":{start:{line:5242,column:16},end:{line:5242,column:60}},"1064":{start:{line:5244,column:12},end:{line:5246,column:13}},"1065":{start:{line:5245,column:16},end:{line:5245,column:58}},"1066":{start:{line:5249,column:12},end:{line:5251,column:13}},"1067":{start:{line:5250,column:16},end:{line:5250,column:51}},"1068":{start:{line:5254,column:12},end:{line:5254,column:29}},"1069":{start:{line:5255,column:12},end:{line:5257,column:13}},"1070":{start:{line:5255,column:25},end:{line:5255,column:26}},"1071":{start:{line:5256,column:16},end:{line:5256,column:98}},"1072":{start:{line:5260,column:12},end:{line:5260,column:34}},"1073":{start:{line:5261,column:12},end:{line:5263,column:13}},"1074":{start:{line:5261,column:25},end:{line:5261,column:26}},"1075":{start:{line:5262,column:16},end:{line:5262,column:90}},"1076":{start:{line:5266,column:12},end:{line:5266,column:35}},"1077":{start:{line:5267,column:12},end:{line:5269,column:13}},"1078":{start:{line:5267,column:25},end:{line:5267,column:26}},"1079":{start:{line:5268,column:16},end:{line:5268,column:126}},"1080":{start:{line:5280,column:12},end:{line:5280,column:55}},"1081":{start:{line:5291,column:12},end:{line:5291,column:52}},"1082":{start:{line:5303,column:12},end:{line:5303,column:44}},"1083":{start:{line:5317,column:12},end:{line:5317,column:78}},"1084":{start:{line:5332,column:33},end:{line:5332,column:35}},"1085":{start:{line:5334,column:12},end:{line:5338,column:13}},"1086":{start:{line:5335,column:16},end:{line:5337,column:17}},"1087":{start:{line:5336,column:20},end:{line:5336,column:55}},"1088":{start:{line:5340,column:35},end:{line:5340,column:58}},"1089":{start:{line:5341,column:12},end:{line:5345,column:13}},"1090":{start:{line:5342,column:16},end:{line:5344,column:17}},"1091":{start:{line:5343,column:20},end:{line:5343,column:62}},"1092":{start:{line:5347,column:12},end:{line:5347,column:34}},"1093":{start:{line:5361,column:12},end:{line:5361,column:49}},"1094":{start:{line:5374,column:25},end:{line:5374,column:27}},"1095":{start:{line:5376,column:23},end:{line:5376,column:44}},"1096":{start:{line:5377,column:31},end:{line:5377,column:48}},"1097":{start:{line:5378,column:12},end:{line:5383,column:13}},"1098":{start:{line:5378,column:25},end:{line:5378,column:26}},"1099":{start:{line:5379,column:34},end:{line:5379,column:55}},"1100":{start:{line:5380,column:16},end:{line:5382,column:17}},"1101":{start:{line:5380,column:29},end:{line:5380,column:30}},"1102":{start:{line:5381,column:20},end:{line:5381,column:124}},"1103":{start:{line:5384,column:12},end:{line:5384,column:26}},"1104":{start:{line:5397,column:12},end:{line:5397,column:56}},"1105":{start:{line:5410,column:12},end:{line:5410,column:67}},"1106":{start:{line:5423,column:12},end:{line:5423,column:50}},"1107":{start:{line:5454,column:12},end:{line:5457,column:13}},"1108":{start:{line:5455,column:16},end:{line:5455,column:40}},"1109":{start:{line:5456,column:16},end:{line:5456,column:41}},"1110":{start:{line:5459,column:24},end:{line:5459,column:106}},"1111":{start:{line:5460,column:23},end:{line:5460,column:72}},"1112":{start:{line:5462,column:12},end:{line:5462,column:65}},"1113":{start:{line:5485,column:24},end:{line:5485,column:90}},"1114":{start:{line:5487,column:12},end:{line:5487,column:69}},"1115":{start:{line:5488,column:12},end:{line:5488,column:81}},"1116":{start:{line:5501,column:12},end:{line:5501,column:64}},"1117":{start:{line:5513,column:12},end:{line:5513,column:53}},"1118":{start:{line:5526,column:4},end:{line:5679,column:7}},"1119":{start:{line:5533,column:12},end:{line:5533,column:74}},"1120":{start:{line:5556,column:12},end:{line:5559,column:13}},"1121":{start:{line:5557,column:16},end:{line:5557,column:34}},"1122":{start:{line:5558,column:16},end:{line:5558,column:31}},"1123":{start:{line:5561,column:12},end:{line:5561,column:29}},"1124":{start:{line:5562,column:12},end:{line:5562,column:57}},"1125":{start:{line:5564,column:12},end:{line:5564,column:77}},"1126":{start:{line:5565,column:12},end:{line:5568,column:13}},"1127":{start:{line:5567,column:16},end:{line:5567,column:72}},"1128":{start:{line:5572,column:12},end:{line:5574,column:13}},"1129":{start:{line:5573,column:16},end:{line:5573,column:35}},"1130":{start:{line:5576,column:38},end:{line:5576,column:75}},"1131":{start:{line:5578,column:12},end:{line:5578,column:66}},"1132":{start:{line:5579,column:12},end:{line:5579,column:63}},"1133":{start:{line:5580,column:12},end:{line:5580,column:63}},"1134":{start:{line:5583,column:23},end:{line:5583,column:50}},"1135":{start:{line:5584,column:12},end:{line:5584,column:30}},"1136":{start:{line:5585,column:12},end:{line:5587,column:13}},"1137":{start:{line:5585,column:25},end:{line:5585,column:26}},"1138":{start:{line:5586,column:16},end:{line:5586,column:75}},"1139":{start:{line:5589,column:12},end:{line:5589,column:56}},"1140":{start:{line:5590,column:12},end:{line:5590,column:56}},"1141":{start:{line:5601,column:12},end:{line:5601,column:47}},"1142":{start:{line:5613,column:12},end:{line:5617,column:13}},"1143":{start:{line:5613,column:25},end:{line:5613,column:26}},"1144":{start:{line:5614,column:16},end:{line:5616,column:17}},"1145":{start:{line:5615,column:20},end:{line:5615,column:43}},"1146":{start:{line:5618,column:12},end:{line:5618,column:24}},"1147":{start:{line:5629,column:12},end:{line:5629,column:58}},"1148":{start:{line:5645,column:12},end:{line:5648,column:13}},"1149":{start:{line:5646,column:16},end:{line:5646,column:33}},"1150":{start:{line:5647,column:16},end:{line:5647,column:27}},"1151":{start:{line:5649,column:12},end:{line:5649,column:49}},"1152":{start:{line:5651,column:12},end:{line:5654,column:13}},"1153":{start:{line:5652,column:16},end:{line:5652,column:93}},"1154":{start:{line:5653,column:16},end:{line:5653,column:23}},"1155":{start:{line:5655,column:12},end:{line:5658,column:13}},"1156":{start:{line:5656,column:16},end:{line:5656,column:81}},"1157":{start:{line:5657,column:16},end:{line:5657,column:23}},"1158":{start:{line:5660,column:31},end:{line:5666,column:13}},"1159":{start:{line:5668,column:23},end:{line:5668,column:27}},"1160":{start:{line:5669,column:12},end:{line:5677,column:15}},"1161":{start:{line:5670,column:16},end:{line:5676,column:17}},"1162":{start:{line:5671,column:20},end:{line:5671,column:40}},"1163":{start:{line:5674,column:45},end:{line:5674,column:98}},"1164":{start:{line:5675,column:20},end:{line:5675,column:142}},"1165":{start:{line:5690,column:4},end:{line:5768,column:7}},"1166":{start:{line:5697,column:12},end:{line:5697,column:36}},"1167":{start:{line:5713,column:12},end:{line:5713,column:40}},"1168":{start:{line:5714,column:12},end:{line:5714,column:57}},"1169":{start:{line:5715,column:12},end:{line:5715,column:56}},"1170":{start:{line:5733,column:12},end:{line:5736,column:13}},"1171":{start:{line:5734,column:16},end:{line:5734,column:34}},"1172":{start:{line:5735,column:16},end:{line:5735,column:28}},"1173":{start:{line:5738,column:12},end:{line:5738,column:34}},"1174":{start:{line:5739,column:12},end:{line:5739,column:48}},"1175":{start:{line:5740,column:12},end:{line:5740,column:43}},"1176":{start:{line:5742,column:23},end:{line:5742,column:27}},"1177":{start:{line:5743,column:12},end:{line:5751,column:15}},"1178":{start:{line:5744,column:16},end:{line:5750,column:17}},"1179":{start:{line:5745,column:20},end:{line:5745,column:34}},"1180":{start:{line:5748,column:36},end:{line:5748,column:137}},"1181":{start:{line:5749,column:20},end:{line:5749,column:46}},"1182":{start:{line:5765,column:34},end:{line:5765,column:70}},"1183":{start:{line:5766,column:12},end:{line:5766,column:88}},"1184":{start:{line:5772,column:4},end:{line:5802,column:7}},"1185":{start:{line:5774,column:12},end:{line:5774,column:34}},"1186":{start:{line:5776,column:12},end:{line:5776,column:38}},"1187":{start:{line:5777,column:12},end:{line:5777,column:50}},"1188":{start:{line:5778,column:12},end:{line:5778,column:29}},"1189":{start:{line:5783,column:12},end:{line:5783,column:49}},"1190":{start:{line:5785,column:23},end:{line:5785,column:27}},"1191":{start:{line:5786,column:25},end:{line:5789,column:13}},"1192":{start:{line:5790,column:12},end:{line:5800,column:15}},"1193":{start:{line:5791,column:16},end:{line:5799,column:17}},"1194":{start:{line:5792,column:20},end:{line:5792,column:34}},"1195":{start:{line:5795,column:38},end:{line:5795,column:76}},"1196":{start:{line:5796,column:20},end:{line:5796,column:47}},"1197":{start:{line:5798,column:20},end:{line:5798,column:60}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:16,column:1},end:{line:16,column:2}},loc:{start:{line:16,column:12},end:{line:5803,column:1}},line:16},"1":{name:"(anonymous_1)",decl:{start:{line:38,column:14},end:{line:38,column:15}},loc:{start:{line:38,column:25},end:{line:40,column:9}},line:38},"2":{name:"(anonymous_2)",decl:{start:{line:72,column:14},end:{line:72,column:15}},loc:{start:{line:72,column:25},end:{line:88,column:9}},line:72},"3":{name:"(anonymous_3)",decl:{start:{line:105,column:20},end:{line:105,column:21}},loc:{start:{line:105,column:41},end:{line:117,column:9}},line:105},"4":{name:"(anonymous_4)",decl:{start:{line:135,column:14},end:{line:135,column:15}},loc:{start:{line:135,column:25},end:{line:137,column:9}},line:135},"5":{name:"(anonymous_5)",decl:{start:{line:163,column:24},end:{line:163,column:25}},loc:{start:{line:163,column:44},end:{line:165,column:9}},line:163},"6":{name:"(anonymous_6)",decl:{start:{line:191,column:17},end:{line:191,column:18}},loc:{start:{line:191,column:37},end:{line:193,column:9}},line:191},"7":{name:"(anonymous_7)",decl:{start:{line:217,column:23},end:{line:217,column:24}},loc:{start:{line:217,column:43},end:{line:219,column:9}},line:217},"8":{name:"(anonymous_8)",decl:{start:{line:243,column:26},end:{line:243,column:27}},loc:{start:{line:243,column:46},end:{line:245,column:9}},line:243},"9":{name:"(anonymous_9)",decl:{start:{line:270,column:26},end:{line:270,column:27}},loc:{start:{line:270,column:46},end:{line:272,column:9}},line:270},"10":{name:"(anonymous_10)",decl:{start:{line:299,column:14},end:{line:299,column:15}},loc:{start:{line:299,column:34},end:{line:301,column:9}},line:299},"11":{name:"(anonymous_11)",decl:{start:{line:311,column:20},end:{line:311,column:21}},loc:{start:{line:311,column:40},end:{line:313,column:9}},line:311},"12":{name:"(anonymous_12)",decl:{start:{line:336,column:15},end:{line:336,column:16}},loc:{start:{line:336,column:26},end:{line:338,column:9}},line:336},"13":{name:"(anonymous_13)",decl:{start:{line:365,column:15},end:{line:365,column:16}},loc:{start:{line:365,column:35},end:{line:367,column:9}},line:365},"14":{name:"(anonymous_14)",decl:{start:{line:396,column:16},end:{line:396,column:17}},loc:{start:{line:396,column:61},end:{line:404,column:9}},line:396},"15":{name:"(anonymous_15)",decl:{start:{line:419,column:16},end:{line:419,column:17}},loc:{start:{line:419,column:51},end:{line:426,column:9}},line:419},"16":{name:"(anonymous_16)",decl:{start:{line:452,column:23},end:{line:452,column:24}},loc:{start:{line:452,column:68},end:{line:460,column:9}},line:452},"17":{name:"(anonymous_17)",decl:{start:{line:477,column:21},end:{line:477,column:22}},loc:{start:{line:477,column:40},end:{line:500,column:9}},line:477},"18":{name:"(anonymous_18)",decl:{start:{line:478,column:35},end:{line:478,column:36}},loc:{start:{line:478,column:46},end:{line:478,column:48}},line:478},"19":{name:"(anonymous_19)",decl:{start:{line:481,column:54},end:{line:481,column:55}},loc:{start:{line:481,column:78},end:{line:497,column:13}},line:481},"20":{name:"(anonymous_20)",decl:{start:{line:488,column:31},end:{line:488,column:32}},loc:{start:{line:488,column:42},end:{line:495,column:21}},line:488},"21":{name:"(anonymous_21)",decl:{start:{line:516,column:20},end:{line:516,column:21}},loc:{start:{line:516,column:39},end:{line:521,column:9}},line:516},"22":{name:"(anonymous_22)",decl:{start:{line:517,column:35},end:{line:517,column:36}},loc:{start:{line:517,column:46},end:{line:517,column:48}},line:517},"23":{name:"(anonymous_23)",decl:{start:{line:543,column:15},end:{line:543,column:16}},loc:{start:{line:543,column:49},end:{line:562,column:9}},line:543},"24":{name:"(anonymous_24)",decl:{start:{line:549,column:35},end:{line:549,column:36}},loc:{start:{line:549,column:46},end:{line:549,column:48}},line:549},"25":{name:"(anonymous_25)",decl:{start:{line:554,column:50},end:{line:554,column:51}},loc:{start:{line:554,column:74},end:{line:561,column:13}},line:554},"26":{name:"(anonymous_26)",decl:{start:{line:580,column:19},end:{line:580,column:20}},loc:{start:{line:580,column:53},end:{line:601,column:9}},line:580},"27":{name:"(anonymous_27)",decl:{start:{line:586,column:35},end:{line:586,column:36}},loc:{start:{line:586,column:46},end:{line:586,column:48}},line:586},"28":{name:"(anonymous_28)",decl:{start:{line:592,column:53},end:{line:592,column:54}},loc:{start:{line:592,column:77},end:{line:600,column:13}},line:592},"29":{name:"(anonymous_29)",decl:{start:{line:624,column:13},end:{line:624,column:14}},loc:{start:{line:624,column:47},end:{line:663,column:9}},line:624},"30":{name:"(anonymous_30)",decl:{start:{line:630,column:35},end:{line:630,column:36}},loc:{start:{line:630,column:46},end:{line:630,column:48}},line:630},"31":{name:"(anonymous_31)",decl:{start:{line:652,column:16},end:{line:652,column:17}},loc:{start:{line:652,column:40},end:{line:659,column:17}},line:652},"32":{name:"(anonymous_32)",decl:{start:{line:685,column:14},end:{line:685,column:15}},loc:{start:{line:685,column:47},end:{line:703,column:9}},line:685},"33":{name:"(anonymous_33)",decl:{start:{line:721,column:13},end:{line:721,column:14}},loc:{start:{line:721,column:49},end:{line:735,column:9}},line:721},"34":{name:"(anonymous_34)",decl:{start:{line:737,column:16},end:{line:737,column:17}},loc:{start:{line:737,column:42},end:{line:750,column:9}},line:737},"35":{name:"(anonymous_35)",decl:{start:{line:768,column:14},end:{line:768,column:15}},loc:{start:{line:768,column:50},end:{line:782,column:9}},line:768},"36":{name:"(anonymous_36)",decl:{start:{line:800,column:13},end:{line:800,column:14}},loc:{start:{line:800,column:49},end:{line:814,column:9}},line:800},"37":{name:"(anonymous_37)",decl:{start:{line:843,column:14},end:{line:843,column:15}},loc:{start:{line:843,column:49},end:{line:858,column:9}},line:843},"38":{name:"(anonymous_38)",decl:{start:{line:865,column:14},end:{line:865,column:15}},loc:{start:{line:865,column:25},end:{line:867,column:9}},line:865},"39":{name:"(anonymous_39)",decl:{start:{line:877,column:15},end:{line:877,column:16}},loc:{start:{line:877,column:36},end:{line:880,column:9}},line:877},"40":{name:"(anonymous_40)",decl:{start:{line:891,column:15},end:{line:891,column:16}},loc:{start:{line:891,column:34},end:{line:893,column:9}},line:891},"41":{name:"(anonymous_41)",decl:{start:{line:902,column:20},end:{line:902,column:21}},loc:{start:{line:902,column:31},end:{line:904,column:9}},line:902},"42":{name:"(anonymous_42)",decl:{start:{line:913,column:15},end:{line:913,column:16}},loc:{start:{line:913,column:26},end:{line:915,column:9}},line:913},"43":{name:"(anonymous_43)",decl:{start:{line:953,column:14},end:{line:953,column:15}},loc:{start:{line:953,column:49},end:{line:977,column:9}},line:953},"44":{name:"(anonymous_44)",decl:{start:{line:987,column:15},end:{line:987,column:16}},loc:{start:{line:987,column:36},end:{line:1009,column:9}},line:987},"45":{name:"(anonymous_45)",decl:{start:{line:1019,column:16},end:{line:1019,column:17}},loc:{start:{line:1019,column:27},end:{line:1021,column:9}},line:1019},"46":{name:"(anonymous_46)",decl:{start:{line:1031,column:13},end:{line:1031,column:14}},loc:{start:{line:1031,column:24},end:{line:1033,column:9}},line:1031},"47":{name:"(anonymous_47)",decl:{start:{line:1043,column:15},end:{line:1043,column:16}},loc:{start:{line:1043,column:26},end:{line:1045,column:9}},line:1043},"48":{name:"(anonymous_48)",decl:{start:{line:1054,column:16},end:{line:1054,column:17}},loc:{start:{line:1054,column:27},end:{line:1056,column:9}},line:1054},"49":{name:"(anonymous_49)",decl:{start:{line:1065,column:17},end:{line:1065,column:18}},loc:{start:{line:1065,column:28},end:{line:1067,column:9}},line:1065},"50":{name:"(anonymous_50)",decl:{start:{line:1076,column:19},end:{line:1076,column:20}},loc:{start:{line:1076,column:30},end:{line:1078,column:9}},line:1076},"51":{name:"(anonymous_51)",decl:{start:{line:1095,column:15},end:{line:1095,column:16}},loc:{start:{line:1095,column:43},end:{line:1114,column:9}},line:1095},"52":{name:"(anonymous_52)",decl:{start:{line:1100,column:35},end:{line:1100,column:36}},loc:{start:{line:1100,column:46},end:{line:1100,column:48}},line:1100},"53":{name:"(anonymous_53)",decl:{start:{line:1105,column:41},end:{line:1105,column:42}},loc:{start:{line:1105,column:65},end:{line:1113,column:13}},line:1105},"54":{name:"(anonymous_54)",decl:{start:{line:1124,column:16},end:{line:1124,column:17}},loc:{start:{line:1124,column:35},end:{line:1131,column:9}},line:1124},"55":{name:"(anonymous_55)",decl:{start:{line:1125,column:35},end:{line:1125,column:36}},loc:{start:{line:1125,column:46},end:{line:1125,column:48}},line:1125},"56":{name:"(anonymous_56)",decl:{start:{line:1128,column:36},end:{line:1128,column:37}},loc:{start:{line:1128,column:50},end:{line:1130,column:13}},line:1128},"57":{name:"(anonymous_57)",decl:{start:{line:1142,column:16},end:{line:1142,column:17}},loc:{start:{line:1142,column:42},end:{line:1171,column:9}},line:1142},"58":{name:"(anonymous_58)",decl:{start:{line:1143,column:35},end:{line:1143,column:36}},loc:{start:{line:1143,column:46},end:{line:1143,column:48}},line:1143},"59":{name:"(anonymous_59)",decl:{start:{line:1150,column:43},end:{line:1150,column:44}},loc:{start:{line:1150,column:67},end:{line:1168,column:13}},line:1150},"60":{name:"(anonymous_60)",decl:{start:{line:1156,column:31},end:{line:1156,column:32}},loc:{start:{line:1156,column:42},end:{line:1163,column:21}},line:1156},"61":{name:"(anonymous_61)",decl:{start:{line:1181,column:17},end:{line:1181,column:18}},loc:{start:{line:1181,column:36},end:{line:1193,column:9}},line:1181},"62":{name:"(anonymous_62)",decl:{start:{line:1182,column:35},end:{line:1182,column:36}},loc:{start:{line:1182,column:46},end:{line:1182,column:48}},line:1182},"63":{name:"(anonymous_63)",decl:{start:{line:1185,column:37},end:{line:1185,column:38}},loc:{start:{line:1185,column:61},end:{line:1192,column:13}},line:1185},"64":{name:"(anonymous_64)",decl:{start:{line:1203,column:16},end:{line:1203,column:17}},loc:{start:{line:1203,column:35},end:{line:1215,column:9}},line:1203},"65":{name:"(anonymous_65)",decl:{start:{line:1204,column:35},end:{line:1204,column:36}},loc:{start:{line:1204,column:46},end:{line:1204,column:48}},line:1204},"66":{name:"(anonymous_66)",decl:{start:{line:1207,column:36},end:{line:1207,column:37}},loc:{start:{line:1207,column:60},end:{line:1214,column:13}},line:1207},"67":{name:"(anonymous_67)",decl:{start:{line:1225,column:16},end:{line:1225,column:17}},loc:{start:{line:1225,column:35},end:{line:1237,column:9}},line:1225},"68":{name:"(anonymous_68)",decl:{start:{line:1226,column:35},end:{line:1226,column:36}},loc:{start:{line:1226,column:46},end:{line:1226,column:48}},line:1226},"69":{name:"(anonymous_69)",decl:{start:{line:1229,column:37},end:{line:1229,column:38}},loc:{start:{line:1229,column:61},end:{line:1236,column:13}},line:1229},"70":{name:"(anonymous_70)",decl:{start:{line:1272,column:14},end:{line:1272,column:15}},loc:{start:{line:1272,column:49},end:{line:1290,column:9}},line:1272},"71":{name:"(anonymous_71)",decl:{start:{line:1300,column:27},end:{line:1300,column:28}},loc:{start:{line:1300,column:43},end:{line:1302,column:9}},line:1300},"72":{name:"(anonymous_72)",decl:{start:{line:1313,column:15},end:{line:1313,column:16}},loc:{start:{line:1313,column:36},end:{line:1337,column:9}},line:1313},"73":{name:"(anonymous_73)",decl:{start:{line:1347,column:15},end:{line:1347,column:16}},loc:{start:{line:1347,column:26},end:{line:1349,column:9}},line:1347},"74":{name:"(anonymous_74)",decl:{start:{line:1358,column:16},end:{line:1358,column:17}},loc:{start:{line:1358,column:27},end:{line:1360,column:9}},line:1358},"75":{name:"(anonymous_75)",decl:{start:{line:1369,column:17},end:{line:1369,column:18}},loc:{start:{line:1369,column:28},end:{line:1371,column:9}},line:1369},"76":{name:"(anonymous_76)",decl:{start:{line:1388,column:15},end:{line:1388,column:16}},loc:{start:{line:1388,column:43},end:{line:1412,column:9}},line:1388},"77":{name:"(anonymous_77)",decl:{start:{line:1393,column:35},end:{line:1393,column:36}},loc:{start:{line:1393,column:46},end:{line:1393,column:48}},line:1393},"78":{name:"(anonymous_78)",decl:{start:{line:1401,column:44},end:{line:1401,column:45}},loc:{start:{line:1401,column:68},end:{line:1409,column:13}},line:1401},"79":{name:"(anonymous_79)",decl:{start:{line:1414,column:18},end:{line:1414,column:19}},loc:{start:{line:1414,column:42},end:{line:1425,column:9}},line:1414},"80":{name:"(anonymous_80)",decl:{start:{line:1448,column:14},end:{line:1448,column:15}},loc:{start:{line:1448,column:38},end:{line:1505,column:9}},line:1448},"81":{name:"(anonymous_81)",decl:{start:{line:1524,column:16},end:{line:1524,column:17}},loc:{start:{line:1524,column:43},end:{line:1557,column:9}},line:1524},"82":{name:"(anonymous_82)",decl:{start:{line:1525,column:35},end:{line:1525,column:36}},loc:{start:{line:1525,column:46},end:{line:1525,column:48}},line:1525},"83":{name:"(anonymous_83)",decl:{start:{line:1527,column:44},end:{line:1527,column:45}},loc:{start:{line:1527,column:68},end:{line:1554,column:13}},line:1527},"84":{name:"(anonymous_84)",decl:{start:{line:1541,column:37},end:{line:1541,column:38}},loc:{start:{line:1541,column:48},end:{line:1548,column:25}},line:1541},"85":{name:"(anonymous_85)",decl:{start:{line:1574,column:14},end:{line:1574,column:15}},loc:{start:{line:1574,column:33},end:{line:1578,column:9}},line:1574},"86":{name:"(anonymous_86)",decl:{start:{line:1575,column:35},end:{line:1575,column:36}},loc:{start:{line:1575,column:46},end:{line:1575,column:48}},line:1575},"87":{name:"(anonymous_87)",decl:{start:{line:1595,column:14},end:{line:1595,column:15}},loc:{start:{line:1595,column:25},end:{line:1597,column:9}},line:1595},"88":{name:"(anonymous_88)",decl:{start:{line:1613,column:14},end:{line:1613,column:15}},loc:{start:{line:1613,column:49},end:{line:1621,column:9}},line:1613},"89":{name:"(anonymous_89)",decl:{start:{line:1636,column:20},end:{line:1636,column:21}},loc:{start:{line:1636,column:31},end:{line:1638,column:9}},line:1636},"90":{name:"(anonymous_90)",decl:{start:{line:1656,column:21},end:{line:1656,column:22}},loc:{start:{line:1656,column:40},end:{line:1665,column:9}},line:1656},"91":{name:"(anonymous_91)",decl:{start:{line:1657,column:35},end:{line:1657,column:36}},loc:{start:{line:1657,column:46},end:{line:1657,column:48}},line:1657},"92":{name:"(anonymous_92)",decl:{start:{line:1660,column:51},end:{line:1660,column:52}},loc:{start:{line:1660,column:65},end:{line:1662,column:13}},line:1660},"93":{name:"(anonymous_93)",decl:{start:{line:1688,column:18},end:{line:1688,column:19}},loc:{start:{line:1688,column:46},end:{line:1711,column:9}},line:1688},"94":{name:"(anonymous_94)",decl:{start:{line:1694,column:35},end:{line:1694,column:36}},loc:{start:{line:1694,column:46},end:{line:1694,column:48}},line:1694},"95":{name:"(anonymous_95)",decl:{start:{line:1698,column:53},end:{line:1698,column:54}},loc:{start:{line:1698,column:77},end:{line:1708,column:13}},line:1698},"96":{name:"(anonymous_96)",decl:{start:{line:1725,column:25},end:{line:1725,column:26}},loc:{start:{line:1725,column:36},end:{line:1727,column:9}},line:1725},"97":{name:"(anonymous_97)",decl:{start:{line:1748,column:17},end:{line:1748,column:18}},loc:{start:{line:1748,column:45},end:{line:1777,column:9}},line:1748},"98":{name:"(anonymous_98)",decl:{start:{line:1754,column:35},end:{line:1754,column:36}},loc:{start:{line:1754,column:46},end:{line:1754,column:48}},line:1754},"99":{name:"(anonymous_99)",decl:{start:{line:1758,column:48},end:{line:1758,column:49}},loc:{start:{line:1758,column:72},end:{line:1776,column:13}},line:1758},"100":{name:"(anonymous_100)",decl:{start:{line:1794,column:22},end:{line:1794,column:23}},loc:{start:{line:1794,column:41},end:{line:1801,column:9}},line:1794},"101":{name:"(anonymous_101)",decl:{start:{line:1795,column:35},end:{line:1795,column:36}},loc:{start:{line:1795,column:46},end:{line:1795,column:48}},line:1795},"102":{name:"(anonymous_102)",decl:{start:{line:1798,column:44},end:{line:1798,column:45}},loc:{start:{line:1798,column:68},end:{line:1800,column:13}},line:1798},"103":{name:"(anonymous_103)",decl:{start:{line:1815,column:16},end:{line:1815,column:17}},loc:{start:{line:1815,column:43},end:{line:1842,column:9}},line:1815},"104":{name:"(anonymous_104)",decl:{start:{line:1820,column:37},end:{line:1820,column:38}},loc:{start:{line:1820,column:59},end:{line:1835,column:17}},line:1820},"105":{name:"(anonymous_105)",decl:{start:{line:1826,column:52},end:{line:1826,column:53}},loc:{start:{line:1826,column:63},end:{line:1833,column:25}},line:1826},"106":{name:"(anonymous_106)",decl:{start:{line:1860,column:14},end:{line:1860,column:15}},loc:{start:{line:1860,column:25},end:{line:1862,column:9}},line:1860},"107":{name:"(anonymous_107)",decl:{start:{line:1872,column:27},end:{line:1872,column:28}},loc:{start:{line:1872,column:43},end:{line:1875,column:9}},line:1872},"108":{name:"(anonymous_108)",decl:{start:{line:1890,column:14},end:{line:1890,column:15}},loc:{start:{line:1890,column:43},end:{line:1892,column:9}},line:1890},"109":{name:"(anonymous_109)",decl:{start:{line:1909,column:14},end:{line:1909,column:15}},loc:{start:{line:1909,column:26},end:{line:1911,column:9}},line:1909},"110":{name:"(anonymous_110)",decl:{start:{line:1927,column:14},end:{line:1927,column:15}},loc:{start:{line:1927,column:50},end:{line:1930,column:9}},line:1927},"111":{name:"(anonymous_111)",decl:{start:{line:1956,column:14},end:{line:1956,column:15}},loc:{start:{line:1956,column:25},end:{line:1958,column:9}},line:1956},"112":{name:"(anonymous_112)",decl:{start:{line:1970,column:27},end:{line:1970,column:28}},loc:{start:{line:1970,column:43},end:{line:1973,column:9}},line:1970},"113":{name:"(anonymous_113)",decl:{start:{line:1988,column:14},end:{line:1988,column:15}},loc:{start:{line:1988,column:43},end:{line:1990,column:9}},line:1988},"114":{name:"(anonymous_114)",decl:{start:{line:2008,column:14},end:{line:2008,column:15}},loc:{start:{line:2008,column:25},end:{line:2010,column:9}},line:2008},"115":{name:"(anonymous_115)",decl:{start:{line:2020,column:17},end:{line:2020,column:18}},loc:{start:{line:2020,column:28},end:{line:2022,column:9}},line:2020},"116":{name:"(anonymous_116)",decl:{start:{line:2030,column:19},end:{line:2030,column:20}},loc:{start:{line:2030,column:30},end:{line:2032,column:9}},line:2030},"117":{name:"(anonymous_117)",decl:{start:{line:2043,column:22},end:{line:2043,column:23}},loc:{start:{line:2043,column:33},end:{line:2046,column:9}},line:2043},"118":{name:"(anonymous_118)",decl:{start:{line:2056,column:24},end:{line:2056,column:25}},loc:{start:{line:2056,column:35},end:{line:2058,column:9}},line:2056},"119":{name:"(anonymous_119)",decl:{start:{line:2066,column:25},end:{line:2066,column:26}},loc:{start:{line:2066,column:36},end:{line:2068,column:9}},line:2066},"120":{name:"(anonymous_120)",decl:{start:{line:2077,column:18},end:{line:2077,column:19}},loc:{start:{line:2077,column:29},end:{line:2079,column:9}},line:2077},"121":{name:"(anonymous_121)",decl:{start:{line:2087,column:13},end:{line:2087,column:14}},loc:{start:{line:2087,column:24},end:{line:2089,column:9}},line:2087},"122":{name:"(anonymous_122)",decl:{start:{line:2097,column:21},end:{line:2097,column:22}},loc:{start:{line:2097,column:32},end:{line:2099,column:9}},line:2097},"123":{name:"(anonymous_123)",decl:{start:{line:2109,column:29},end:{line:2109,column:30}},loc:{start:{line:2109,column:40},end:{line:2111,column:9}},line:2109},"124":{name:"(anonymous_124)",decl:{start:{line:2121,column:29},end:{line:2121,column:30}},loc:{start:{line:2121,column:40},end:{line:2123,column:9}},line:2121},"125":{name:"(anonymous_125)",decl:{start:{line:2139,column:14},end:{line:2139,column:15}},loc:{start:{line:2139,column:49},end:{line:2142,column:9}},line:2139},"126":{name:"(anonymous_126)",decl:{start:{line:2160,column:14},end:{line:2160,column:15}},loc:{start:{line:2160,column:25},end:{line:2162,column:9}},line:2160},"127":{name:"(anonymous_127)",decl:{start:{line:2172,column:15},end:{line:2172,column:16}},loc:{start:{line:2172,column:26},end:{line:2174,column:9}},line:2172},"128":{name:"(anonymous_128)",decl:{start:{line:2193,column:14},end:{line:2193,column:15}},loc:{start:{line:2193,column:42},end:{line:2221,column:9}},line:2193},"129":{name:"(anonymous_129)",decl:{start:{line:2199,column:35},end:{line:2199,column:36}},loc:{start:{line:2199,column:46},end:{line:2199,column:48}},line:2199},"130":{name:"(anonymous_130)",decl:{start:{line:2203,column:41},end:{line:2203,column:42}},loc:{start:{line:2203,column:65},end:{line:2220,column:13}},line:2203},"131":{name:"(anonymous_131)",decl:{start:{line:2237,column:14},end:{line:2237,column:15}},loc:{start:{line:2237,column:49},end:{line:2242,column:9}},line:2237},"132":{name:"(anonymous_132)",decl:{start:{line:2261,column:14},end:{line:2261,column:15}},loc:{start:{line:2261,column:25},end:{line:2263,column:9}},line:2261},"133":{name:"(anonymous_133)",decl:{start:{line:2273,column:27},end:{line:2273,column:28}},loc:{start:{line:2273,column:43},end:{line:2276,column:9}},line:2273},"134":{name:"(anonymous_134)",decl:{start:{line:2283,column:16},end:{line:2283,column:17}},loc:{start:{line:2283,column:27},end:{line:2285,column:9}},line:2283},"135":{name:"(anonymous_135)",decl:{start:{line:2300,column:14},end:{line:2300,column:15}},loc:{start:{line:2300,column:43},end:{line:2305,column:9}},line:2300},"136":{name:"(anonymous_136)",decl:{start:{line:2330,column:14},end:{line:2330,column:15}},loc:{start:{line:2330,column:25},end:{line:2332,column:9}},line:2330},"137":{name:"(anonymous_137)",decl:{start:{line:2344,column:14},end:{line:2344,column:15}},loc:{start:{line:2344,column:38},end:{line:2350,column:9}},line:2344},"138":{name:"(anonymous_138)",decl:{start:{line:2367,column:19},end:{line:2367,column:20}},loc:{start:{line:2367,column:38},end:{line:2379,column:9}},line:2367},"139":{name:"(anonymous_139)",decl:{start:{line:2368,column:35},end:{line:2368,column:36}},loc:{start:{line:2368,column:46},end:{line:2368,column:48}},line:2368},"140":{name:"(anonymous_140)",decl:{start:{line:2371,column:41},end:{line:2371,column:42}},loc:{start:{line:2371,column:65},end:{line:2378,column:13}},line:2371},"141":{name:"(anonymous_141)",decl:{start:{line:2396,column:20},end:{line:2396,column:21}},loc:{start:{line:2396,column:39},end:{line:2408,column:9}},line:2396},"142":{name:"(anonymous_142)",decl:{start:{line:2397,column:35},end:{line:2397,column:36}},loc:{start:{line:2397,column:46},end:{line:2397,column:48}},line:2397},"143":{name:"(anonymous_143)",decl:{start:{line:2400,column:42},end:{line:2400,column:43}},loc:{start:{line:2400,column:66},end:{line:2407,column:13}},line:2400},"144":{name:"(anonymous_144)",decl:{start:{line:2434,column:14},end:{line:2434,column:15}},loc:{start:{line:2434,column:25},end:{line:2436,column:9}},line:2434},"145":{name:"(anonymous_145)",decl:{start:{line:2446,column:27},end:{line:2446,column:28}},loc:{start:{line:2446,column:43},end:{line:2448,column:9}},line:2446},"146":{name:"(anonymous_146)",decl:{start:{line:2459,column:14},end:{line:2459,column:15}},loc:{start:{line:2459,column:32},end:{line:2461,column:9}},line:2459},"147":{name:"(anonymous_147)",decl:{start:{line:2477,column:14},end:{line:2477,column:15}},loc:{start:{line:2477,column:25},end:{line:2479,column:9}},line:2477},"148":{name:"(anonymous_148)",decl:{start:{line:2490,column:14},end:{line:2490,column:15}},loc:{start:{line:2490,column:32},end:{line:2493,column:9}},line:2490},"149":{name:"(anonymous_149)",decl:{start:{line:2510,column:14},end:{line:2510,column:15}},loc:{start:{line:2510,column:25},end:{line:2512,column:9}},line:2510},"150":{name:"(anonymous_150)",decl:{start:{line:2524,column:14},end:{line:2524,column:15}},loc:{start:{line:2524,column:38},end:{line:2527,column:9}},line:2524},"151":{name:"(anonymous_151)",decl:{start:{line:2553,column:14},end:{line:2553,column:15}},loc:{start:{line:2553,column:25},end:{line:2555,column:9}},line:2553},"152":{name:"(anonymous_152)",decl:{start:{line:2565,column:27},end:{line:2565,column:28}},loc:{start:{line:2565,column:43},end:{line:2567,column:9}},line:2565},"153":{name:"(anonymous_153)",decl:{start:{line:2578,column:14},end:{line:2578,column:15}},loc:{start:{line:2578,column:32},end:{line:2580,column:9}},line:2578},"154":{name:"(anonymous_154)",decl:{start:{line:2592,column:16},end:{line:2592,column:17}},loc:{start:{line:2592,column:43},end:{line:2617,column:9}},line:2592},"155":{name:"(anonymous_155)",decl:{start:{line:2593,column:35},end:{line:2593,column:36}},loc:{start:{line:2593,column:46},end:{line:2593,column:48}},line:2593},"156":{name:"(anonymous_156)",decl:{start:{line:2596,column:44},end:{line:2596,column:45}},loc:{start:{line:2596,column:68},end:{line:2614,column:13}},line:2596},"157":{name:"(anonymous_157)",decl:{start:{line:2605,column:33},end:{line:2605,column:34}},loc:{start:{line:2605,column:44},end:{line:2612,column:21}},line:2605},"158":{name:"(anonymous_158)",decl:{start:{line:2634,column:14},end:{line:2634,column:15}},loc:{start:{line:2634,column:25},end:{line:2636,column:9}},line:2634},"159":{name:"(anonymous_159)",decl:{start:{line:2652,column:14},end:{line:2652,column:15}},loc:{start:{line:2652,column:49},end:{line:2655,column:9}},line:2652},"160":{name:"(anonymous_160)",decl:{start:{line:2672,column:14},end:{line:2672,column:15}},loc:{start:{line:2672,column:25},end:{line:2674,column:9}},line:2672},"161":{name:"(anonymous_161)",decl:{start:{line:2684,column:27},end:{line:2684,column:28}},loc:{start:{line:2684,column:43},end:{line:2687,column:9}},line:2684},"162":{name:"(anonymous_162)",decl:{start:{line:2702,column:14},end:{line:2702,column:15}},loc:{start:{line:2702,column:43},end:{line:2704,column:9}},line:2702},"163":{name:"(anonymous_163)",decl:{start:{line:2720,column:14},end:{line:2720,column:15}},loc:{start:{line:2720,column:25},end:{line:2722,column:9}},line:2720},"164":{name:"(anonymous_164)",decl:{start:{line:2738,column:14},end:{line:2738,column:15}},loc:{start:{line:2738,column:49},end:{line:2743,column:9}},line:2738},"165":{name:"(anonymous_165)",decl:{start:{line:2766,column:21},end:{line:2766,column:22}},loc:{start:{line:2766,column:55},end:{line:2782,column:9}},line:2766},"166":{name:"(anonymous_166)",decl:{start:{line:2772,column:35},end:{line:2772,column:36}},loc:{start:{line:2772,column:46},end:{line:2772,column:48}},line:2772},"167":{name:"(anonymous_167)",decl:{start:{line:2779,column:51},end:{line:2779,column:52}},loc:{start:{line:2779,column:73},end:{line:2781,column:13}},line:2779},"168":{name:"(anonymous_168)",decl:{start:{line:2784,column:16},end:{line:2784,column:17}},loc:{start:{line:2784,column:35},end:{line:2791,column:9}},line:2784},"169":{name:"(anonymous_169)",decl:{start:{line:2808,column:14},end:{line:2808,column:15}},loc:{start:{line:2808,column:25},end:{line:2810,column:9}},line:2808},"170":{name:"(anonymous_170)",decl:{start:{line:2820,column:27},end:{line:2820,column:28}},loc:{start:{line:2820,column:43},end:{line:2823,column:9}},line:2820},"171":{name:"(anonymous_171)",decl:{start:{line:2838,column:14},end:{line:2838,column:15}},loc:{start:{line:2838,column:43},end:{line:2840,column:9}},line:2838},"172":{name:"(anonymous_172)",decl:{start:{line:2859,column:16},end:{line:2859,column:17}},loc:{start:{line:2859,column:49},end:{line:2872,column:9}},line:2859},"173":{name:"(anonymous_173)",decl:{start:{line:2889,column:14},end:{line:2889,column:15}},loc:{start:{line:2889,column:25},end:{line:2892,column:9}},line:2889},"174":{name:"(anonymous_174)",decl:{start:{line:2909,column:14},end:{line:2909,column:15}},loc:{start:{line:2909,column:55},end:{line:2913,column:9}},line:2909},"175":{name:"(anonymous_175)",decl:{start:{line:2931,column:14},end:{line:2931,column:15}},loc:{start:{line:2931,column:25},end:{line:2933,column:9}},line:2931},"176":{name:"(anonymous_176)",decl:{start:{line:2945,column:26},end:{line:2945,column:27}},loc:{start:{line:2945,column:37},end:{line:2947,column:9}},line:2945},"177":{name:"(anonymous_177)",decl:{start:{line:2957,column:27},end:{line:2957,column:28}},loc:{start:{line:2957,column:43},end:{line:2960,column:9}},line:2957},"178":{name:"(anonymous_178)",decl:{start:{line:2976,column:14},end:{line:2976,column:15}},loc:{start:{line:2976,column:49},end:{line:2979,column:9}},line:2976},"179":{name:"(anonymous_179)",decl:{start:{line:2998,column:16},end:{line:2998,column:17}},loc:{start:{line:2998,column:55},end:{line:3016,column:9}},line:2998},"180":{name:"(anonymous_180)",decl:{start:{line:3042,column:14},end:{line:3042,column:15}},loc:{start:{line:3042,column:25},end:{line:3044,column:9}},line:3042},"181":{name:"(anonymous_181)",decl:{start:{line:3054,column:27},end:{line:3054,column:28}},loc:{start:{line:3054,column:43},end:{line:3056,column:9}},line:3054},"182":{name:"(anonymous_182)",decl:{start:{line:3071,column:14},end:{line:3071,column:15}},loc:{start:{line:3071,column:43},end:{line:3077,column:9}},line:3071},"183":{name:"(anonymous_183)",decl:{start:{line:3095,column:16},end:{line:3095,column:17}},loc:{start:{line:3095,column:45},end:{line:3123,column:9}},line:3095},"184":{name:"(anonymous_184)",decl:{start:{line:3102,column:35},end:{line:3102,column:36}},loc:{start:{line:3102,column:46},end:{line:3102,column:48}},line:3102},"185":{name:"(anonymous_185)",decl:{start:{line:3105,column:56},end:{line:3105,column:57}},loc:{start:{line:3105,column:80},end:{line:3120,column:13}},line:3105},"186":{name:"(anonymous_186)",decl:{start:{line:3111,column:33},end:{line:3111,column:34}},loc:{start:{line:3111,column:44},end:{line:3118,column:21}},line:3111},"187":{name:"(anonymous_187)",decl:{start:{line:3125,column:23},end:{line:3125,column:24}},loc:{start:{line:3125,column:48},end:{line:3151,column:9}},line:3125},"188":{name:"(anonymous_188)",decl:{start:{line:3133,column:58},end:{line:3133,column:59}},loc:{start:{line:3133,column:63},end:{line:3133,column:82}},line:3133},"189":{name:"(anonymous_189)",decl:{start:{line:3153,column:25},end:{line:3153,column:26}},loc:{start:{line:3153,column:54},end:{line:3169,column:9}},line:3153},"190":{name:"(anonymous_190)",decl:{start:{line:3171,column:19},end:{line:3171,column:20}},loc:{start:{line:3171,column:90},end:{line:3212,column:9}},line:3171},"191":{name:"(anonymous_191)",decl:{start:{line:3172,column:35},end:{line:3172,column:36}},loc:{start:{line:3172,column:46},end:{line:3172,column:48}},line:3172},"192":{name:"(anonymous_192)",decl:{start:{line:3185,column:20},end:{line:3185,column:21}},loc:{start:{line:3185,column:38},end:{line:3185,column:92}},line:3185},"193":{name:"(anonymous_193)",decl:{start:{line:3200,column:55},end:{line:3200,column:56}},loc:{start:{line:3200,column:81},end:{line:3203,column:17}},line:3200},"194":{name:"(anonymous_194)",decl:{start:{line:3207,column:49},end:{line:3207,column:50}},loc:{start:{line:3207,column:73},end:{line:3210,column:17}},line:3207},"195":{name:"(anonymous_195)",decl:{start:{line:3229,column:14},end:{line:3229,column:15}},loc:{start:{line:3229,column:25},end:{line:3231,column:9}},line:3229},"196":{name:"(anonymous_196)",decl:{start:{line:3247,column:14},end:{line:3247,column:15}},loc:{start:{line:3247,column:48},end:{line:3269,column:9}},line:3247},"197":{name:"(anonymous_197)",decl:{start:{line:3286,column:16},end:{line:3286,column:17}},loc:{start:{line:3286,column:35},end:{line:3290,column:9}},line:3286},"198":{name:"(anonymous_198)",decl:{start:{line:3307,column:24},end:{line:3307,column:25}},loc:{start:{line:3307,column:43},end:{line:3316,column:9}},line:3307},"199":{name:"(anonymous_199)",decl:{start:{line:3308,column:35},end:{line:3308,column:36}},loc:{start:{line:3308,column:46},end:{line:3308,column:48}},line:3308},"200":{name:"(anonymous_200)",decl:{start:{line:3311,column:71},end:{line:3311,column:72}},loc:{start:{line:3311,column:85},end:{line:3313,column:13}},line:3311},"201":{name:"(anonymous_201)",decl:{start:{line:3333,column:23},end:{line:3333,column:24}},loc:{start:{line:3333,column:42},end:{line:3342,column:9}},line:3333},"202":{name:"(anonymous_202)",decl:{start:{line:3334,column:35},end:{line:3334,column:36}},loc:{start:{line:3334,column:46},end:{line:3334,column:48}},line:3334},"203":{name:"(anonymous_203)",decl:{start:{line:3337,column:70},end:{line:3337,column:71}},loc:{start:{line:3337,column:84},end:{line:3339,column:13}},line:3337},"204":{name:"(anonymous_204)",decl:{start:{line:3360,column:16},end:{line:3360,column:17}},loc:{start:{line:3360,column:43},end:{line:3374,column:9}},line:3360},"205":{name:"(anonymous_205)",decl:{start:{line:3361,column:35},end:{line:3361,column:36}},loc:{start:{line:3361,column:46},end:{line:3361,column:48}},line:3361},"206":{name:"(anonymous_206)",decl:{start:{line:3366,column:46},end:{line:3366,column:47}},loc:{start:{line:3366,column:70},end:{line:3373,column:13}},line:3366},"207":{name:"(anonymous_207)",decl:{start:{line:3391,column:18},end:{line:3391,column:19}},loc:{start:{line:3391,column:37},end:{line:3400,column:9}},line:3391},"208":{name:"(anonymous_208)",decl:{start:{line:3392,column:35},end:{line:3392,column:36}},loc:{start:{line:3392,column:46},end:{line:3392,column:48}},line:3392},"209":{name:"(anonymous_209)",decl:{start:{line:3395,column:65},end:{line:3395,column:66}},loc:{start:{line:3395,column:79},end:{line:3397,column:13}},line:3395},"210":{name:"(anonymous_210)",decl:{start:{line:3413,column:18},end:{line:3413,column:19}},loc:{start:{line:3413,column:41},end:{line:3415,column:9}},line:3413},"211":{name:"(anonymous_211)",decl:{start:{line:3432,column:15},end:{line:3432,column:16}},loc:{start:{line:3432,column:34},end:{line:3441,column:9}},line:3432},"212":{name:"(anonymous_212)",decl:{start:{line:3433,column:35},end:{line:3433,column:36}},loc:{start:{line:3433,column:46},end:{line:3433,column:48}},line:3433},"213":{name:"(anonymous_213)",decl:{start:{line:3436,column:62},end:{line:3436,column:63}},loc:{start:{line:3436,column:76},end:{line:3438,column:13}},line:3436},"214":{name:"(anonymous_214)",decl:{start:{line:3459,column:17},end:{line:3459,column:18}},loc:{start:{line:3459,column:44},end:{line:3473,column:9}},line:3459},"215":{name:"(anonymous_215)",decl:{start:{line:3460,column:35},end:{line:3460,column:36}},loc:{start:{line:3460,column:46},end:{line:3460,column:48}},line:3460},"216":{name:"(anonymous_216)",decl:{start:{line:3465,column:55},end:{line:3465,column:56}},loc:{start:{line:3465,column:79},end:{line:3472,column:13}},line:3465},"217":{name:"(anonymous_217)",decl:{start:{line:3496,column:17},end:{line:3496,column:18}},loc:{start:{line:3496,column:44},end:{line:3510,column:9}},line:3496},"218":{name:"(anonymous_218)",decl:{start:{line:3497,column:35},end:{line:3497,column:36}},loc:{start:{line:3497,column:46},end:{line:3497,column:48}},line:3497},"219":{name:"(anonymous_219)",decl:{start:{line:3502,column:47},end:{line:3502,column:48}},loc:{start:{line:3502,column:71},end:{line:3509,column:13}},line:3502},"220":{name:"(anonymous_220)",decl:{start:{line:3527,column:19},end:{line:3527,column:20}},loc:{start:{line:3527,column:38},end:{line:3539,column:9}},line:3527},"221":{name:"(anonymous_221)",decl:{start:{line:3528,column:35},end:{line:3528,column:36}},loc:{start:{line:3528,column:46},end:{line:3528,column:48}},line:3528},"222":{name:"(anonymous_222)",decl:{start:{line:3531,column:46},end:{line:3531,column:47}},loc:{start:{line:3531,column:70},end:{line:3538,column:13}},line:3531},"223":{name:"(anonymous_223)",decl:{start:{line:3557,column:21},end:{line:3557,column:22}},loc:{start:{line:3557,column:47},end:{line:3566,column:9}},line:3557},"224":{name:"(anonymous_224)",decl:{start:{line:3558,column:35},end:{line:3558,column:36}},loc:{start:{line:3558,column:46},end:{line:3558,column:48}},line:3558},"225":{name:"(anonymous_225)",decl:{start:{line:3561,column:85},end:{line:3561,column:86}},loc:{start:{line:3561,column:99},end:{line:3563,column:13}},line:3561},"226":{name:"(anonymous_226)",decl:{start:{line:3585,column:16},end:{line:3585,column:17}},loc:{start:{line:3585,column:42},end:{line:3594,column:9}},line:3585},"227":{name:"(anonymous_227)",decl:{start:{line:3586,column:35},end:{line:3586,column:36}},loc:{start:{line:3586,column:46},end:{line:3586,column:48}},line:3586},"228":{name:"(anonymous_228)",decl:{start:{line:3589,column:75},end:{line:3589,column:76}},loc:{start:{line:3589,column:89},end:{line:3591,column:13}},line:3589},"229":{name:"(anonymous_229)",decl:{start:{line:3612,column:17},end:{line:3612,column:18}},loc:{start:{line:3612,column:44},end:{line:3624,column:9}},line:3612},"230":{name:"(anonymous_230)",decl:{start:{line:3613,column:35},end:{line:3613,column:36}},loc:{start:{line:3613,column:46},end:{line:3613,column:48}},line:3613},"231":{name:"(anonymous_231)",decl:{start:{line:3616,column:47},end:{line:3616,column:48}},loc:{start:{line:3616,column:71},end:{line:3623,column:13}},line:3616},"232":{name:"(anonymous_232)",decl:{start:{line:3642,column:18},end:{line:3642,column:19}},loc:{start:{line:3642,column:45},end:{line:3654,column:9}},line:3642},"233":{name:"(anonymous_233)",decl:{start:{line:3643,column:35},end:{line:3643,column:36}},loc:{start:{line:3643,column:46},end:{line:3643,column:48}},line:3643},"234":{name:"(anonymous_234)",decl:{start:{line:3646,column:48},end:{line:3646,column:49}},loc:{start:{line:3646,column:72},end:{line:3653,column:13}},line:3646},"235":{name:"(anonymous_235)",decl:{start:{line:3672,column:15},end:{line:3672,column:16}},loc:{start:{line:3672,column:34},end:{line:3681,column:9}},line:3672},"236":{name:"(anonymous_236)",decl:{start:{line:3673,column:35},end:{line:3673,column:36}},loc:{start:{line:3673,column:46},end:{line:3673,column:48}},line:3673},"237":{name:"(anonymous_237)",decl:{start:{line:3676,column:62},end:{line:3676,column:63}},loc:{start:{line:3676,column:76},end:{line:3678,column:13}},line:3676},"238":{name:"(anonymous_238)",decl:{start:{line:3699,column:15},end:{line:3699,column:16}},loc:{start:{line:3699,column:44},end:{line:3787,column:9}},line:3699},"239":{name:"(anonymous_239)",decl:{start:{line:3715,column:49},end:{line:3715,column:50}},loc:{start:{line:3715,column:60},end:{line:3715,column:62}},line:3715},"240":{name:"(anonymous_240)",decl:{start:{line:3716,column:55},end:{line:3716,column:56}},loc:{start:{line:3716,column:66},end:{line:3716,column:68}},line:3716},"241":{name:"(anonymous_241)",decl:{start:{line:3717,column:47},end:{line:3717,column:48}},loc:{start:{line:3717,column:58},end:{line:3717,column:60}},line:3717},"242":{name:"(anonymous_242)",decl:{start:{line:3718,column:51},end:{line:3718,column:52}},loc:{start:{line:3718,column:62},end:{line:3718,column:64}},line:3718},"243":{name:"(anonymous_243)",decl:{start:{line:3719,column:49},end:{line:3719,column:50}},loc:{start:{line:3719,column:60},end:{line:3719,column:62}},line:3719},"244":{name:"(anonymous_244)",decl:{start:{line:3722,column:57},end:{line:3722,column:58}},loc:{start:{line:3722,column:68},end:{line:3722,column:70}},line:3722},"245":{name:"(anonymous_245)",decl:{start:{line:3723,column:75},end:{line:3723,column:76}},loc:{start:{line:3723,column:86},end:{line:3723,column:88}},line:3723},"246":{name:"(anonymous_246)",decl:{start:{line:3729,column:16},end:{line:3729,column:17}},loc:{start:{line:3729,column:27},end:{line:3729,column:51}},line:3729},"247":{name:"(anonymous_247)",decl:{start:{line:3730,column:16},end:{line:3730,column:17}},loc:{start:{line:3730,column:40},end:{line:3780,column:17}},line:3730},"248":{name:"(anonymous_248)",decl:{start:{line:3731,column:31},end:{line:3731,column:32}},loc:{start:{line:3731,column:50},end:{line:3779,column:21}},line:3731},"249":{name:"(anonymous_249)",decl:{start:{line:3781,column:16},end:{line:3781,column:17}},loc:{start:{line:3781,column:30},end:{line:3785,column:17}},line:3781},"250":{name:"(anonymous_250)",decl:{start:{line:3804,column:17},end:{line:3804,column:18}},loc:{start:{line:3804,column:36},end:{line:3813,column:9}},line:3804},"251":{name:"(anonymous_251)",decl:{start:{line:3805,column:35},end:{line:3805,column:36}},loc:{start:{line:3805,column:46},end:{line:3805,column:48}},line:3805},"252":{name:"(anonymous_252)",decl:{start:{line:3808,column:64},end:{line:3808,column:65}},loc:{start:{line:3808,column:78},end:{line:3810,column:13}},line:3808},"253":{name:"(anonymous_253)",decl:{start:{line:3830,column:14},end:{line:3830,column:15}},loc:{start:{line:3830,column:25},end:{line:3832,column:9}},line:3830},"254":{name:"(anonymous_254)",decl:{start:{line:3842,column:27},end:{line:3842,column:28}},loc:{start:{line:3842,column:43},end:{line:3846,column:9}},line:3842},"255":{name:"(anonymous_255)",decl:{start:{line:3861,column:14},end:{line:3861,column:15}},loc:{start:{line:3861,column:43},end:{line:3867,column:9}},line:3861},"256":{name:"(anonymous_256)",decl:{start:{line:3886,column:16},end:{line:3886,column:17}},loc:{start:{line:3886,column:50},end:{line:3917,column:9}},line:3886},"257":{name:"(anonymous_257)",decl:{start:{line:3895,column:35},end:{line:3895,column:36}},loc:{start:{line:3895,column:46},end:{line:3895,column:48}},line:3895},"258":{name:"(anonymous_258)",decl:{start:{line:3908,column:41},end:{line:3908,column:42}},loc:{start:{line:3908,column:65},end:{line:3916,column:13}},line:3908},"259":{name:"(anonymous_259)",decl:{start:{line:3944,column:16},end:{line:3944,column:17}},loc:{start:{line:3944,column:50},end:{line:3946,column:9}},line:3944},"260":{name:"(anonymous_260)",decl:{start:{line:3969,column:23},end:{line:3969,column:24}},loc:{start:{line:3969,column:57},end:{line:4014,column:9}},line:3969},"261":{name:"(anonymous_261)",decl:{start:{line:3978,column:35},end:{line:3978,column:36}},loc:{start:{line:3978,column:46},end:{line:3978,column:48}},line:3978},"262":{name:"(anonymous_262)",decl:{start:{line:4003,column:16},end:{line:4003,column:17}},loc:{start:{line:4003,column:40},end:{line:4010,column:17}},line:4003},"263":{name:"(anonymous_263)",decl:{start:{line:4071,column:14},end:{line:4071,column:15}},loc:{start:{line:4071,column:30},end:{line:4086,column:9}},line:4071},"264":{name:"(anonymous_264)",decl:{start:{line:4095,column:18},end:{line:4095,column:19}},loc:{start:{line:4095,column:29},end:{line:4097,column:9}},line:4095},"265":{name:"(anonymous_265)",decl:{start:{line:4106,column:18},end:{line:4106,column:19}},loc:{start:{line:4106,column:29},end:{line:4108,column:9}},line:4106},"266":{name:"(anonymous_266)",decl:{start:{line:4117,column:21},end:{line:4117,column:22}},loc:{start:{line:4117,column:32},end:{line:4119,column:9}},line:4117},"267":{name:"(anonymous_267)",decl:{start:{line:4128,column:23},end:{line:4128,column:24}},loc:{start:{line:4128,column:34},end:{line:4130,column:9}},line:4128},"268":{name:"(anonymous_268)",decl:{start:{line:4139,column:22},end:{line:4139,column:23}},loc:{start:{line:4139,column:33},end:{line:4141,column:9}},line:4139},"269":{name:"(anonymous_269)",decl:{start:{line:4150,column:16},end:{line:4150,column:17}},loc:{start:{line:4150,column:27},end:{line:4152,column:9}},line:4150},"270":{name:"(anonymous_270)",decl:{start:{line:4161,column:19},end:{line:4161,column:20}},loc:{start:{line:4161,column:30},end:{line:4163,column:9}},line:4161},"271":{name:"(anonymous_271)",decl:{start:{line:4191,column:14},end:{line:4191,column:15}},loc:{start:{line:4191,column:30},end:{line:4198,column:9}},line:4191},"272":{name:"(anonymous_272)",decl:{start:{line:4257,column:14},end:{line:4257,column:15}},loc:{start:{line:4257,column:30},end:{line:4283,column:9}},line:4257},"273":{name:"(anonymous_273)",decl:{start:{line:4292,column:26},end:{line:4292,column:27}},loc:{start:{line:4292,column:37},end:{line:4294,column:9}},line:4292},"274":{name:"(anonymous_274)",decl:{start:{line:4303,column:20},end:{line:4303,column:21}},loc:{start:{line:4303,column:31},end:{line:4305,column:9}},line:4303},"275":{name:"(anonymous_275)",decl:{start:{line:4314,column:18},end:{line:4314,column:19}},loc:{start:{line:4314,column:29},end:{line:4316,column:9}},line:4314},"276":{name:"(anonymous_276)",decl:{start:{line:4325,column:16},end:{line:4325,column:17}},loc:{start:{line:4325,column:27},end:{line:4327,column:9}},line:4325},"277":{name:"(anonymous_277)",decl:{start:{line:4336,column:15},end:{line:4336,column:16}},loc:{start:{line:4336,column:26},end:{line:4338,column:9}},line:4336},"278":{name:"(anonymous_278)",decl:{start:{line:4347,column:17},end:{line:4347,column:18}},loc:{start:{line:4347,column:28},end:{line:4349,column:9}},line:4347},"279":{name:"(anonymous_279)",decl:{start:{line:4382,column:14},end:{line:4382,column:15}},loc:{start:{line:4382,column:39},end:{line:4391,column:9}},line:4382},"280":{name:"(anonymous_280)",decl:{start:{line:4401,column:13},end:{line:4401,column:14}},loc:{start:{line:4401,column:38},end:{line:4412,column:9}},line:4401},"281":{name:"(anonymous_281)",decl:{start:{line:4543,column:14},end:{line:4543,column:15}},loc:{start:{line:4543,column:40},end:{line:4555,column:9}},line:4543},"282":{name:"(anonymous_282)",decl:{start:{line:4568,column:28},end:{line:4568,column:29}},loc:{start:{line:4568,column:42},end:{line:4580,column:9}},line:4568},"283":{name:"(anonymous_283)",decl:{start:{line:4594,column:19},end:{line:4594,column:20}},loc:{start:{line:4594,column:80},end:{line:4627,column:9}},line:4594},"284":{name:"(anonymous_284)",decl:{start:{line:4642,column:24},end:{line:4642,column:25}},loc:{start:{line:4642,column:96},end:{line:4682,column:9}},line:4642},"285":{name:"(anonymous_285)",decl:{start:{line:4693,column:21},end:{line:4693,column:22}},loc:{start:{line:4693,column:48},end:{line:4716,column:9}},line:4693},"286":{name:"(anonymous_286)",decl:{start:{line:4737,column:26},end:{line:4737,column:27}},loc:{start:{line:4737,column:57},end:{line:4769,column:9}},line:4737},"287":{name:"(anonymous_287)",decl:{start:{line:4782,column:28},end:{line:4782,column:29}},loc:{start:{line:4782,column:88},end:{line:4801,column:9}},line:4782},"288":{name:"(anonymous_288)",decl:{start:{line:4813,column:30},end:{line:4813,column:31}},loc:{start:{line:4813,column:62},end:{line:4834,column:9}},line:4813},"289":{name:"(anonymous_289)",decl:{start:{line:4845,column:24},end:{line:4845,column:25}},loc:{start:{line:4845,column:44},end:{line:4867,column:9}},line:4845},"290":{name:"(anonymous_290)",decl:{start:{line:4882,column:29},end:{line:4882,column:30}},loc:{start:{line:4882,column:57},end:{line:4916,column:9}},line:4882},"291":{name:"(anonymous_291)",decl:{start:{line:4928,column:31},end:{line:4928,column:32}},loc:{start:{line:4928,column:88},end:{line:4946,column:9}},line:4928},"292":{name:"(anonymous_292)",decl:{start:{line:4957,column:33},end:{line:4957,column:34}},loc:{start:{line:4957,column:58},end:{line:4977,column:9}},line:4957},"293":{name:"(anonymous_293)",decl:{start:{line:4989,column:22},end:{line:4989,column:23}},loc:{start:{line:4989,column:64},end:{line:5059,column:9}},line:4989},"294":{name:"(anonymous_294)",decl:{start:{line:5068,column:22},end:{line:5068,column:23}},loc:{start:{line:5068,column:33},end:{line:5077,column:9}},line:5068},"295":{name:"(anonymous_295)",decl:{start:{line:5101,column:15},end:{line:5101,column:16}},loc:{start:{line:5101,column:34},end:{line:5125,column:9}},line:5101},"296":{name:"(anonymous_296)",decl:{start:{line:5112,column:110},end:{line:5112,column:111}},loc:{start:{line:5112,column:134},end:{line:5124,column:13}},line:5112},"297":{name:"(anonymous_297)",decl:{start:{line:5153,column:13},end:{line:5153,column:14}},loc:{start:{line:5153,column:38},end:{line:5168,column:9}},line:5153},"298":{name:"(anonymous_298)",decl:{start:{line:5160,column:23},end:{line:5160,column:24}},loc:{start:{line:5160,column:44},end:{line:5167,column:13}},line:5160},"299":{name:"(anonymous_299)",decl:{start:{line:5224,column:14},end:{line:5224,column:15}},loc:{start:{line:5224,column:47},end:{line:5270,column:9}},line:5224},"300":{name:"(anonymous_300)",decl:{start:{line:5279,column:22},end:{line:5279,column:23}},loc:{start:{line:5279,column:33},end:{line:5281,column:9}},line:5279},"301":{name:"(anonymous_301)",decl:{start:{line:5290,column:27},end:{line:5290,column:28}},loc:{start:{line:5290,column:38},end:{line:5292,column:9}},line:5290},"302":{name:"(anonymous_302)",decl:{start:{line:5302,column:20},end:{line:5302,column:21}},loc:{start:{line:5302,column:31},end:{line:5304,column:9}},line:5302},"303":{name:"(anonymous_303)",decl:{start:{line:5316,column:21},end:{line:5316,column:22}},loc:{start:{line:5316,column:36},end:{line:5318,column:9}},line:5316},"304":{name:"(anonymous_304)",decl:{start:{line:5330,column:19},end:{line:5330,column:20}},loc:{start:{line:5330,column:30},end:{line:5348,column:9}},line:5330},"305":{name:"(anonymous_305)",decl:{start:{line:5360,column:23},end:{line:5360,column:24}},loc:{start:{line:5360,column:34},end:{line:5362,column:9}},line:5360},"306":{name:"(anonymous_306)",decl:{start:{line:5373,column:26},end:{line:5373,column:27}},loc:{start:{line:5373,column:36},end:{line:5385,column:9}},line:5373},"307":{name:"(anonymous_307)",decl:{start:{line:5396,column:30},end:{line:5396,column:31}},loc:{start:{line:5396,column:41},end:{line:5398,column:9}},line:5396},"308":{name:"(anonymous_308)",decl:{start:{line:5409,column:18},end:{line:5409,column:19}},loc:{start:{line:5409,column:38},end:{line:5411,column:9}},line:5409},"309":{name:"(anonymous_309)",decl:{start:{line:5422,column:24},end:{line:5422,column:25}},loc:{start:{line:5422,column:35},end:{line:5424,column:9}},line:5422},"310":{name:"(anonymous_310)",decl:{start:{line:5452,column:36},end:{line:5452,column:37}},loc:{start:{line:5452,column:69},end:{line:5463,column:9}},line:5452},"311":{name:"(anonymous_311)",decl:{start:{line:5484,column:21},end:{line:5484,column:22}},loc:{start:{line:5484,column:61},end:{line:5489,column:9}},line:5484},"312":{name:"(anonymous_312)",decl:{start:{line:5500,column:16},end:{line:5500,column:17}},loc:{start:{line:5500,column:27},end:{line:5502,column:9}},line:5500},"313":{name:"(anonymous_313)",decl:{start:{line:5511,column:34},end:{line:5511,column:35}},loc:{start:{line:5511,column:45},end:{line:5514,column:9}},line:5511},"314":{name:"(anonymous_314)",decl:{start:{line:5532,column:14},end:{line:5532,column:15}},loc:{start:{line:5532,column:25},end:{line:5534,column:9}},line:5532},"315":{name:"(anonymous_315)",decl:{start:{line:5554,column:14},end:{line:5554,column:15}},loc:{start:{line:5554,column:56},end:{line:5591,column:9}},line:5554},"316":{name:"(anonymous_316)",decl:{start:{line:5600,column:23},end:{line:5600,column:24}},loc:{start:{line:5600,column:34},end:{line:5602,column:9}},line:5600},"317":{name:"(anonymous_317)",decl:{start:{line:5612,column:22},end:{line:5612,column:23}},loc:{start:{line:5612,column:37},end:{line:5619,column:9}},line:5612},"318":{name:"(anonymous_318)",decl:{start:{line:5628,column:19},end:{line:5628,column:20}},loc:{start:{line:5628,column:34},end:{line:5630,column:9}},line:5628},"319":{name:"(anonymous_319)",decl:{start:{line:5644,column:16},end:{line:5644,column:17}},loc:{start:{line:5644,column:42},end:{line:5678,column:9}},line:5644},"320":{name:"(anonymous_320)",decl:{start:{line:5649,column:35},end:{line:5649,column:36}},loc:{start:{line:5649,column:46},end:{line:5649,column:48}},line:5649},"321":{name:"(anonymous_321)",decl:{start:{line:5669,column:47},end:{line:5669,column:48}},loc:{start:{line:5669,column:71},end:{line:5677,column:13}},line:5669},"322":{name:"(anonymous_322)",decl:{start:{line:5696,column:14},end:{line:5696,column:15}},loc:{start:{line:5696,column:25},end:{line:5698,column:9}},line:5696},"323":{name:"(anonymous_323)",decl:{start:{line:5712,column:14},end:{line:5712,column:15}},loc:{start:{line:5712,column:43},end:{line:5716,column:9}},line:5712},"324":{name:"(anonymous_324)",decl:{start:{line:5730,column:16},end:{line:5730,column:17}},loc:{start:{line:5730,column:49},end:{line:5752,column:9}},line:5730},"325":{name:"(anonymous_325)",decl:{start:{line:5739,column:35},end:{line:5739,column:36}},loc:{start:{line:5739,column:45},end:{line:5739,column:47}},line:5739},"326":{name:"(anonymous_326)",decl:{start:{line:5743,column:84},end:{line:5743,column:85}},loc:{start:{line:5743,column:108},end:{line:5751,column:13}},line:5743},"327":{name:"(anonymous_327)",decl:{start:{line:5764,column:27},end:{line:5764,column:28}},loc:{start:{line:5764,column:43},end:{line:5767,column:9}},line:5764},"328":{name:"(anonymous_328)",decl:{start:{line:5773,column:14},end:{line:5773,column:15}},loc:{start:{line:5773,column:41},end:{line:5779,column:9}},line:5773},"329":{name:"(anonymous_329)",decl:{start:{line:5782,column:14},end:{line:5782,column:15}},loc:{start:{line:5782,column:33},end:{line:5801,column:9}},line:5782},"330":{name:"(anonymous_330)",decl:{start:{line:5783,column:35},end:{line:5783,column:36}},loc:{start:{line:5783,column:46},end:{line:5783,column:48}},line:5783},"331":{name:"(anonymous_331)",decl:{start:{line:5790,column:42},end:{line:5790,column:43}},loc:{start:{line:5790,column:65},end:{line:5800,column:13}},line:5790}},branchMap:{"0":{loc:{start:{line:26,column:15},end:{line:26,column:30}},type:"binary-expr",locations:[{start:{line:26,column:15},end:{line:26,column:22}},{start:{line:26,column:26},end:{line:26,column:30}}],line:26},"1":{loc:{start:{line:397,column:12},end:{line:400,column:13}},type:"if",locations:[{start:{line:397,column:12},end:{line:400,column:13}},{start:{line:397,column:12},end:{line:400,column:13}}],line:397},"2":{loc:{start:{line:397,column:16},end:{line:397,column:56}},type:"binary-expr",locations:[{start:{line:397,column:16},end:{line:397,column:25}},{start:{line:397,column:29},end:{line:397,column:56}}],line:397},"3":{loc:{start:{line:420,column:12},end:{line:423,column:13}},type:"if",locations:[{start:{line:420,column:12},end:{line:423,column:13}},{start:{line:420,column:12},end:{line:423,column:13}}],line:420},"4":{loc:{start:{line:420,column:16},end:{line:420,column:56}},type:"binary-expr",locations:[{start:{line:420,column:16},end:{line:420,column:25}},{start:{line:420,column:29},end:{line:420,column:56}}],line:420},"5":{loc:{start:{line:453,column:12},end:{line:456,column:13}},type:"if",locations:[{start:{line:453,column:12},end:{line:456,column:13}},{start:{line:453,column:12},end:{line:456,column:13}}],line:453},"6":{loc:{start:{line:453,column:16},end:{line:453,column:56}},type:"binary-expr",locations:[{start:{line:453,column:16},end:{line:453,column:25}},{start:{line:453,column:29},end:{line:453,column:56}}],line:453},"7":{loc:{start:{line:478,column:23},end:{line:478,column:48}},type:"binary-expr",locations:[{start:{line:478,column:23},end:{line:478,column:31}},{start:{line:478,column:35},end:{line:478,column:48}}],line:478},"8":{loc:{start:{line:482,column:16},end:{line:496,column:17}},type:"if",locations:[{start:{line:482,column:16},end:{line:496,column:17}},{start:{line:482,column:16},end:{line:496,column:17}}],line:482},"9":{loc:{start:{line:489,column:24},end:{line:494,column:25}},type:"if",locations:[{start:{line:489,column:24},end:{line:494,column:25}},{start:{line:489,column:24},end:{line:494,column:25}}],line:489},"10":{loc:{start:{line:517,column:23},end:{line:517,column:48}},type:"binary-expr",locations:[{start:{line:517,column:23},end:{line:517,column:31}},{start:{line:517,column:35},end:{line:517,column:48}}],line:517},"11":{loc:{start:{line:544,column:12},end:{line:547,column:13}},type:"if",locations:[{start:{line:544,column:12},end:{line:547,column:13}},{start:{line:544,column:12},end:{line:547,column:13}}],line:544},"12":{loc:{start:{line:544,column:16},end:{line:544,column:53}},type:"binary-expr",locations:[{start:{line:544,column:16},end:{line:544,column:25}},{start:{line:544,column:29},end:{line:544,column:53}}],line:544},"13":{loc:{start:{line:549,column:23},end:{line:549,column:48}},type:"binary-expr",locations:[{start:{line:549,column:23},end:{line:549,column:31}},{start:{line:549,column:35},end:{line:549,column:48}}],line:549},"14":{loc:{start:{line:550,column:21},end:{line:550,column:33}},type:"binary-expr",locations:[{start:{line:550,column:21},end:{line:550,column:27}},{start:{line:550,column:31},end:{line:550,column:33}}],line:550},"15":{loc:{start:{line:555,column:16},end:{line:560,column:17}},type:"if",locations:[{start:{line:555,column:16},end:{line:560,column:17}},{start:{line:555,column:16},end:{line:560,column:17}}],line:555},"16":{loc:{start:{line:581,column:12},end:{line:584,column:13}},type:"if",locations:[{start:{line:581,column:12},end:{line:584,column:13}},{start:{line:581,column:12},end:{line:584,column:13}}],line:581},"17":{loc:{start:{line:581,column:16},end:{line:581,column:52}},type:"binary-expr",locations:[{start:{line:581,column:16},end:{line:581,column:25}},{start:{line:581,column:29},end:{line:581,column:52}}],line:581},"18":{loc:{start:{line:586,column:23},end:{line:586,column:48}},type:"binary-expr",locations:[{start:{line:586,column:23},end:{line:586,column:31}},{start:{line:586,column:35},end:{line:586,column:48}}],line:586},"19":{loc:{start:{line:588,column:23},end:{line:588,column:34}},type:"binary-expr",locations:[{start:{line:588,column:23},end:{line:588,column:28}},{start:{line:588,column:32},end:{line:588,column:34}}],line:588},"20":{loc:{start:{line:593,column:16},end:{line:599,column:17}},type:"if",locations:[{start:{line:593,column:16},end:{line:599,column:17}},{start:{line:593,column:16},end:{line:599,column:17}}],line:593},"21":{loc:{start:{line:597,column:35},end:{line:597,column:54}},type:"binary-expr",locations:[{start:{line:597,column:35},end:{line:597,column:48}},{start:{line:597,column:52},end:{line:597,column:54}}],line:597},"22":{loc:{start:{line:598,column:35},end:{line:598,column:48}},type:"binary-expr",locations:[{start:{line:598,column:35},end:{line:598,column:42}},{start:{line:598,column:46},end:{line:598,column:48}}],line:598},"23":{loc:{start:{line:625,column:12},end:{line:628,column:13}},type:"if",locations:[{start:{line:625,column:12},end:{line:628,column:13}},{start:{line:625,column:12},end:{line:628,column:13}}],line:625},"24":{loc:{start:{line:625,column:16},end:{line:625,column:53}},type:"binary-expr",locations:[{start:{line:625,column:16},end:{line:625,column:25}},{start:{line:625,column:29},end:{line:625,column:53}}],line:625},"25":{loc:{start:{line:630,column:23},end:{line:630,column:48}},type:"binary-expr",locations:[{start:{line:630,column:23},end:{line:630,column:31}},{start:{line:630,column:35},end:{line:630,column:48}}],line:630},"26":{loc:{start:{line:631,column:21},end:{line:631,column:33}},type:"binary-expr",locations:[{start:{line:631,column:21},end:{line:631,column:27}},{start:{line:631,column:31},end:{line:631,column:33}}],line:631},"27":{loc:{start:{line:634,column:12},end:{line:636,column:13}},type:"if",locations:[{start:{line:634,column:12},end:{line:636,column:13}},{start:{line:634,column:12},end:{line:636,column:13}}],line:634},"28":{loc:{start:{line:653,column:20},end:{line:658,column:21}},type:"if",locations:[{start:{line:653,column:20},end:{line:658,column:21}},{start:{line:653,column:20},end:{line:658,column:21}}],line:653},"29":{loc:{start:{line:686,column:12},end:{line:688,column:13}},type:"if",locations:[{start:{line:686,column:12},end:{line:688,column:13}},{start:{line:686,column:12},end:{line:688,column:13}}],line:686},"30":{loc:{start:{line:690,column:12},end:{line:692,column:13}},type:"if",locations:[{start:{line:690,column:12},end:{line:692,column:13}},{start:{line:690,column:12},end:{line:692,column:13}}],line:690},"31":{loc:{start:{line:726,column:12},end:{line:728,column:13}},type:"if",locations:[{start:{line:726,column:12},end:{line:728,column:13}},{start:{line:726,column:12},end:{line:728,column:13}}],line:726},"32":{loc:{start:{line:742,column:12},end:{line:744,column:13}},type:"if",locations:[{start:{line:742,column:12},end:{line:744,column:13}},{start:{line:742,column:12},end:{line:744,column:13}}],line:742},"33":{loc:{start:{line:773,column:12},end:{line:775,column:13}},type:"if",locations:[{start:{line:773,column:12},end:{line:775,column:13}},{start:{line:773,column:12},end:{line:775,column:13}}],line:773},"34":{loc:{start:{line:805,column:12},end:{line:807,column:13}},type:"if",locations:[{start:{line:805,column:12},end:{line:807,column:13}},{start:{line:805,column:12},end:{line:807,column:13}}],line:805},"35":{loc:{start:{line:878,column:31},end:{line:878,column:47}},type:"binary-expr",locations:[{start:{line:878,column:31},end:{line:878,column:41}},{start:{line:878,column:45},end:{line:878,column:47}}],line:878},"36":{loc:{start:{line:879,column:26},end:{line:879,column:42}},type:"binary-expr",locations:[{start:{line:879,column:26},end:{line:879,column:36}},{start:{line:879,column:40},end:{line:879,column:42}}],line:879},"37":{loc:{start:{line:988,column:25},end:{line:988,column:79}},type:"cond-expr",locations:[{start:{line:988,column:53},end:{line:988,column:66}},{start:{line:988,column:69},end:{line:988,column:79}}],line:988},"38":{loc:{start:{line:992,column:25},end:{line:997,column:13}},type:"binary-expr",locations:[{start:{line:992,column:25},end:{line:992,column:35}},{start:{line:992,column:39},end:{line:997,column:13}}],line:992},"39":{loc:{start:{line:1002,column:31},end:{line:1002,column:57}},type:"binary-expr",locations:[{start:{line:1002,column:31},end:{line:1002,column:49}},{start:{line:1002,column:55},end:{line:1002,column:57}}],line:1002},"40":{loc:{start:{line:1003,column:31},end:{line:1003,column:73}},type:"binary-expr",locations:[{start:{line:1003,column:31},end:{line:1003,column:48}},{start:{line:1003,column:55},end:{line:1003,column:67}},{start:{line:1003,column:71},end:{line:1003,column:73}}],line:1003},"41":{loc:{start:{line:1004,column:31},end:{line:1004,column:57}},type:"binary-expr",locations:[{start:{line:1004,column:31},end:{line:1004,column:45}},{start:{line:1004,column:55},end:{line:1004,column:57}}],line:1004},"42":{loc:{start:{line:1005,column:31},end:{line:1005,column:57}},type:"binary-expr",locations:[{start:{line:1005,column:31},end:{line:1005,column:47}},{start:{line:1005,column:55},end:{line:1005,column:57}}],line:1005},"43":{loc:{start:{line:1006,column:31},end:{line:1006,column:59}},type:"binary-expr",locations:[{start:{line:1006,column:31},end:{line:1006,column:48}},{start:{line:1006,column:55},end:{line:1006,column:59}}],line:1006},"44":{loc:{start:{line:1007,column:31},end:{line:1007,column:59}},type:"binary-expr",locations:[{start:{line:1007,column:31},end:{line:1007,column:49}},{start:{line:1007,column:55},end:{line:1007,column:59}}],line:1007},"45":{loc:{start:{line:1008,column:31},end:{line:1008,column:59}},type:"binary-expr",locations:[{start:{line:1008,column:31},end:{line:1008,column:51}},{start:{line:1008,column:55},end:{line:1008,column:59}}],line:1008},"46":{loc:{start:{line:1096,column:12},end:{line:1099,column:13}},type:"if",locations:[{start:{line:1096,column:12},end:{line:1099,column:13}},{start:{line:1096,column:12},end:{line:1099,column:13}}],line:1096},"47":{loc:{start:{line:1096,column:16},end:{line:1096,column:54}},type:"binary-expr",locations:[{start:{line:1096,column:16},end:{line:1096,column:25}},{start:{line:1096,column:29},end:{line:1096,column:54}}],line:1096},"48":{loc:{start:{line:1100,column:23},end:{line:1100,column:48}},type:"binary-expr",locations:[{start:{line:1100,column:23},end:{line:1100,column:31}},{start:{line:1100,column:35},end:{line:1100,column:48}}],line:1100},"49":{loc:{start:{line:1102,column:22},end:{line:1102,column:35}},type:"binary-expr",locations:[{start:{line:1102,column:22},end:{line:1102,column:29}},{start:{line:1102,column:33},end:{line:1102,column:35}}],line:1102},"50":{loc:{start:{line:1106,column:16},end:{line:1112,column:17}},type:"if",locations:[{start:{line:1106,column:16},end:{line:1112,column:17}},{start:{line:1106,column:16},end:{line:1112,column:17}}],line:1106},"51":{loc:{start:{line:1110,column:31},end:{line:1110,column:73}},type:"cond-expr",locations:[{start:{line:1110,column:47},end:{line:1110,column:66}},{start:{line:1110,column:69},end:{line:1110,column:73}}],line:1110},"52":{loc:{start:{line:1125,column:23},end:{line:1125,column:48}},type:"binary-expr",locations:[{start:{line:1125,column:23},end:{line:1125,column:31}},{start:{line:1125,column:35},end:{line:1125,column:48}}],line:1125},"53":{loc:{start:{line:1143,column:23},end:{line:1143,column:48}},type:"binary-expr",locations:[{start:{line:1143,column:23},end:{line:1143,column:31}},{start:{line:1143,column:35},end:{line:1143,column:48}}],line:1143},"54":{loc:{start:{line:1145,column:12},end:{line:1147,column:13}},type:"if",locations:[{start:{line:1145,column:12},end:{line:1147,column:13}},{start:{line:1145,column:12},end:{line:1147,column:13}}],line:1145},"55":{loc:{start:{line:1151,column:16},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1151,column:16},end:{line:1167,column:17}},{start:{line:1151,column:16},end:{line:1167,column:17}}],line:1151},"56":{loc:{start:{line:1151,column:20},end:{line:1151,column:47}},type:"binary-expr",locations:[{start:{line:1151,column:20},end:{line:1151,column:24}},{start:{line:1151,column:28},end:{line:1151,column:47}}],line:1151},"57":{loc:{start:{line:1155,column:21},end:{line:1167,column:17}},type:"if",locations:[{start:{line:1155,column:21},end:{line:1167,column:17}},{start:{line:1155,column:21},end:{line:1167,column:17}}],line:1155},"58":{loc:{start:{line:1155,column:25},end:{line:1155,column:51}},type:"binary-expr",locations:[{start:{line:1155,column:25},end:{line:1155,column:29}},{start:{line:1155,column:33},end:{line:1155,column:51}}],line:1155},"59":{loc:{start:{line:1157,column:24},end:{line:1162,column:25}},type:"if",locations:[{start:{line:1157,column:24},end:{line:1162,column:25}},{start:{line:1157,column:24},end:{line:1162,column:25}}],line:1157},"60":{loc:{start:{line:1182,column:23},end:{line:1182,column:48}},type:"binary-expr",locations:[{start:{line:1182,column:23},end:{line:1182,column:31}},{start:{line:1182,column:35},end:{line:1182,column:48}}],line:1182},"61":{loc:{start:{line:1186,column:16},end:{line:1191,column:17}},type:"if",locations:[{start:{line:1186,column:16},end:{line:1191,column:17}},{start:{line:1186,column:16},end:{line:1191,column:17}}],line:1186},"62":{loc:{start:{line:1204,column:23},end:{line:1204,column:48}},type:"binary-expr",locations:[{start:{line:1204,column:23},end:{line:1204,column:31}},{start:{line:1204,column:35},end:{line:1204,column:48}}],line:1204},"63":{loc:{start:{line:1208,column:16},end:{line:1213,column:17}},type:"if",locations:[{start:{line:1208,column:16},end:{line:1213,column:17}},{start:{line:1208,column:16},end:{line:1213,column:17}}],line:1208},"64":{loc:{start:{line:1226,column:23},end:{line:1226,column:48}},type:"binary-expr",locations:[{start:{line:1226,column:23},end:{line:1226,column:31}},{start:{line:1226,column:35},end:{line:1226,column:48}}],line:1226},"65":{loc:{start:{line:1230,column:16},end:{line:1235,column:17}},type:"if",locations:[{start:{line:1230,column:16},end:{line:1235,column:17}},{start:{line:1230,column:16},end:{line:1235,column:17}}],line:1230},"66":{loc:{start:{line:1318,column:37},end:{line:1318,column:59}},type:"binary-expr",locations:[{start:{line:1318,column:37},end:{line:1318,column:53}},{start:{line:1318,column:57},end:{line:1318,column:59}}],line:1318},"67":{loc:{start:{line:1325,column:16},end:{line:1330,column:17}},type:"if",locations:[{start:{line:1325,column:16},end:{line:1330,column:17}},{start:{line:1325,column:16},end:{line:1330,column:17}}],line:1325},"68":{loc:{start:{line:1334,column:35},end:{line:1334,column:61}},type:"binary-expr",locations:[{start:{line:1334,column:35},end:{line:1334,column:52}},{start:{line:1334,column:59},end:{line:1334,column:61}}],line:1334},"69":{loc:{start:{line:1335,column:35},end:{line:1335,column:61}},type:"binary-expr",locations:[{start:{line:1335,column:35},end:{line:1335,column:51}},{start:{line:1335,column:59},end:{line:1335,column:61}}],line:1335},"70":{loc:{start:{line:1336,column:35},end:{line:1336,column:63}},type:"binary-expr",locations:[{start:{line:1336,column:35},end:{line:1336,column:53}},{start:{line:1336,column:59},end:{line:1336,column:63}}],line:1336},"71":{loc:{start:{line:1389,column:12},end:{line:1392,column:13}},type:"if",locations:[{start:{line:1389,column:12},end:{line:1392,column:13}},{start:{line:1389,column:12},end:{line:1392,column:13}}],line:1389},"72":{loc:{start:{line:1389,column:16},end:{line:1389,column:54}},type:"binary-expr",locations:[{start:{line:1389,column:16},end:{line:1389,column:25}},{start:{line:1389,column:29},end:{line:1389,column:54}}],line:1389},"73":{loc:{start:{line:1393,column:23},end:{line:1393,column:48}},type:"binary-expr",locations:[{start:{line:1393,column:23},end:{line:1393,column:31}},{start:{line:1393,column:35},end:{line:1393,column:48}}],line:1393},"74":{loc:{start:{line:1395,column:22},end:{line:1395,column:35}},type:"binary-expr",locations:[{start:{line:1395,column:22},end:{line:1395,column:29}},{start:{line:1395,column:33},end:{line:1395,column:35}}],line:1395},"75":{loc:{start:{line:1396,column:12},end:{line:1398,column:13}},type:"if",locations:[{start:{line:1396,column:12},end:{line:1398,column:13}},{start:{line:1396,column:12},end:{line:1398,column:13}}],line:1396},"76":{loc:{start:{line:1402,column:16},end:{line:1408,column:17}},type:"if",locations:[{start:{line:1402,column:16},end:{line:1408,column:17}},{start:{line:1402,column:16},end:{line:1408,column:17}}],line:1402},"77":{loc:{start:{line:1415,column:22},end:{line:1415,column:35}},type:"binary-expr",locations:[{start:{line:1415,column:22},end:{line:1415,column:29}},{start:{line:1415,column:33},end:{line:1415,column:35}}],line:1415},"78":{loc:{start:{line:1416,column:12},end:{line:1418,column:13}},type:"if",locations:[{start:{line:1416,column:12},end:{line:1418,column:13}},{start:{line:1416,column:12},end:{line:1418,column:13}}],line:1416},"79":{loc:{start:{line:1449,column:12},end:{line:1451,column:13}},type:"if",locations:[{start:{line:1449,column:12},end:{line:1451,column:13}},{start:{line:1449,column:12},end:{line:1451,column:13}}],line:1449},"80":{loc:{start:{line:1453,column:12},end:{line:1455,column:13}},type:"if",locations:[{start:{line:1453,column:12},end:{line:1455,column:13}},{start:{line:1453,column:12},end:{line:1455,column:13}}],line:1453},"81":{loc:{start:{line:1457,column:12},end:{line:1459,column:13}},type:"if",locations:[{start:{line:1457,column:12},end:{line:1459,column:13}},{start:{line:1457,column:12},end:{line:1459,column:13}}],line:1457},"82":{loc:{start:{line:1457,column:16},end:{line:1457,column:79}},type:"binary-expr",locations:[{start:{line:1457,column:16},end:{line:1457,column:25}},{start:{line:1457,column:30},end:{line:1457,column:51}},{start:{line:1457,column:55},end:{line:1457,column:78}}],line:1457},"83":{loc:{start:{line:1462,column:12},end:{line:1504,column:13}},type:"if",locations:[{start:{line:1462,column:12},end:{line:1504,column:13}},{start:{line:1462,column:12},end:{line:1504,column:13}}],line:1462},"84":{loc:{start:{line:1465,column:16},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1465,column:16},end:{line:1500,column:17}},{start:{line:1465,column:16},end:{line:1500,column:17}}],line:1465},"85":{loc:{start:{line:1465,column:20},end:{line:1465,column:55}},type:"binary-expr",locations:[{start:{line:1465,column:20},end:{line:1465,column:41}},{start:{line:1465,column:45},end:{line:1465,column:55}}],line:1465},"86":{loc:{start:{line:1472,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1472,column:21},end:{line:1500,column:17}},{start:{line:1472,column:21},end:{line:1500,column:17}}],line:1472},"87":{loc:{start:{line:1472,column:25},end:{line:1472,column:59}},type:"binary-expr",locations:[{start:{line:1472,column:25},end:{line:1472,column:46}},{start:{line:1472,column:50},end:{line:1472,column:59}}],line:1472},"88":{loc:{start:{line:1477,column:20},end:{line:1482,column:21}},type:"if",locations:[{start:{line:1477,column:20},end:{line:1482,column:21}},{start:{line:1477,column:20},end:{line:1482,column:21}}],line:1477},"89":{loc:{start:{line:1484,column:21},end:{line:1500,column:17}},type:"if",locations:[{start:{line:1484,column:21},end:{line:1500,column:17}},{start:{line:1484,column:21},end:{line:1500,column:17}}],line:1484},"90":{loc:{start:{line:1484,column:25},end:{line:1484,column:58}},type:"binary-expr",locations:[{start:{line:1484,column:25},end:{line:1484,column:44}},{start:{line:1484,column:48},end:{line:1484,column:58}}],line:1484},"91":{loc:{start:{line:1496,column:24},end:{line:1498,column:25}},type:"if",locations:[{start:{line:1496,column:24},end:{line:1498,column:25}},{start:{line:1496,column:24},end:{line:1498,column:25}}],line:1496},"92":{loc:{start:{line:1525,column:23},end:{line:1525,column:48}},type:"binary-expr",locations:[{start:{line:1525,column:23},end:{line:1525,column:31}},{start:{line:1525,column:35},end:{line:1525,column:48}}],line:1525},"93":{loc:{start:{line:1528,column:16},end:{line:1553,column:17}},type:"if",locations:[{start:{line:1528,column:16},end:{line:1553,column:17}},{start:{line:1528,column:16},end:{line:1553,column:17}}],line:1528},"94":{loc:{start:{line:1533,column:20},end:{line:1535,column:21}},type:"if",locations:[{start:{line:1533,column:20},end:{line:1535,column:21}},{start:{line:1533,column:20},end:{line:1535,column:21}}],line:1533},"95":{loc:{start:{line:1540,column:20},end:{line:1552,column:21}},type:"if",locations:[{start:{line:1540,column:20},end:{line:1552,column:21}},{start:{line:1540,column:20},end:{line:1552,column:21}}],line:1540},"96":{loc:{start:{line:1542,column:28},end:{line:1547,column:29}},type:"if",locations:[{start:{line:1542,column:28},end:{line:1547,column:29}},{start:{line:1542,column:28},end:{line:1547,column:29}}],line:1542},"97":{loc:{start:{line:1575,column:23},end:{line:1575,column:48}},type:"binary-expr",locations:[{start:{line:1575,column:23},end:{line:1575,column:31}},{start:{line:1575,column:35},end:{line:1575,column:48}}],line:1575},"98":{loc:{start:{line:1637,column:19},end:{line:1637,column:77}},type:"binary-expr",locations:[{start:{line:1637,column:19},end:{line:1637,column:72}},{start:{line:1637,column:76},end:{line:1637,column:77}}],line:1637},"99":{loc:{start:{line:1657,column:23},end:{line:1657,column:48}},type:"binary-expr",locations:[{start:{line:1657,column:23},end:{line:1657,column:31}},{start:{line:1657,column:35},end:{line:1657,column:48}}],line:1657},"100":{loc:{start:{line:1689,column:12},end:{line:1692,column:13}},type:"if",locations:[{start:{line:1689,column:12},end:{line:1692,column:13}},{start:{line:1689,column:12},end:{line:1692,column:13}}],line:1689},"101":{loc:{start:{line:1689,column:16},end:{line:1689,column:54}},type:"binary-expr",locations:[{start:{line:1689,column:16},end:{line:1689,column:25}},{start:{line:1689,column:29},end:{line:1689,column:54}}],line:1689},"102":{loc:{start:{line:1694,column:23},end:{line:1694,column:48}},type:"binary-expr",locations:[{start:{line:1694,column:23},end:{line:1694,column:31}},{start:{line:1694,column:35},end:{line:1694,column:48}}],line:1694},"103":{loc:{start:{line:1695,column:22},end:{line:1695,column:35}},type:"binary-expr",locations:[{start:{line:1695,column:22},end:{line:1695,column:29}},{start:{line:1695,column:33},end:{line:1695,column:35}}],line:1695},"104":{loc:{start:{line:1699,column:16},end:{line:1702,column:17}},type:"if",locations:[{start:{line:1699,column:16},end:{line:1702,column:17}},{start:{line:1699,column:16},end:{line:1702,column:17}}],line:1699},"105":{loc:{start:{line:1749,column:12},end:{line:1752,column:13}},type:"if",locations:[{start:{line:1749,column:12},end:{line:1752,column:13}},{start:{line:1749,column:12},end:{line:1752,column:13}}],line:1749},"106":{loc:{start:{line:1749,column:16},end:{line:1749,column:54}},type:"binary-expr",locations:[{start:{line:1749,column:16},end:{line:1749,column:25}},{start:{line:1749,column:29},end:{line:1749,column:54}}],line:1749},"107":{loc:{start:{line:1754,column:23},end:{line:1754,column:48}},type:"binary-expr",locations:[{start:{line:1754,column:23},end:{line:1754,column:31}},{start:{line:1754,column:35},end:{line:1754,column:48}}],line:1754},"108":{loc:{start:{line:1755,column:22},end:{line:1755,column:35}},type:"binary-expr",locations:[{start:{line:1755,column:22},end:{line:1755,column:29}},{start:{line:1755,column:33},end:{line:1755,column:35}}],line:1755},"109":{loc:{start:{line:1759,column:16},end:{line:1762,column:17}},type:"if",locations:[{start:{line:1759,column:16},end:{line:1762,column:17}},{start:{line:1759,column:16},end:{line:1762,column:17}}],line:1759},"110":{loc:{start:{line:1765,column:27},end:{line:1765,column:52}},type:"binary-expr",locations:[{start:{line:1765,column:27},end:{line:1765,column:46}},{start:{line:1765,column:50},end:{line:1765,column:52}}],line:1765},"111":{loc:{start:{line:1795,column:23},end:{line:1795,column:48}},type:"binary-expr",locations:[{start:{line:1795,column:23},end:{line:1795,column:31}},{start:{line:1795,column:35},end:{line:1795,column:48}}],line:1795},"112":{loc:{start:{line:1816,column:21},end:{line:1816,column:33}},type:"binary-expr",locations:[{start:{line:1816,column:21},end:{line:1816,column:27}},{start:{line:1816,column:31},end:{line:1816,column:33}}],line:1816},"113":{loc:{start:{line:1818,column:12},end:{line:1841,column:13}},type:"if",locations:[{start:{line:1818,column:12},end:{line:1841,column:13}},{start:{line:1818,column:12},end:{line:1841,column:13}}],line:1818},"114":{loc:{start:{line:1821,column:20},end:{line:1834,column:21}},type:"if",locations:[{start:{line:1821,column:20},end:{line:1834,column:21}},{start:{line:1821,column:20},end:{line:1834,column:21}}],line:1821},"115":{loc:{start:{line:1827,column:28},end:{line:1832,column:29}},type:"if",locations:[{start:{line:1827,column:28},end:{line:1832,column:29}},{start:{line:1827,column:28},end:{line:1832,column:29}}],line:1827},"116":{loc:{start:{line:2021,column:19},end:{line:2021,column:50}},type:"binary-expr",locations:[{start:{line:2021,column:19},end:{line:2021,column:44}},{start:{line:2021,column:48},end:{line:2021,column:50}}],line:2021},"117":{loc:{start:{line:2031,column:19},end:{line:2031,column:55}},type:"binary-expr",locations:[{start:{line:2031,column:19},end:{line:2031,column:47}},{start:{line:2031,column:51},end:{line:2031,column:55}}],line:2031},"118":{loc:{start:{line:2057,column:19},end:{line:2057,column:69}},type:"binary-expr",locations:[{start:{line:2057,column:19},end:{line:2057,column:61}},{start:{line:2057,column:65},end:{line:2057,column:69}}],line:2057},"119":{loc:{start:{line:2067,column:19},end:{line:2067,column:61}},type:"binary-expr",locations:[{start:{line:2067,column:19},end:{line:2067,column:53}},{start:{line:2067,column:57},end:{line:2067,column:61}}],line:2067},"120":{loc:{start:{line:2078,column:19},end:{line:2078,column:65}},type:"binary-expr",locations:[{start:{line:2078,column:19},end:{line:2078,column:59}},{start:{line:2078,column:63},end:{line:2078,column:65}}],line:2078},"121":{loc:{start:{line:2088,column:19},end:{line:2088,column:48}},type:"binary-expr",locations:[{start:{line:2088,column:19},end:{line:2088,column:40}},{start:{line:2088,column:44},end:{line:2088,column:48}}],line:2088},"122":{loc:{start:{line:2098,column:19},end:{line:2098,column:57}},type:"binary-expr",locations:[{start:{line:2098,column:19},end:{line:2098,column:49}},{start:{line:2098,column:53},end:{line:2098,column:57}}],line:2098},"123":{loc:{start:{line:2110,column:19},end:{line:2110,column:66}},type:"binary-expr",locations:[{start:{line:2110,column:19},end:{line:2110,column:58}},{start:{line:2110,column:62},end:{line:2110,column:66}}],line:2110},"124":{loc:{start:{line:2122,column:19},end:{line:2122,column:73}},type:"binary-expr",locations:[{start:{line:2122,column:19},end:{line:2122,column:67}},{start:{line:2122,column:71},end:{line:2122,column:73}}],line:2122},"125":{loc:{start:{line:2173,column:19},end:{line:2173,column:77}},type:"binary-expr",locations:[{start:{line:2173,column:19},end:{line:2173,column:72}},{start:{line:2173,column:76},end:{line:2173,column:77}}],line:2173},"126":{loc:{start:{line:2194,column:12},end:{line:2197,column:13}},type:"if",locations:[{start:{line:2194,column:12},end:{line:2197,column:13}},{start:{line:2194,column:12},end:{line:2197,column:13}}],line:2194},"127":{loc:{start:{line:2194,column:16},end:{line:2194,column:54}},type:"binary-expr",locations:[{start:{line:2194,column:16},end:{line:2194,column:25}},{start:{line:2194,column:29},end:{line:2194,column:54}}],line:2194},"128":{loc:{start:{line:2199,column:23},end:{line:2199,column:48}},type:"binary-expr",locations:[{start:{line:2199,column:23},end:{line:2199,column:31}},{start:{line:2199,column:35},end:{line:2199,column:48}}],line:2199},"129":{loc:{start:{line:2200,column:22},end:{line:2200,column:35}},type:"binary-expr",locations:[{start:{line:2200,column:22},end:{line:2200,column:29}},{start:{line:2200,column:33},end:{line:2200,column:35}}],line:2200},"130":{loc:{start:{line:2204,column:16},end:{line:2207,column:17}},type:"if",locations:[{start:{line:2204,column:16},end:{line:2207,column:17}},{start:{line:2204,column:16},end:{line:2207,column:17}}],line:2204},"131":{loc:{start:{line:2210,column:27},end:{line:2210,column:52}},type:"binary-expr",locations:[{start:{line:2210,column:27},end:{line:2210,column:46}},{start:{line:2210,column:50},end:{line:2210,column:52}}],line:2210},"132":{loc:{start:{line:2368,column:23},end:{line:2368,column:48}},type:"binary-expr",locations:[{start:{line:2368,column:23},end:{line:2368,column:31}},{start:{line:2368,column:35},end:{line:2368,column:48}}],line:2368},"133":{loc:{start:{line:2372,column:16},end:{line:2377,column:17}},type:"if",locations:[{start:{line:2372,column:16},end:{line:2377,column:17}},{start:{line:2372,column:16},end:{line:2377,column:17}}],line:2372},"134":{loc:{start:{line:2397,column:23},end:{line:2397,column:48}},type:"binary-expr",locations:[{start:{line:2397,column:23},end:{line:2397,column:31}},{start:{line:2397,column:35},end:{line:2397,column:48}}],line:2397},"135":{loc:{start:{line:2401,column:16},end:{line:2406,column:17}},type:"if",locations:[{start:{line:2401,column:16},end:{line:2406,column:17}},{start:{line:2401,column:16},end:{line:2406,column:17}}],line:2401},"136":{loc:{start:{line:2593,column:23},end:{line:2593,column:48}},type:"binary-expr",locations:[{start:{line:2593,column:23},end:{line:2593,column:31}},{start:{line:2593,column:35},end:{line:2593,column:48}}],line:2593},"137":{loc:{start:{line:2597,column:16},end:{line:2613,column:17}},type:"if",locations:[{start:{line:2597,column:16},end:{line:2613,column:17}},{start:{line:2597,column:16},end:{line:2613,column:17}}],line:2597},"138":{loc:{start:{line:2606,column:24},end:{line:2611,column:25}},type:"if",locations:[{start:{line:2606,column:24},end:{line:2611,column:25}},{start:{line:2606,column:24},end:{line:2611,column:25}}],line:2606},"139":{loc:{start:{line:2767,column:12},end:{line:2770,column:13}},type:"if",locations:[{start:{line:2767,column:12},end:{line:2770,column:13}},{start:{line:2767,column:12},end:{line:2770,column:13}}],line:2767},"140":{loc:{start:{line:2767,column:16},end:{line:2767,column:53}},type:"binary-expr",locations:[{start:{line:2767,column:16},end:{line:2767,column:25}},{start:{line:2767,column:29},end:{line:2767,column:53}}],line:2767},"141":{loc:{start:{line:2772,column:23},end:{line:2772,column:48}},type:"binary-expr",locations:[{start:{line:2772,column:23},end:{line:2772,column:31}},{start:{line:2772,column:35},end:{line:2772,column:48}}],line:2772},"142":{loc:{start:{line:2773,column:21},end:{line:2773,column:33}},type:"binary-expr",locations:[{start:{line:2773,column:21},end:{line:2773,column:27}},{start:{line:2773,column:31},end:{line:2773,column:33}}],line:2773},"143":{loc:{start:{line:2785,column:12},end:{line:2790,column:13}},type:"if",locations:[{start:{line:2785,column:12},end:{line:2790,column:13}},{start:{line:2785,column:12},end:{line:2790,column:13}}],line:2785},"144":{loc:{start:{line:2862,column:12},end:{line:2866,column:13}},type:"if",locations:[{start:{line:2862,column:12},end:{line:2866,column:13}},{start:{line:2862,column:12},end:{line:2866,column:13}}],line:2862},"145":{loc:{start:{line:2862,column:16},end:{line:2862,column:77}},type:"binary-expr",locations:[{start:{line:2862,column:16},end:{line:2862,column:36}},{start:{line:2862,column:40},end:{line:2862,column:64}},{start:{line:2862,column:68},end:{line:2862,column:77}}],line:2862},"146":{loc:{start:{line:2868,column:21},end:{line:2868,column:33}},type:"binary-expr",locations:[{start:{line:2868,column:21},end:{line:2868,column:27}},{start:{line:2868,column:31},end:{line:2868,column:33}}],line:2868},"147":{loc:{start:{line:2890,column:23},end:{line:2890,column:67}},type:"cond-expr",locations:[{start:{line:2890,column:49},end:{line:2890,column:55}},{start:{line:2890,column:58},end:{line:2890,column:67}}],line:2890},"148":{loc:{start:{line:3001,column:12},end:{line:3005,column:13}},type:"if",locations:[{start:{line:3001,column:12},end:{line:3005,column:13}},{start:{line:3001,column:12},end:{line:3005,column:13}}],line:3001},"149":{loc:{start:{line:3001,column:16},end:{line:3001,column:83}},type:"binary-expr",locations:[{start:{line:3001,column:16},end:{line:3001,column:42}},{start:{line:3001,column:46},end:{line:3001,column:70}},{start:{line:3001,column:74},end:{line:3001,column:83}}],line:3001},"150":{loc:{start:{line:3007,column:12},end:{line:3010,column:13}},type:"if",locations:[{start:{line:3007,column:12},end:{line:3010,column:13}},{start:{line:3007,column:12},end:{line:3010,column:13}}],line:3007},"151":{loc:{start:{line:3007,column:16},end:{line:3007,column:53}},type:"binary-expr",locations:[{start:{line:3007,column:16},end:{line:3007,column:40}},{start:{line:3007,column:44},end:{line:3007,column:53}}],line:3007},"152":{loc:{start:{line:3012,column:21},end:{line:3012,column:33}},type:"binary-expr",locations:[{start:{line:3012,column:21},end:{line:3012,column:27}},{start:{line:3012,column:31},end:{line:3012,column:33}}],line:3012},"153":{loc:{start:{line:3072,column:12},end:{line:3074,column:13}},type:"if",locations:[{start:{line:3072,column:12},end:{line:3074,column:13}},{start:{line:3072,column:12},end:{line:3074,column:13}}],line:3072},"154":{loc:{start:{line:3072,column:16},end:{line:3072,column:78}},type:"binary-expr",locations:[{start:{line:3072,column:16},end:{line:3072,column:26}},{start:{line:3072,column:30},end:{line:3072,column:53}},{start:{line:3072,column:57},end:{line:3072,column:78}}],line:3072},"155":{loc:{start:{line:3098,column:12},end:{line:3100,column:13}},type:"if",locations:[{start:{line:3098,column:12},end:{line:3100,column:13}},{start:{line:3098,column:12},end:{line:3100,column:13}}],line:3098},"156":{loc:{start:{line:3102,column:23},end:{line:3102,column:48}},type:"binary-expr",locations:[{start:{line:3102,column:23},end:{line:3102,column:31}},{start:{line:3102,column:35},end:{line:3102,column:48}}],line:3102},"157":{loc:{start:{line:3106,column:16},end:{line:3119,column:17}},type:"if",locations:[{start:{line:3106,column:16},end:{line:3119,column:17}},{start:{line:3106,column:16},end:{line:3119,column:17}}],line:3106},"158":{loc:{start:{line:3112,column:24},end:{line:3117,column:25}},type:"if",locations:[{start:{line:3112,column:24},end:{line:3117,column:25}},{start:{line:3112,column:24},end:{line:3117,column:25}}],line:3112},"159":{loc:{start:{line:3136,column:16},end:{line:3138,column:17}},type:"if",locations:[{start:{line:3136,column:16},end:{line:3138,column:17}},{start:{line:3136,column:16},end:{line:3138,column:17}}],line:3136},"160":{loc:{start:{line:3136,column:19},end:{line:3136,column:45}},type:"binary-expr",locations:[{start:{line:3136,column:19},end:{line:3136,column:24}},{start:{line:3136,column:28},end:{line:3136,column:45}}],line:3136},"161":{loc:{start:{line:3159,column:16},end:{line:3164,column:17}},type:"if",locations:[{start:{line:3159,column:16},end:{line:3164,column:17}},{start:{line:3159,column:16},end:{line:3164,column:17}}],line:3159},"162":{loc:{start:{line:3172,column:23},end:{line:3172,column:48}},type:"binary-expr",locations:[{start:{line:3172,column:23},end:{line:3172,column:31}},{start:{line:3172,column:35},end:{line:3172,column:48}}],line:3172},"163":{loc:{start:{line:3180,column:12},end:{line:3189,column:13}},type:"if",locations:[{start:{line:3180,column:12},end:{line:3189,column:13}},{start:{line:3180,column:12},end:{line:3189,column:13}}],line:3180},"164":{loc:{start:{line:3196,column:12},end:{line:3211,column:13}},type:"if",locations:[{start:{line:3196,column:12},end:{line:3211,column:13}},{start:{line:3196,column:12},end:{line:3211,column:13}}],line:3196},"165":{loc:{start:{line:3308,column:23},end:{line:3308,column:48}},type:"binary-expr",locations:[{start:{line:3308,column:23},end:{line:3308,column:31}},{start:{line:3308,column:35},end:{line:3308,column:48}}],line:3308},"166":{loc:{start:{line:3334,column:23},end:{line:3334,column:48}},type:"binary-expr",locations:[{start:{line:3334,column:23},end:{line:3334,column:31}},{start:{line:3334,column:35},end:{line:3334,column:48}}],line:3334},"167":{loc:{start:{line:3361,column:23},end:{line:3361,column:48}},type:"binary-expr",locations:[{start:{line:3361,column:23},end:{line:3361,column:31}},{start:{line:3361,column:35},end:{line:3361,column:48}}],line:3361},"168":{loc:{start:{line:3362,column:21},end:{line:3362,column:33}},type:"binary-expr",locations:[{start:{line:3362,column:21},end:{line:3362,column:27}},{start:{line:3362,column:31},end:{line:3362,column:33}}],line:3362},"169":{loc:{start:{line:3363,column:33},end:{line:3363,column:66}},type:"binary-expr",locations:[{start:{line:3363,column:33},end:{line:3363,column:51}},{start:{line:3363,column:55},end:{line:3363,column:66}}],line:3363},"170":{loc:{start:{line:3367,column:16},end:{line:3372,column:17}},type:"if",locations:[{start:{line:3367,column:16},end:{line:3372,column:17}},{start:{line:3367,column:16},end:{line:3372,column:17}}],line:3367},"171":{loc:{start:{line:3392,column:23},end:{line:3392,column:48}},type:"binary-expr",locations:[{start:{line:3392,column:23},end:{line:3392,column:31}},{start:{line:3392,column:35},end:{line:3392,column:48}}],line:3392},"172":{loc:{start:{line:3433,column:23},end:{line:3433,column:48}},type:"binary-expr",locations:[{start:{line:3433,column:23},end:{line:3433,column:31}},{start:{line:3433,column:35},end:{line:3433,column:48}}],line:3433},"173":{loc:{start:{line:3460,column:23},end:{line:3460,column:48}},type:"binary-expr",locations:[{start:{line:3460,column:23},end:{line:3460,column:31}},{start:{line:3460,column:35},end:{line:3460,column:48}}],line:3460},"174":{loc:{start:{line:3461,column:21},end:{line:3461,column:33}},type:"binary-expr",locations:[{start:{line:3461,column:21},end:{line:3461,column:27}},{start:{line:3461,column:31},end:{line:3461,column:33}}],line:3461},"175":{loc:{start:{line:3462,column:33},end:{line:3462,column:66}},type:"binary-expr",locations:[{start:{line:3462,column:33},end:{line:3462,column:51}},{start:{line:3462,column:55},end:{line:3462,column:66}}],line:3462},"176":{loc:{start:{line:3466,column:16},end:{line:3471,column:17}},type:"if",locations:[{start:{line:3466,column:16},end:{line:3471,column:17}},{start:{line:3466,column:16},end:{line:3471,column:17}}],line:3466},"177":{loc:{start:{line:3497,column:23},end:{line:3497,column:48}},type:"binary-expr",locations:[{start:{line:3497,column:23},end:{line:3497,column:31}},{start:{line:3497,column:35},end:{line:3497,column:48}}],line:3497},"178":{loc:{start:{line:3498,column:21},end:{line:3498,column:33}},type:"binary-expr",locations:[{start:{line:3498,column:21},end:{line:3498,column:27}},{start:{line:3498,column:31},end:{line:3498,column:33}}],line:3498},"179":{loc:{start:{line:3499,column:33},end:{line:3499,column:66}},type:"binary-expr",locations:[{start:{line:3499,column:33},end:{line:3499,column:51}},{start:{line:3499,column:55},end:{line:3499,column:66}}],line:3499},"180":{loc:{start:{line:3503,column:16},end:{line:3508,column:17}},type:"if",locations:[{start:{line:3503,column:16},end:{line:3508,column:17}},{start:{line:3503,column:16},end:{line:3508,column:17}}],line:3503},"181":{loc:{start:{line:3528,column:23},end:{line:3528,column:48}},type:"binary-expr",locations:[{start:{line:3528,column:23},end:{line:3528,column:31}},{start:{line:3528,column:35},end:{line:3528,column:48}}],line:3528},"182":{loc:{start:{line:3532,column:16},end:{line:3537,column:17}},type:"if",locations:[{start:{line:3532,column:16},end:{line:3537,column:17}},{start:{line:3532,column:16},end:{line:3537,column:17}}],line:3532},"183":{loc:{start:{line:3558,column:23},end:{line:3558,column:48}},type:"binary-expr",locations:[{start:{line:3558,column:23},end:{line:3558,column:31}},{start:{line:3558,column:35},end:{line:3558,column:48}}],line:3558},"184":{loc:{start:{line:3586,column:23},end:{line:3586,column:48}},type:"binary-expr",locations:[{start:{line:3586,column:23},end:{line:3586,column:31}},{start:{line:3586,column:35},end:{line:3586,column:48}}],line:3586},"185":{loc:{start:{line:3613,column:23},end:{line:3613,column:48}},type:"binary-expr",locations:[{start:{line:3613,column:23},end:{line:3613,column:31}},{start:{line:3613,column:35},end:{line:3613,column:48}}],line:3613},"186":{loc:{start:{line:3617,column:16},end:{line:3622,column:17}},type:"if",locations:[{start:{line:3617,column:16},end:{line:3622,column:17}},{start:{line:3617,column:16},end:{line:3622,column:17}}],line:3617},"187":{loc:{start:{line:3643,column:23},end:{line:3643,column:48}},type:"binary-expr",locations:[{start:{line:3643,column:23},end:{line:3643,column:31}},{start:{line:3643,column:35},end:{line:3643,column:48}}],line:3643},"188":{loc:{start:{line:3647,column:16},end:{line:3652,column:17}},type:"if",locations:[{start:{line:3647,column:16},end:{line:3652,column:17}},{start:{line:3647,column:16},end:{line:3652,column:17}}],line:3647},"189":{loc:{start:{line:3673,column:23},end:{line:3673,column:48}},type:"binary-expr",locations:[{start:{line:3673,column:23},end:{line:3673,column:31}},{start:{line:3673,column:35},end:{line:3673,column:48}}],line:3673},"190":{loc:{start:{line:3700,column:25},end:{line:3700,column:46}},type:"binary-expr",locations:[{start:{line:3700,column:25},end:{line:3700,column:39}},{start:{line:3700,column:43},end:{line:3700,column:46}}],line:3700},"191":{loc:{start:{line:3702,column:12},end:{line:3706,column:13}},type:"if",locations:[{start:{line:3702,column:12},end:{line:3706,column:13}},{start:{line:3702,column:12},end:{line:3706,column:13}}],line:3702},"192":{loc:{start:{line:3709,column:16},end:{line:3712,column:32}},type:"binary-expr",locations:[{start:{line:3709,column:16},end:{line:3709,column:35}},{start:{line:3710,column:16},end:{line:3710,column:31}},{start:{line:3711,column:16},end:{line:3711,column:33}},{start:{line:3712,column:16},end:{line:3712,column:32}}],line:3709},"193":{loc:{start:{line:3715,column:30},end:{line:3715,column:62}},type:"binary-expr",locations:[{start:{line:3715,column:30},end:{line:3715,column:45}},{start:{line:3715,column:49},end:{line:3715,column:62}}],line:3715},"194":{loc:{start:{line:3716,column:33},end:{line:3716,column:68}},type:"binary-expr",locations:[{start:{line:3716,column:33},end:{line:3716,column:51}},{start:{line:3716,column:55},end:{line:3716,column:68}}],line:3716},"195":{loc:{start:{line:3717,column:29},end:{line:3717,column:60}},type:"binary-expr",locations:[{start:{line:3717,column:29},end:{line:3717,column:43}},{start:{line:3717,column:47},end:{line:3717,column:60}}],line:3717},"196":{loc:{start:{line:3718,column:31},end:{line:3718,column:64}},type:"binary-expr",locations:[{start:{line:3718,column:31},end:{line:3718,column:47}},{start:{line:3718,column:51},end:{line:3718,column:64}}],line:3718},"197":{loc:{start:{line:3719,column:30},end:{line:3719,column:62}},type:"binary-expr",locations:[{start:{line:3719,column:30},end:{line:3719,column:45}},{start:{line:3719,column:49},end:{line:3719,column:62}}],line:3719},"198":{loc:{start:{line:3722,column:34},end:{line:3722,column:70}},type:"binary-expr",locations:[{start:{line:3722,column:34},end:{line:3722,column:53}},{start:{line:3722,column:57},end:{line:3722,column:70}}],line:3722},"199":{loc:{start:{line:3723,column:43},end:{line:3723,column:88}},type:"binary-expr",locations:[{start:{line:3723,column:43},end:{line:3723,column:71}},{start:{line:3723,column:75},end:{line:3723,column:88}}],line:3723},"200":{loc:{start:{line:3732,column:24},end:{line:3735,column:25}},type:"if",locations:[{start:{line:3732,column:24},end:{line:3735,column:25}},{start:{line:3732,column:24},end:{line:3735,column:25}}],line:3732},"201":{loc:{start:{line:3738,column:39},end:{line:3738,column:96}},type:"binary-expr",locations:[{start:{line:3738,column:39},end:{line:3738,column:65}},{start:{line:3738,column:69},end:{line:3738,column:96}}],line:3738},"202":{loc:{start:{line:3739,column:24},end:{line:3776,column:25}},type:"if",locations:[{start:{line:3739,column:24},end:{line:3776,column:25}},{start:{line:3739,column:24},end:{line:3776,column:25}}],line:3739},"203":{loc:{start:{line:3743,column:28},end:{line:3756,column:29}},type:"if",locations:[{start:{line:3743,column:28},end:{line:3756,column:29}},{start:{line:3743,column:28},end:{line:3756,column:29}}],line:3743},"204":{loc:{start:{line:3749,column:32},end:{line:3755,column:33}},type:"if",locations:[{start:{line:3749,column:32},end:{line:3755,column:33}},{start:{line:3749,column:32},end:{line:3755,column:33}}],line:3749},"205":{loc:{start:{line:3762,column:28},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3762,column:28},end:{line:3775,column:29}},{start:{line:3762,column:28},end:{line:3775,column:29}}],line:3762},"206":{loc:{start:{line:3762,column:32},end:{line:3762,column:72}},type:"binary-expr",locations:[{start:{line:3762,column:32},end:{line:3762,column:56}},{start:{line:3762,column:60},end:{line:3762,column:72}}],line:3762},"207":{loc:{start:{line:3769,column:33},end:{line:3775,column:29}},type:"if",locations:[{start:{line:3769,column:33},end:{line:3775,column:29}},{start:{line:3769,column:33},end:{line:3775,column:29}}],line:3769},"208":{loc:{start:{line:3769,column:37},end:{line:3769,column:81}},type:"binary-expr",locations:[{start:{line:3769,column:37},end:{line:3769,column:63}},{start:{line:3769,column:67},end:{line:3769,column:81}}],line:3769},"209":{loc:{start:{line:3782,column:20},end:{line:3784,column:21}},type:"if",locations:[{start:{line:3782,column:20},end:{line:3784,column:21}},{start:{line:3782,column:20},end:{line:3784,column:21}}],line:3782},"210":{loc:{start:{line:3805,column:23},end:{line:3805,column:48}},type:"binary-expr",locations:[{start:{line:3805,column:23},end:{line:3805,column:31}},{start:{line:3805,column:35},end:{line:3805,column:48}}],line:3805},"211":{loc:{start:{line:3889,column:12},end:{line:3893,column:13}},type:"if",locations:[{start:{line:3889,column:12},end:{line:3893,column:13}},{start:{line:3889,column:12},end:{line:3893,column:13}}],line:3889},"212":{loc:{start:{line:3889,column:16},end:{line:3889,column:78}},type:"binary-expr",locations:[{start:{line:3889,column:16},end:{line:3889,column:37}},{start:{line:3889,column:41},end:{line:3889,column:65}},{start:{line:3889,column:69},end:{line:3889,column:78}}],line:3889},"213":{loc:{start:{line:3895,column:23},end:{line:3895,column:48}},type:"binary-expr",locations:[{start:{line:3895,column:23},end:{line:3895,column:31}},{start:{line:3895,column:35},end:{line:3895,column:48}}],line:3895},"214":{loc:{start:{line:3896,column:21},end:{line:3896,column:33}},type:"binary-expr",locations:[{start:{line:3896,column:21},end:{line:3896,column:27}},{start:{line:3896,column:31},end:{line:3896,column:33}}],line:3896},"215":{loc:{start:{line:3899,column:12},end:{line:3901,column:13}},type:"if",locations:[{start:{line:3899,column:12},end:{line:3901,column:13}},{start:{line:3899,column:12},end:{line:3901,column:13}}],line:3899},"216":{loc:{start:{line:3899,column:17},end:{line:3899,column:39}},type:"binary-expr",locations:[{start:{line:3899,column:17},end:{line:3899,column:33}},{start:{line:3899,column:37},end:{line:3899,column:39}}],line:3899},"217":{loc:{start:{line:3903,column:12},end:{line:3906,column:13}},type:"if",locations:[{start:{line:3903,column:12},end:{line:3906,column:13}},{start:{line:3903,column:12},end:{line:3906,column:13}}],line:3903},"218":{loc:{start:{line:3909,column:16},end:{line:3915,column:17}},type:"if",locations:[{start:{line:3909,column:16},end:{line:3915,column:17}},{start:{line:3909,column:16},end:{line:3915,column:17}}],line:3909},"219":{loc:{start:{line:3972,column:12},end:{line:3976,column:13}},type:"if",locations:[{start:{line:3972,column:12},end:{line:3976,column:13}},{start:{line:3972,column:12},end:{line:3976,column:13}}],line:3972},"220":{loc:{start:{line:3972,column:16},end:{line:3972,column:78}},type:"binary-expr",locations:[{start:{line:3972,column:16},end:{line:3972,column:37}},{start:{line:3972,column:41},end:{line:3972,column:65}},{start:{line:3972,column:69},end:{line:3972,column:78}}],line:3972},"221":{loc:{start:{line:3978,column:23},end:{line:3978,column:48}},type:"binary-expr",locations:[{start:{line:3978,column:23},end:{line:3978,column:31}},{start:{line:3978,column:35},end:{line:3978,column:48}}],line:3978},"222":{loc:{start:{line:3979,column:21},end:{line:3979,column:33}},type:"binary-expr",locations:[{start:{line:3979,column:21},end:{line:3979,column:27}},{start:{line:3979,column:31},end:{line:3979,column:33}}],line:3979},"223":{loc:{start:{line:3983,column:12},end:{line:3985,column:13}},type:"if",locations:[{start:{line:3983,column:12},end:{line:3985,column:13}},{start:{line:3983,column:12},end:{line:3985,column:13}}],line:3983},"224":{loc:{start:{line:3987,column:29},end:{line:3987,column:62}},type:"binary-expr",locations:[{start:{line:3987,column:29},end:{line:3987,column:47}},{start:{line:3987,column:51},end:{line:3987,column:62}}],line:3987},"225":{loc:{start:{line:4004,column:20},end:{line:4009,column:21}},type:"if",locations:[{start:{line:4004,column:20},end:{line:4009,column:21}},{start:{line:4004,column:20},end:{line:4009,column:21}}],line:4004},"226":{loc:{start:{line:4072,column:20},end:{line:4072,column:31}},type:"binary-expr",locations:[{start:{line:4072,column:20},end:{line:4072,column:25}},{start:{line:4072,column:29},end:{line:4072,column:31}}],line:4072},"227":{loc:{start:{line:4073,column:26},end:{line:4073,column:43}},type:"binary-expr",locations:[{start:{line:4073,column:26},end:{line:4073,column:37}},{start:{line:4073,column:41},end:{line:4073,column:43}}],line:4073},"228":{loc:{start:{line:4082,column:34},end:{line:4082,column:55}},type:"binary-expr",locations:[{start:{line:4082,column:34},end:{line:4082,column:47}},{start:{line:4082,column:51},end:{line:4082,column:55}}],line:4082},"229":{loc:{start:{line:4192,column:20},end:{line:4192,column:31}},type:"binary-expr",locations:[{start:{line:4192,column:20},end:{line:4192,column:25}},{start:{line:4192,column:29},end:{line:4192,column:31}}],line:4192},"230":{loc:{start:{line:4193,column:26},end:{line:4193,column:43}},type:"binary-expr",locations:[{start:{line:4193,column:26},end:{line:4193,column:37}},{start:{line:4193,column:41},end:{line:4193,column:43}}],line:4193},"231":{loc:{start:{line:4258,column:20},end:{line:4258,column:31}},type:"binary-expr",locations:[{start:{line:4258,column:20},end:{line:4258,column:25}},{start:{line:4258,column:29},end:{line:4258,column:31}}],line:4258},"232":{loc:{start:{line:4259,column:26},end:{line:4259,column:43}},type:"binary-expr",locations:[{start:{line:4259,column:26},end:{line:4259,column:37}},{start:{line:4259,column:41},end:{line:4259,column:43}}],line:4259},"233":{loc:{start:{line:4263,column:34},end:{line:4263,column:55}},type:"binary-expr",locations:[{start:{line:4263,column:34},end:{line:4263,column:47}},{start:{line:4263,column:51},end:{line:4263,column:55}}],line:4263},"234":{loc:{start:{line:4273,column:12},end:{line:4275,column:13}},type:"if",locations:[{start:{line:4273,column:12},end:{line:4275,column:13}},{start:{line:4273,column:12},end:{line:4275,column:13}}],line:4273},"235":{loc:{start:{line:4273,column:16},end:{line:4273,column:59}},type:"binary-expr",locations:[{start:{line:4273,column:16},end:{line:4273,column:36}},{start:{line:4273,column:40},end:{line:4273,column:59}}],line:4273},"236":{loc:{start:{line:4276,column:12},end:{line:4278,column:13}},type:"if",locations:[{start:{line:4276,column:12},end:{line:4278,column:13}},{start:{line:4276,column:12},end:{line:4278,column:13}}],line:4276},"237":{loc:{start:{line:4276,column:16},end:{line:4276,column:60}},type:"binary-expr",locations:[{start:{line:4276,column:16},end:{line:4276,column:37}},{start:{line:4276,column:41},end:{line:4276,column:60}}],line:4276},"238":{loc:{start:{line:4279,column:12},end:{line:4282,column:13}},type:"if",locations:[{start:{line:4279,column:12},end:{line:4282,column:13}},{start:{line:4279,column:12},end:{line:4282,column:13}}],line:4279},"239":{loc:{start:{line:4388,column:32},end:{line:4388,column:59}},type:"binary-expr",locations:[{start:{line:4388,column:32},end:{line:4388,column:51}},{start:{line:4388,column:55},end:{line:4388,column:59}}],line:4388},"240":{loc:{start:{line:4402,column:12},end:{line:4405,column:13}},type:"if",locations:[{start:{line:4402,column:12},end:{line:4405,column:13}},{start:{line:4402,column:12},end:{line:4405,column:13}}],line:4402},"241":{loc:{start:{line:4406,column:12},end:{line:4408,column:13}},type:"if",locations:[{start:{line:4406,column:12},end:{line:4408,column:13}},{start:{line:4406,column:12},end:{line:4408,column:13}}],line:4406},"242":{loc:{start:{line:4406,column:16},end:{line:4406,column:55}},type:"binary-expr",locations:[{start:{line:4406,column:16},end:{line:4406,column:21}},{start:{line:4406,column:25},end:{line:4406,column:55}}],line:4406},"243":{loc:{start:{line:4411,column:32},end:{line:4411,column:69}},type:"binary-expr",locations:[{start:{line:4411,column:32},end:{line:4411,column:49}},{start:{line:4411,column:53},end:{line:4411,column:69}}],line:4411},"244":{loc:{start:{line:4550,column:41},end:{line:4551,column:53}},type:"cond-expr",locations:[{start:{line:4551,column:16},end:{line:4551,column:46}},{start:{line:4551,column:49},end:{line:4551,column:53}}],line:4550},"245":{loc:{start:{line:4570,column:12},end:{line:4572,column:13}},type:"if",locations:[{start:{line:4570,column:12},end:{line:4572,column:13}},{start:{line:4570,column:12},end:{line:4572,column:13}}],line:4570},"246":{loc:{start:{line:4570,column:16},end:{line:4570,column:49}},type:"binary-expr",locations:[{start:{line:4570,column:16},end:{line:4570,column:19}},{start:{line:4570,column:23},end:{line:4570,column:49}}],line:4570},"247":{loc:{start:{line:4574,column:12},end:{line:4576,column:13}},type:"if",locations:[{start:{line:4574,column:12},end:{line:4576,column:13}},{start:{line:4574,column:12},end:{line:4576,column:13}}],line:4574},"248":{loc:{start:{line:4595,column:12},end:{line:4597,column:13}},type:"if",locations:[{start:{line:4595,column:12},end:{line:4597,column:13}},{start:{line:4595,column:12},end:{line:4597,column:13}}],line:4595},"249":{loc:{start:{line:4598,column:12},end:{line:4604,column:13}},type:"if",locations:[{start:{line:4598,column:12},end:{line:4604,column:13}},{start:{line:4598,column:12},end:{line:4604,column:13}}],line:4598},"250":{loc:{start:{line:4605,column:12},end:{line:4610,column:13}},type:"if",locations:[{start:{line:4605,column:12},end:{line:4610,column:13}},{start:{line:4605,column:12},end:{line:4610,column:13}}],line:4605},"251":{loc:{start:{line:4618,column:12},end:{line:4623,column:13}},type:"if",locations:[{start:{line:4618,column:12},end:{line:4623,column:13}},{start:{line:4618,column:12},end:{line:4623,column:13}}],line:4618},"252":{loc:{start:{line:4643,column:12},end:{line:4645,column:13}},type:"if",locations:[{start:{line:4643,column:12},end:{line:4645,column:13}},{start:{line:4643,column:12},end:{line:4645,column:13}}],line:4643},"253":{loc:{start:{line:4649,column:12},end:{line:4651,column:13}},type:"if",locations:[{start:{line:4649,column:12},end:{line:4651,column:13}},{start:{line:4649,column:12},end:{line:4651,column:13}}],line:4649},"254":{loc:{start:{line:4653,column:12},end:{line:4656,column:13}},type:"if",locations:[{start:{line:4653,column:12},end:{line:4656,column:13}},{start:{line:4653,column:12},end:{line:4656,column:13}}],line:4653},"255":{loc:{start:{line:4653,column:16},end:{line:4653,column:86}},type:"binary-expr",locations:[{start:{line:4653,column:16},end:{line:4653,column:35}},{start:{line:4653,column:39},end:{line:4653,column:86}}],line:4653},"256":{loc:{start:{line:4658,column:12},end:{line:4661,column:13}},type:"if",locations:[{start:{line:4658,column:12},end:{line:4661,column:13}},{start:{line:4658,column:12},end:{line:4661,column:13}}],line:4658},"257":{loc:{start:{line:4658,column:16},end:{line:4658,column:104}},type:"binary-expr",locations:[{start:{line:4658,column:16},end:{line:4658,column:35}},{start:{line:4658,column:39},end:{line:4658,column:104}}],line:4658},"258":{loc:{start:{line:4663,column:12},end:{line:4665,column:13}},type:"if",locations:[{start:{line:4663,column:12},end:{line:4665,column:13}},{start:{line:4663,column:12},end:{line:4665,column:13}}],line:4663},"259":{loc:{start:{line:4663,column:16},end:{line:4663,column:85}},type:"binary-expr",locations:[{start:{line:4663,column:16},end:{line:4663,column:40}},{start:{line:4663,column:44},end:{line:4663,column:85}}],line:4663},"260":{loc:{start:{line:4678,column:31},end:{line:4678,column:83}},type:"cond-expr",locations:[{start:{line:4678,column:63},end:{line:4678,column:71}},{start:{line:4678,column:74},end:{line:4678,column:83}}],line:4678},"261":{loc:{start:{line:4694,column:12},end:{line:4696,column:13}},type:"if",locations:[{start:{line:4694,column:12},end:{line:4696,column:13}},{start:{line:4694,column:12},end:{line:4696,column:13}}],line:4694},"262":{loc:{start:{line:4698,column:12},end:{line:4700,column:13}},type:"if",locations:[{start:{line:4698,column:12},end:{line:4700,column:13}},{start:{line:4698,column:12},end:{line:4700,column:13}}],line:4698},"263":{loc:{start:{line:4709,column:12},end:{line:4711,column:13}},type:"if",locations:[{start:{line:4709,column:12},end:{line:4711,column:13}},{start:{line:4709,column:12},end:{line:4711,column:13}}],line:4709},"264":{loc:{start:{line:4738,column:12},end:{line:4740,column:13}},type:"if",locations:[{start:{line:4738,column:12},end:{line:4740,column:13}},{start:{line:4738,column:12},end:{line:4740,column:13}}],line:4738},"265":{loc:{start:{line:4742,column:12},end:{line:4744,column:13}},type:"if",locations:[{start:{line:4742,column:12},end:{line:4744,column:13}},{start:{line:4742,column:12},end:{line:4744,column:13}}],line:4742},"266":{loc:{start:{line:4746,column:12},end:{line:4748,column:13}},type:"if",locations:[{start:{line:4746,column:12},end:{line:4748,column:13}},{start:{line:4746,column:12},end:{line:4748,column:13}}],line:4746},"267":{loc:{start:{line:4746,column:16},end:{line:4746,column:73}},type:"binary-expr",locations:[{start:{line:4746,column:16},end:{line:4746,column:48}},{start:{line:4746,column:52},end:{line:4746,column:73}}],line:4746},"268":{loc:{start:{line:4749,column:12},end:{line:4751,column:13}},type:"if",locations:[{start:{line:4749,column:12},end:{line:4751,column:13}},{start:{line:4749,column:12},end:{line:4751,column:13}}],line:4749},"269":{loc:{start:{line:4749,column:16},end:{line:4749,column:69}},type:"binary-expr",locations:[{start:{line:4749,column:16},end:{line:4749,column:46}},{start:{line:4749,column:50},end:{line:4749,column:69}}],line:4749},"270":{loc:{start:{line:4752,column:12},end:{line:4754,column:13}},type:"if",locations:[{start:{line:4752,column:12},end:{line:4754,column:13}},{start:{line:4752,column:12},end:{line:4754,column:13}}],line:4752},"271":{loc:{start:{line:4752,column:16},end:{line:4752,column:71}},type:"binary-expr",locations:[{start:{line:4752,column:16},end:{line:4752,column:47}},{start:{line:4752,column:51},end:{line:4752,column:71}}],line:4752},"272":{loc:{start:{line:4755,column:12},end:{line:4757,column:13}},type:"if",locations:[{start:{line:4755,column:12},end:{line:4757,column:13}},{start:{line:4755,column:12},end:{line:4757,column:13}}],line:4755},"273":{loc:{start:{line:4755,column:16},end:{line:4755,column:73}},type:"binary-expr",locations:[{start:{line:4755,column:16},end:{line:4755,column:48}},{start:{line:4755,column:52},end:{line:4755,column:73}}],line:4755},"274":{loc:{start:{line:4783,column:12},end:{line:4785,column:13}},type:"if",locations:[{start:{line:4783,column:12},end:{line:4785,column:13}},{start:{line:4783,column:12},end:{line:4785,column:13}}],line:4783},"275":{loc:{start:{line:4787,column:12},end:{line:4789,column:13}},type:"if",locations:[{start:{line:4787,column:12},end:{line:4789,column:13}},{start:{line:4787,column:12},end:{line:4789,column:13}}],line:4787},"276":{loc:{start:{line:4814,column:12},end:{line:4816,column:13}},type:"if",locations:[{start:{line:4814,column:12},end:{line:4816,column:13}},{start:{line:4814,column:12},end:{line:4816,column:13}}],line:4814},"277":{loc:{start:{line:4818,column:12},end:{line:4820,column:13}},type:"if",locations:[{start:{line:4818,column:12},end:{line:4820,column:13}},{start:{line:4818,column:12},end:{line:4820,column:13}}],line:4818},"278":{loc:{start:{line:4821,column:12},end:{line:4823,column:13}},type:"if",locations:[{start:{line:4821,column:12},end:{line:4823,column:13}},{start:{line:4821,column:12},end:{line:4823,column:13}}],line:4821},"279":{loc:{start:{line:4846,column:12},end:{line:4848,column:13}},type:"if",locations:[{start:{line:4846,column:12},end:{line:4848,column:13}},{start:{line:4846,column:12},end:{line:4848,column:13}}],line:4846},"280":{loc:{start:{line:4850,column:12},end:{line:4852,column:13}},type:"if",locations:[{start:{line:4850,column:12},end:{line:4852,column:13}},{start:{line:4850,column:12},end:{line:4852,column:13}}],line:4850},"281":{loc:{start:{line:4860,column:12},end:{line:4862,column:13}},type:"if",locations:[{start:{line:4860,column:12},end:{line:4862,column:13}},{start:{line:4860,column:12},end:{line:4862,column:13}}],line:4860},"282":{loc:{start:{line:4883,column:12},end:{line:4885,column:13}},type:"if",locations:[{start:{line:4883,column:12},end:{line:4885,column:13}},{start:{line:4883,column:12},end:{line:4885,column:13}}],line:4883},"283":{loc:{start:{line:4887,column:12},end:{line:4889,column:13}},type:"if",locations:[{start:{line:4887,column:12},end:{line:4889,column:13}},{start:{line:4887,column:12},end:{line:4889,column:13}}],line:4887},"284":{loc:{start:{line:4894,column:12},end:{line:4896,column:13}},type:"if",locations:[{start:{line:4894,column:12},end:{line:4896,column:13}},{start:{line:4894,column:12},end:{line:4896,column:13}}],line:4894},"285":{loc:{start:{line:4894,column:16},end:{line:4894,column:73}},type:"binary-expr",locations:[{start:{line:4894,column:16},end:{line:4894,column:48}},{start:{line:4894,column:52},end:{line:4894,column:73}}],line:4894},"286":{loc:{start:{line:4897,column:12},end:{line:4899,column:13}},type:"if",locations:[{start:{line:4897,column:12},end:{line:4899,column:13}},{start:{line:4897,column:12},end:{line:4899,column:13}}],line:4897},"287":{loc:{start:{line:4897,column:16},end:{line:4897,column:69}},type:"binary-expr",locations:[{start:{line:4897,column:16},end:{line:4897,column:46}},{start:{line:4897,column:50},end:{line:4897,column:69}}],line:4897},"288":{loc:{start:{line:4900,column:12},end:{line:4902,column:13}},type:"if",locations:[{start:{line:4900,column:12},end:{line:4902,column:13}},{start:{line:4900,column:12},end:{line:4902,column:13}}],line:4900},"289":{loc:{start:{line:4900,column:16},end:{line:4900,column:71}},type:"binary-expr",locations:[{start:{line:4900,column:16},end:{line:4900,column:47}},{start:{line:4900,column:51},end:{line:4900,column:71}}],line:4900},"290":{loc:{start:{line:4903,column:12},end:{line:4905,column:13}},type:"if",locations:[{start:{line:4903,column:12},end:{line:4905,column:13}},{start:{line:4903,column:12},end:{line:4905,column:13}}],line:4903},"291":{loc:{start:{line:4903,column:16},end:{line:4903,column:73}},type:"binary-expr",locations:[{start:{line:4903,column:16},end:{line:4903,column:48}},{start:{line:4903,column:52},end:{line:4903,column:73}}],line:4903},"292":{loc:{start:{line:4929,column:12},end:{line:4931,column:13}},type:"if",locations:[{start:{line:4929,column:12},end:{line:4931,column:13}},{start:{line:4929,column:12},end:{line:4931,column:13}}],line:4929},"293":{loc:{start:{line:4933,column:12},end:{line:4935,column:13}},type:"if",locations:[{start:{line:4933,column:12},end:{line:4935,column:13}},{start:{line:4933,column:12},end:{line:4935,column:13}}],line:4933},"294":{loc:{start:{line:4958,column:12},end:{line:4960,column:13}},type:"if",locations:[{start:{line:4958,column:12},end:{line:4960,column:13}},{start:{line:4958,column:12},end:{line:4960,column:13}}],line:4958},"295":{loc:{start:{line:4962,column:12},end:{line:4964,column:13}},type:"if",locations:[{start:{line:4962,column:12},end:{line:4964,column:13}},{start:{line:4962,column:12},end:{line:4964,column:13}}],line:4962},"296":{loc:{start:{line:4965,column:12},end:{line:4967,column:13}},type:"if",locations:[{start:{line:4965,column:12},end:{line:4967,column:13}},{start:{line:4965,column:12},end:{line:4967,column:13}}],line:4965},"297":{loc:{start:{line:4990,column:12},end:{line:4992,column:13}},type:"if",locations:[{start:{line:4990,column:12},end:{line:4992,column:13}},{start:{line:4990,column:12},end:{line:4992,column:13}}],line:4990},"298":{loc:{start:{line:4995,column:12},end:{line:5047,column:13}},type:"if",locations:[{start:{line:4995,column:12},end:{line:5047,column:13}},{start:{line:4995,column:12},end:{line:5047,column:13}}],line:4995},"299":{loc:{start:{line:4995,column:16},end:{line:5002,column:41}},type:"binary-expr",locations:[{start:{line:4995,column:16},end:{line:4995,column:58}},{start:{line:4996,column:16},end:{line:5002,column:41}}],line:4995},"300":{loc:{start:{line:5008,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5008,column:17},end:{line:5047,column:13}},{start:{line:5008,column:17},end:{line:5047,column:13}}],line:5008},"301":{loc:{start:{line:5008,column:21},end:{line:5018,column:37}},type:"binary-expr",locations:[{start:{line:5008,column:21},end:{line:5008,column:40}},{start:{line:5009,column:16},end:{line:5018,column:37}}],line:5008},"302":{loc:{start:{line:5025,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5025,column:17},end:{line:5047,column:13}},{start:{line:5025,column:17},end:{line:5047,column:13}}],line:5025},"303":{loc:{start:{line:5025,column:21},end:{line:5032,column:37}},type:"binary-expr",locations:[{start:{line:5025,column:21},end:{line:5025,column:43}},{start:{line:5026,column:16},end:{line:5032,column:37}}],line:5025},"304":{loc:{start:{line:5039,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5039,column:17},end:{line:5047,column:13}},{start:{line:5039,column:17},end:{line:5047,column:13}}],line:5039},"305":{loc:{start:{line:5039,column:21},end:{line:5040,column:41}},type:"binary-expr",locations:[{start:{line:5039,column:21},end:{line:5039,column:74}},{start:{line:5040,column:16},end:{line:5040,column:41}}],line:5039},"306":{loc:{start:{line:5045,column:17},end:{line:5047,column:13}},type:"if",locations:[{start:{line:5045,column:17},end:{line:5047,column:13}},{start:{line:5045,column:17},end:{line:5047,column:13}}],line:5045},"307":{loc:{start:{line:5108,column:12},end:{line:5110,column:13}},type:"if",locations:[{start:{line:5108,column:12},end:{line:5110,column:13}},{start:{line:5108,column:12},end:{line:5110,column:13}}],line:5108},"308":{loc:{start:{line:5113,column:16},end:{line:5116,column:17}},type:"if",locations:[{start:{line:5113,column:16},end:{line:5116,column:17}},{start:{line:5113,column:16},end:{line:5116,column:17}}],line:5113},"309":{loc:{start:{line:5118,column:16},end:{line:5123,column:17}},type:"if",locations:[{start:{line:5118,column:16},end:{line:5123,column:17}},{start:{line:5118,column:16},end:{line:5123,column:17}}],line:5118},"310":{loc:{start:{line:5118,column:20},end:{line:5118,column:65}},type:"binary-expr",locations:[{start:{line:5118,column:20},end:{line:5118,column:39}},{start:{line:5118,column:43},end:{line:5118,column:65}}],line:5118},"311":{loc:{start:{line:5154,column:12},end:{line:5157,column:13}},type:"if",locations:[{start:{line:5154,column:12},end:{line:5157,column:13}},{start:{line:5154,column:12},end:{line:5157,column:13}}],line:5154},"312":{loc:{start:{line:5158,column:19},end:{line:5158,column:29}},type:"binary-expr",locations:[{start:{line:5158,column:19},end:{line:5158,column:23}},{start:{line:5158,column:27},end:{line:5158,column:29}}],line:5158},"313":{loc:{start:{line:5161,column:16},end:{line:5166,column:17}},type:"if",locations:[{start:{line:5161,column:16},end:{line:5166,column:17}},{start:{line:5161,column:16},end:{line:5166,column:17}}],line:5161},"314":{loc:{start:{line:5225,column:20},end:{line:5225,column:31}},type:"binary-expr",locations:[{start:{line:5225,column:20},end:{line:5225,column:25}},{start:{line:5225,column:29},end:{line:5225,column:31}}],line:5225},"315":{loc:{start:{line:5226,column:26},end:{line:5226,column:43}},type:"binary-expr",locations:[{start:{line:5226,column:26},end:{line:5226,column:37}},{start:{line:5226,column:41},end:{line:5226,column:43}}],line:5226},"316":{loc:{start:{line:5235,column:12},end:{line:5237,column:13}},type:"if",locations:[{start:{line:5235,column:12},end:{line:5237,column:13}},{start:{line:5235,column:12},end:{line:5237,column:13}}],line:5235},"317":{loc:{start:{line:5238,column:12},end:{line:5240,column:13}},type:"if",locations:[{start:{line:5238,column:12},end:{line:5240,column:13}},{start:{line:5238,column:12},end:{line:5240,column:13}}],line:5238},"318":{loc:{start:{line:5241,column:12},end:{line:5243,column:13}},type:"if",locations:[{start:{line:5241,column:12},end:{line:5243,column:13}},{start:{line:5241,column:12},end:{line:5243,column:13}}],line:5241},"319":{loc:{start:{line:5244,column:12},end:{line:5246,column:13}},type:"if",locations:[{start:{line:5244,column:12},end:{line:5246,column:13}},{start:{line:5244,column:12},end:{line:5246,column:13}}],line:5244},"320":{loc:{start:{line:5249,column:12},end:{line:5251,column:13}},type:"if",locations:[{start:{line:5249,column:12},end:{line:5251,column:13}},{start:{line:5249,column:12},end:{line:5251,column:13}}],line:5249},"321":{loc:{start:{line:5317,column:19},end:{line:5317,column:77}},type:"binary-expr",locations:[{start:{line:5317,column:19},end:{line:5317,column:48}},{start:{line:5317,column:52},end:{line:5317,column:69}},{start:{line:5317,column:73},end:{line:5317,column:77}}],line:5317},"322":{loc:{start:{line:5335,column:16},end:{line:5337,column:17}},type:"if",locations:[{start:{line:5335,column:16},end:{line:5337,column:17}},{start:{line:5335,column:16},end:{line:5337,column:17}}],line:5335},"323":{loc:{start:{line:5342,column:16},end:{line:5344,column:17}},type:"if",locations:[{start:{line:5342,column:16},end:{line:5344,column:17}},{start:{line:5342,column:16},end:{line:5344,column:17}}],line:5342},"324":{loc:{start:{line:5454,column:12},end:{line:5457,column:13}},type:"if",locations:[{start:{line:5454,column:12},end:{line:5457,column:13}},{start:{line:5454,column:12},end:{line:5457,column:13}}],line:5454},"325":{loc:{start:{line:5454,column:16},end:{line:5454,column:59}},type:"binary-expr",locations:[{start:{line:5454,column:16},end:{line:5454,column:25}},{start:{line:5454,column:29},end:{line:5454,column:59}}],line:5454},"326":{loc:{start:{line:5460,column:23},end:{line:5460,column:72}},type:"cond-expr",locations:[{start:{line:5460,column:38},end:{line:5460,column:67}},{start:{line:5460,column:70},end:{line:5460,column:72}}],line:5460},"327":{loc:{start:{line:5487,column:26},end:{line:5487,column:68}},type:"cond-expr",locations:[{start:{line:5487,column:43},end:{line:5487,column:60}},{start:{line:5487,column:65},end:{line:5487,column:67}}],line:5487},"328":{loc:{start:{line:5556,column:12},end:{line:5559,column:13}},type:"if",locations:[{start:{line:5556,column:12},end:{line:5559,column:13}},{start:{line:5556,column:12},end:{line:5559,column:13}}],line:5556},"329":{loc:{start:{line:5564,column:32},end:{line:5564,column:76}},type:"binary-expr",locations:[{start:{line:5564,column:32},end:{line:5564,column:70}},{start:{line:5564,column:74},end:{line:5564,column:76}}],line:5564},"330":{loc:{start:{line:5565,column:12},end:{line:5568,column:13}},type:"if",locations:[{start:{line:5565,column:12},end:{line:5568,column:13}},{start:{line:5565,column:12},end:{line:5568,column:13}}],line:5565},"331":{loc:{start:{line:5572,column:12},end:{line:5574,column:13}},type:"if",locations:[{start:{line:5572,column:12},end:{line:5574,column:13}},{start:{line:5572,column:12},end:{line:5574,column:13}}],line:5572},"332":{loc:{start:{line:5572,column:16},end:{line:5572,column:84}},type:"binary-expr",locations:[{start:{line:5572,column:16},end:{line:5572,column:48}},{start:{line:5572,column:52},end:{line:5572,column:84}}],line:5572},"333":{loc:{start:{line:5614,column:16},end:{line:5616,column:17}},type:"if",locations:[{start:{line:5614,column:16},end:{line:5616,column:17}},{start:{line:5614,column:16},end:{line:5616,column:17}}],line:5614},"334":{loc:{start:{line:5645,column:12},end:{line:5648,column:13}},type:"if",locations:[{start:{line:5645,column:12},end:{line:5648,column:13}},{start:{line:5645,column:12},end:{line:5648,column:13}}],line:5645},"335":{loc:{start:{line:5649,column:23},end:{line:5649,column:48}},type:"binary-expr",locations:[{start:{line:5649,column:23},end:{line:5649,column:31}},{start:{line:5649,column:35},end:{line:5649,column:48}}],line:5649},"336":{loc:{start:{line:5651,column:12},end:{line:5654,column:13}},type:"if",locations:[{start:{line:5651,column:12},end:{line:5654,column:13}},{start:{line:5651,column:12},end:{line:5654,column:13}}],line:5651},"337":{loc:{start:{line:5655,column:12},end:{line:5658,column:13}},type:"if",locations:[{start:{line:5655,column:12},end:{line:5658,column:13}},{start:{line:5655,column:12},end:{line:5658,column:13}}],line:5655},"338":{loc:{start:{line:5662,column:29},end:{line:5662,column:107}},type:"binary-expr",locations:[{start:{line:5662,column:29},end:{line:5662,column:48}},{start:{line:5662,column:52},end:{line:5662,column:78}},{start:{line:5662,column:82},end:{line:5662,column:107}}],line:5662},"339":{loc:{start:{line:5663,column:35},end:{line:5663,column:123}},type:"binary-expr",locations:[{start:{line:5663,column:35},end:{line:5663,column:54}},{start:{line:5663,column:58},end:{line:5663,column:89}},{start:{line:5663,column:93},end:{line:5663,column:123}}],line:5663},"340":{loc:{start:{line:5664,column:35},end:{line:5664,column:123}},type:"binary-expr",locations:[{start:{line:5664,column:35},end:{line:5664,column:54}},{start:{line:5664,column:58},end:{line:5664,column:89}},{start:{line:5664,column:93},end:{line:5664,column:123}}],line:5664},"341":{loc:{start:{line:5670,column:16},end:{line:5676,column:17}},type:"if",locations:[{start:{line:5670,column:16},end:{line:5676,column:17}},{start:{line:5670,column:16},end:{line:5676,column:17}}],line:5670},"342":{loc:{start:{line:5713,column:24},end:{line:5713,column:39}},type:"binary-expr",locations:[{start:{line:5713,column:24},end:{line:5713,column:33}},{start:{line:5713,column:37},end:{line:5713,column:39}}],line:5713},"343":{loc:{start:{line:5733,column:12},end:{line:5736,column:13}},type:"if",locations:[{start:{line:5733,column:12},end:{line:5736,column:13}},{start:{line:5733,column:12},end:{line:5736,column:13}}],line:5733},"344":{loc:{start:{line:5733,column:16},end:{line:5733,column:53}},type:"binary-expr",locations:[{start:{line:5733,column:16},end:{line:5733,column:40}},{start:{line:5733,column:44},end:{line:5733,column:53}}],line:5733},"345":{loc:{start:{line:5738,column:21},end:{line:5738,column:33}},type:"binary-expr",locations:[{start:{line:5738,column:21},end:{line:5738,column:27}},{start:{line:5738,column:31},end:{line:5738,column:33}}],line:5738},"346":{loc:{start:{line:5739,column:23},end:{line:5739,column:47}},type:"binary-expr",locations:[{start:{line:5739,column:23},end:{line:5739,column:31}},{start:{line:5739,column:35},end:{line:5739,column:47}}],line:5739},"347":{loc:{start:{line:5744,column:16},end:{line:5750,column:17}},type:"if",locations:[{start:{line:5744,column:16},end:{line:5750,column:17}},{start:{line:5744,column:16},end:{line:5750,column:17}}],line:5744},"348":{loc:{start:{line:5774,column:21},end:{line:5774,column:33}},type:"binary-expr",locations:[{start:{line:5774,column:21},end:{line:5774,column:27}},{start:{line:5774,column:31},end:{line:5774,column:33}}],line:5774},"349":{loc:{start:{line:5777,column:29},end:{line:5777,column:49}},type:"binary-expr",locations:[{start:{line:5777,column:29},end:{line:5777,column:44}},{start:{line:5777,column:48},end:{line:5777,column:49}}],line:5777},"350":{loc:{start:{line:5783,column:23},end:{line:5783,column:48}},type:"binary-expr",locations:[{start:{line:5783,column:23},end:{line:5783,column:31}},{start:{line:5783,column:35},end:{line:5783,column:48}}],line:5783},"351":{loc:{start:{line:5791,column:16},end:{line:5799,column:17}},type:"if",locations:[{start:{line:5791,column:16},end:{line:5799,column:17}},{start:{line:5791,column:16},end:{line:5799,column:17}}],line:5791},"352":{loc:{start:{line:5795,column:38},end:{line:5795,column:76}},type:"cond-expr",locations:[{start:{line:5795,column:53},end:{line:5795,column:72}},{start:{line:5795,column:75},end:{line:5795,column:76}}],line:5795}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0,"1197":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0},b:{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,0],"53":[0,0],"54":[0,0],"55":[0,0],"56":[0,0],"57":[0,0],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,0],"63":[0,0],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0,0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0,0],"83":[0,0],"84":[0,0],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0,0],"89":[0,0],"90":[0,0],"91":[0,0],"92":[0,0],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0,0],"97":[0,0],"98":[0,0],"99":[0,0],"100":[0,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[0,0],"105":[0,0],"106":[0,0],"107":[0,0],"108":[0,0],"109":[0,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[0,0],"114":[0,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[0,0],"119":[0,0],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[0,0],"127":[0,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[0,0],"134":[0,0],"135":[0,0],"136":[0,0],"137":[0,0],"138":[0,0],"139":[0,0],"140":[0,0],"141":[0,0],"142":[0,0],"143":[0,0],"144":[0,0],"145":[0,0,0],"146":[0,0],"147":[0,0],"148":[0,0],"149":[0,0,0],"150":[0,0],"151":[0,0],"152":[0,0],"153":[0,0],"154":[0,0,0],"155":[0,0],"156":[0,0],"157":[0,0],"158":[0,0],"159":[0,0],"160":[0,0],"161":[0,0],"162":[0,0],"163":[0,0],"164":[0,0],"165":[0,0],"166":[0,0],"167":[0,0],"168":[0,0],"169":[0,0],"170":[0,0],"171":[0,0],"172":[0,0],"173":[0,0],"174":[0,0],"175":[0,0],"176":[0,0],"177":[0,0],"178":[0,0],"179":[0,0],"180":[0,0],"181":[0,0],"182":[0,0],"183":[0,0],"184":[0,0],"185":[0,0],"186":[0,0],"187":[0,0],"188":[0,0],"189":[0,0],"190":[0,0],"191":[0,0],"192":[0,0,0,0],"193":[0,0],"194":[0,0],"195":[0,0],"196":[0,0],"197":[0,0],"198":[0,0],"199":[0,0],"200":[0,0],"201":[0,0],"202":[0,0],"203":[0,0],"204":[0,0],"205":[0,0],"206":[0,0],"207":[0,0],"208":[0,0],"209":[0,0],"210":[0,0],"211":[0,0],"212":[0,0,0],"213":[0,0],"214":[0,0],"215":[0,0],"216":[0,0],"217":[0,0],"218":[0,0],"219":[0,0],"220":[0,0,0],"221":[0,0],"222":[0,0],"223":[0,0],"224":[0,0],"225":[0,0],"226":[0,0],"227":[0,0],"228":[0,0],"229":[0,0],"230":[0,0],"231":[0,0],"232":[0,0],"233":[0,0],"234":[0,0],"235":[0,0],"236":[0,0],"237":[0,0],"238":[0,0],"239":[0,0],"240":[0,0],"241":[0,0],"242":[0,0],"243":[0,0],"244":[0,0],"245":[0,0],"246":[0,0],"247":[0,0],"248":[0,0],"249":[0,0],"250":[0,0],"251":[0,0],"252":[0,0],"253":[0,0],"254":[0,0],"255":[0,0],"256":[0,0],"257":[0,0],"258":[0,0],"259":[0,0],"260":[0,0],"261":[0,0],"262":[0,0],"263":[0,0],"264":[0,0],"265":[0,0],"266":[0,0],"267":[0,0],"268":[0,0],"269":[0,0],"270":[0,0],"271":[0,0],"272":[0,0],"273":[0,0],"274":[0,0],"275":[0,0],"276":[0,0],"277":[0,0],"278":[0,0],"279":[0,0],"280":[0,0],"281":[0,0],"282":[0,0],"283":[0,0],"284":[0,0],"285":[0,0],"286":[0,0],"287":[0,0],"288":[0,0],"289":[0,0],"290":[0,0],"291":[0,0],"292":[0,0],"293":[0,0],"294":[0,0],"295":[0,0],"296":[0,0],"297":[0,0],"298":[0,0],"299":[0,0],"300":[0,0],"301":[0,0],"302":[0,0],"303":[0,0],"304":[0,0],"305":[0,0],"306":[0,0],"307":[0,0],"308":[0,0],"309":[0,0],"310":[0,0],"311":[0,0],"312":[0,0],"313":[0,0],"314":[0,0],"315":[0,0],"316":[0,0],"317":[0,0],"318":[0,0],"319":[0,0],"320":[0,0],"321":[0,0,0],"322":[0,0],"323":[0,0],"324":[0,0],"325":[0,0],"326":[0,0],"327":[0,0],"328":[0,0],"329":[0,0],"330":[0,0],"331":[0,0],"332":[0,0],"333":[0,0],"334":[0,0],"335":[0,0],"336":[0,0],"337":[0,0],"338":[0,0,0],"339":[0,0,0],"340":[0,0,0],"341":[0,0],"342":[0,0],"343":[0,0],"344":[0,0],"345":[0,0],"346":[0,0],"347":[0,0],"348":[0,0],"349":[0,0],"350":[0,0],"351":[0,0],"352":[0,0]},_coverageSchema:"1a1c01bbd47fc00a2c39e90264f33305004495a9",hash:"1e13507780108878ff5a225bb0ab3d0d383df74e"};var coverage=global[gcv]||(global[gcv]={});if(!coverage[path]||coverage[path].hash!==hash){coverage[path]=coverageData;}var actualCoverage=coverage[path];{// @ts-ignore -cov_1ks4ntaci2=function(){return actualCoverage;};}return actualCoverage;}cov_1ks4ntaci2();cov_1ks4ntaci2().s[0]++;/*!*/ // Copyright 2014 Splunk, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. -(function(){"use strict";cov_1ks4ntaci2().f[0]++;var Context=(cov_1ks4ntaci2().s[1]++,require('./context'));var Http=(cov_1ks4ntaci2().s[2]++,require('./http'));var Async=(cov_1ks4ntaci2().s[3]++,require('./async'));var Paths=(cov_1ks4ntaci2().s[4]++,require('./paths').Paths);var Class=(cov_1ks4ntaci2().s[5]++,require('./jquery.class').Class);var utils=(cov_1ks4ntaci2().s[6]++,require('./utils'));var root=(cov_1ks4ntaci2().s[7]++,(cov_1ks4ntaci2().b[0][0]++,exports)||(cov_1ks4ntaci2().b[0][1]++,this));var Service=(cov_1ks4ntaci2().s[8]++,null);/** - * Contains functionality common to Splunk Enterprise and Splunk Storm. - * - * This class is an implementation detail and is therefore SDK-private. - * - * @class splunkjs.private.BaseService - * @extends splunkjs.Context - */var BaseService=(cov_1ks4ntaci2().s[9]++,Context.extend({init:function(){cov_1ks4ntaci2().f[1]++;cov_1ks4ntaci2().s[10]++;this._super.apply(this,arguments);}}));/** - * Provides a root access point to Splunk functionality with typed access to - * Splunk resources such as searches, indexes, inputs, and more. Provides - * methods to authenticate and create specialized instances of the service. - * - * @class splunkjs.Service - * @extends splunkjs.private.BaseService - */cov_1ks4ntaci2().s[11]++;module.exports=root=Service=BaseService.extend({/** - * Constructor for `splunkjs.Service`. - * - * @constructor - * @param {splunkjs.Http} http An instance of a `splunkjs.Http` class. - * @param {Object} params A dictionary of optional parameters: - * - `scheme` (_string_): The scheme ("http" or "https") for accessing Splunk. - * - `host` (_string_): The host name (the default is "localhost"). - * - `port` (_integer_): The port number (the default is 8089). - * - `username` (_string_): The Splunk account username, which is used to authenticate the Splunk instance. - * - `password` (_string_): The password, which is used to authenticate the Splunk instance. - * - `owner` (_string_): The owner (username) component of the namespace. - * - `app` (_string_): The app component of the namespace. - * - `sessionKey` (_string_): The current session token. - * - `autologin` (_boolean_): `true` to automatically try to log in again if the session terminates, `false` if not (`true` by default). - * - `version` (_string_): The version string for Splunk, for example "4.3.2" (the default is "5.0"). - * @return {splunkjs.Service} A new `splunkjs.Service` instance. - * - * @method splunkjs.Service - */init:function(){cov_1ks4ntaci2().f[2]++;cov_1ks4ntaci2().s[12]++;this._super.apply(this,arguments);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[13]++;this.specialize=utils.bind(this,this.specialize);cov_1ks4ntaci2().s[14]++;this.apps=utils.bind(this,this.apps);cov_1ks4ntaci2().s[15]++;this.configurations=utils.bind(this,this.configurations);cov_1ks4ntaci2().s[16]++;this.indexes=utils.bind(this,this.indexes);cov_1ks4ntaci2().s[17]++;this.savedSearches=utils.bind(this,this.savedSearches);cov_1ks4ntaci2().s[18]++;this.jobs=utils.bind(this,this.jobs);cov_1ks4ntaci2().s[19]++;this.users=utils.bind(this,this.users);cov_1ks4ntaci2().s[20]++;this.currentUser=utils.bind(this,this.currentUser);cov_1ks4ntaci2().s[21]++;this.views=utils.bind(this,this.views);cov_1ks4ntaci2().s[22]++;this.firedAlertGroups=utils.bind(this,this.firedAlertGroups);cov_1ks4ntaci2().s[23]++;this.dataModels=utils.bind(this,this.dataModels);},/** - * Creates a specialized version of the current `Service` instance for - * a specific namespace context. - * - * @example - * - * var svc = ...; - * var newService = svc.specialize("myuser", "unix"); - * - * @param {String} owner The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * @param {String} app The app context for this resource (such as "search"). The "-" wildcard means all apps. - * @return {splunkjs.Service} The specialized `Service` instance. - * - * @method splunkjs.Service - */specialize:function(owner,app){cov_1ks4ntaci2().f[3]++;cov_1ks4ntaci2().s[24]++;return new Service(this.http,{scheme:this.scheme,host:this.host,port:this.port,username:this.username,password:this.password,owner:owner,app:app,sessionKey:this.sessionKey,version:this.version});},/** - * Gets the `Applications` collection, which allows you to - * list installed apps and retrieve information about them. - * - * @example - * - * // List installed apps - * var apps = svc.apps(); - * apps.fetch(function(err) { console.log(apps.list()); }); - * - * @return {splunkjs.Service.Collection} The `Applications` collection. - * - * @endpoint apps/local - * @method splunkjs.Service - * @see splunkjs.Service.Applications - */apps:function(){cov_1ks4ntaci2().f[4]++;cov_1ks4ntaci2().s[25]++;return new root.Applications(this);},/** - * Gets the `Configurations` collection, which lets you - * create, list, and retrieve configuration (.conf) files. - * - * @example - * - * // List all properties in the 'props.conf' file - * var files = svc.configurations(); - * files.item("props", function(err, propsFile) { - * propsFile.fetch(function(err, props) { - * console.log(props.properties()); - * }); - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Configurations} The `Configurations` collection. - * - * @endpoint configs - * @method splunkjs.Service - * @see splunkjs.Service.Configurations - */configurations:function(namespace){cov_1ks4ntaci2().f[5]++;cov_1ks4ntaci2().s[26]++;return new root.Configurations(this,namespace);},/** - * Gets the `Indexes` collection, which lets you create, - * list, and update indexes. - * - * @example - * - * // Check if we have an _internal index - * var indexes = svc.indexes(); - * indexes.fetch(function(err, indexes) { - * var index = indexes.item("_internal"); - * console.log("Was index found: " + !!index); - * // `index` is an Index object. - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Indexes} The `Indexes` collection. - * - * @endpoint data/indexes - * @method splunkjs.Service - * @see splunkjs.Service.Indexes - */indexes:function(namespace){cov_1ks4ntaci2().f[6]++;cov_1ks4ntaci2().s[27]++;return new root.Indexes(this,namespace);},/** - * Gets the `SavedSearches` collection, which lets you - * create, list, and update saved searches. - * - * @example - * - * // List all # of saved searches - * var savedSearches = svc.savedSearches(); - * savedSearches.fetch(function(err, savedSearches) { - * console.log("# Of Saved Searches: " + savedSearches.list().length); - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.SavedSearches} The `SavedSearches` collection. - * - * @endpoint saved/searches - * @method splunkjs.Service - * @see splunkjs.Service.SavedSearches - */savedSearches:function(namespace){cov_1ks4ntaci2().f[7]++;cov_1ks4ntaci2().s[28]++;return new root.SavedSearches(this,namespace);},/** - * Gets the `StoragePasswords` collection, which lets you - * create, list, and update storage passwords. - * - * @example - * - * // List all # of storage passwords - * var storagePasswords = svc.storagePasswords(); - * storagePasswords.fetch(function(err, storagePasswords) { - * console.log("# of Storage Passwords: " + storagePasswords.list().length); - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.StoragePasswords} The `StoragePasswords` collection. - * - * @endpoint storage/passwords - * @method splunkjs.Service - * @see splunkjs.Service.StoragePasswords - */storagePasswords:function(namespace){cov_1ks4ntaci2().f[8]++;cov_1ks4ntaci2().s[29]++;return new root.StoragePasswords(this,namespace);},/** - * Gets the `FiredAlertGroupCollection` collection, which lets you - * list alert groups. - * - * @example - * - * // List all # of fired alert groups - * var firedAlertGroups = svc.firedAlertGroups(); - * firedAlertGroups.fetch(function(err, firedAlertGroups) { - * console.log("# of alert groups: " + firedAlertGroups.list().length); - * }); - * - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.FiredAlertGroupCollection} The `FiredAlertGroupCollection` collection. - * - * @endpoint saved/searches - * @method splunkjs.Service - * @see splunkjs.Service.FiredAlertGroupCollection - */firedAlertGroups:function(namespace){cov_1ks4ntaci2().f[9]++;cov_1ks4ntaci2().s[30]++;return new root.FiredAlertGroupCollection(this,namespace);},/** - * Gets the `Jobs` collection, which lets you create, list, - * and retrieve search jobs. - * - * @example - * - * // List all job IDs - * var jobs = svc.jobs(); - * jobs.fetch(function(err, jobs) { - * var list = jobs.list(); - * for(var i = 0; i < list.length; i++) { - * console.log("Job " + (i+1) + ": " + list[i].sid); - * } - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Jobs} The `Jobs` collection. - * - * @endpoint search/jobs - * @method splunkjs.Service - * @see splunkjs.Service.Jobs - */jobs:function(namespace){cov_1ks4ntaci2().f[10]++;cov_1ks4ntaci2().s[31]++;return new root.Jobs(this,namespace);},/** - * Gets the `DataModels` collection, which lets you create, list, - * and retrieve data models. - * - * @endpoint datamodel/model - * @method splunkjs.Service - * @see splunkjs.Service.DataModels - */dataModels:function(namespace){cov_1ks4ntaci2().f[11]++;cov_1ks4ntaci2().s[32]++;return new root.DataModels(this,namespace);},/** - * Gets the `Users` collection, which lets you create, - * list, and retrieve users. - * - * @example - * - * // List all usernames - * var users = svc.users(); - * users.fetch(function(err, users) { - * var list = users.list(); - * for(var i = 0; i < list.length; i++) { - * console.log("User " + (i+1) + ": " + list[i].properties().name); - * } - * }); - * - * @return {splunkjs.Service.Users} The `Users` collection. - * - * @endpoint authorization/users - * @method splunkjs.Service - * @see splunkjs.Service.Users - */users:function(){cov_1ks4ntaci2().f[12]++;cov_1ks4ntaci2().s[33]++;return new root.Users(this);},/** - * Gets the `Views` collection, which lets you create, - * list, and retrieve views (custom UIs built in Splunk's app framework). - * - * @example - * - * // List all views - * var views = svc.views(); - * views.fetch(function(err, views) { - * var list = views.list(); - * for(var i = 0; i < list.length; i++) { - * console.log("View " + (i+1) + ": " + list[i].properties().name); - * } - * }); - * - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Views} The `Views` collection. - * - * @endpoint data/ui/views - * @method splunkjs.Service - * @see splunkjs.Service.Views - */views:function(namespace){cov_1ks4ntaci2().f[13]++;cov_1ks4ntaci2().s[34]++;return new root.Views(this,namespace);},/** - * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: - * - * - Use `exec_mode=normal` to return a search job ID immediately (default). - * Poll for completion to find out when you can retrieve search results. - * - * - Use `exec_mode=blocking` to return the search job ID when the search has finished. - * - * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.oneshotSearch`. - * - * @example - * - * service.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { - * console.log("CREATED": newJob.sid); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Function} callback A function to call with the created job: `(err, createdJob)`. - * - * @endpoint search/jobs - * @method splunkjs.Service - */search:function(query,params,namespace,callback){cov_1ks4ntaci2().f[14]++;cov_1ks4ntaci2().s[35]++;if((cov_1ks4ntaci2().b[2][0]++,!callback)&&(cov_1ks4ntaci2().b[2][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[1][0]++;cov_1ks4ntaci2().s[36]++;callback=namespace;cov_1ks4ntaci2().s[37]++;namespace=null;}else{cov_1ks4ntaci2().b[1][1]++;}var jobs=(cov_1ks4ntaci2().s[38]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[39]++;return jobs.search(query,params,callback);},/** - * A convenience method to get a `Job` by its sid. - * - * @param {String} sid The search ID for a search job. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Function} callback A function to call with the created job: `(err, job)`. - * - * @endpoint search/jobs - * @method splunkjs.Service - */getJob:function(sid,namespace,callback){cov_1ks4ntaci2().f[15]++;cov_1ks4ntaci2().s[40]++;if((cov_1ks4ntaci2().b[4][0]++,!callback)&&(cov_1ks4ntaci2().b[4][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[3][0]++;cov_1ks4ntaci2().s[41]++;callback=namespace;cov_1ks4ntaci2().s[42]++;namespace=null;}else{cov_1ks4ntaci2().b[3][1]++;}var job=(cov_1ks4ntaci2().s[43]++,new root.Job(this,sid,namespace));cov_1ks4ntaci2().s[44]++;return job.fetch({},callback);},/** - * Creates a oneshot search from a given search query and optional parameters. - * - * @example - * - * service.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { - * console.log("RESULT FIELDS": results.fields); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search: - * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). - * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `rf` (_string_): Specifies one or more fields to add to the search. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Function} callback A function to call with the results of the search: `(err, results)`. - * - * @endpoint search/jobs - * @method splunkjs.Service - */oneshotSearch:function(query,params,namespace,callback){cov_1ks4ntaci2().f[16]++;cov_1ks4ntaci2().s[45]++;if((cov_1ks4ntaci2().b[6][0]++,!callback)&&(cov_1ks4ntaci2().b[6][1]++,utils.isFunction(namespace))){cov_1ks4ntaci2().b[5][0]++;cov_1ks4ntaci2().s[46]++;callback=namespace;cov_1ks4ntaci2().s[47]++;namespace=null;}else{cov_1ks4ntaci2().b[5][1]++;}var jobs=(cov_1ks4ntaci2().s[48]++,new root.Jobs(this,namespace));cov_1ks4ntaci2().s[49]++;return jobs.oneshotSearch(query,params,callback);},/** - * Gets the user that is currently logged in. - * - * @example - * - * service.currentUser(function(err, user) { - * console.log("Real name: ", user.properties().realname); - * }); - * - * @param {Function} callback A function to call with the user instance: `(err, user)`. - * @return {splunkjs.Service.currentUser} The `User`. - * - * @endpoint authorization/current-context - * @method splunkjs.Service - */currentUser:function(callback){cov_1ks4ntaci2().f[17]++;cov_1ks4ntaci2().s[50]++;callback=(cov_1ks4ntaci2().b[7][0]++,callback)||(cov_1ks4ntaci2().b[7][1]++,function(){cov_1ks4ntaci2().f[18]++;});var that=(cov_1ks4ntaci2().s[51]++,this);var req=(cov_1ks4ntaci2().s[52]++,this.get(Paths.currentUser,{},function(err,response){cov_1ks4ntaci2().f[19]++;cov_1ks4ntaci2().s[53]++;if(err){cov_1ks4ntaci2().b[8][0]++;cov_1ks4ntaci2().s[54]++;callback(err);}else{cov_1ks4ntaci2().b[8][1]++;var username=(cov_1ks4ntaci2().s[55]++,response.data.entry[0].content.username);var user=(cov_1ks4ntaci2().s[56]++,new root.User(that,username));cov_1ks4ntaci2().s[57]++;user.fetch(function(){cov_1ks4ntaci2().f[20]++;cov_1ks4ntaci2().s[58]++;if(req.wasAborted){cov_1ks4ntaci2().b[9][0]++;cov_1ks4ntaci2().s[59]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[9][1]++;cov_1ks4ntaci2().s[60]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[61]++;return req;},/** - * Gets configuration information about the server. - * - * @example - * - * service.serverInfo(function(err, info) { - * console.log("Splunk Version: ", info.properties().version); - * }); - * - * @param {Function} callback A function to call with the server info: `(err, info)`. - * - * @endpoint server/info - * @method splunkjs.Service - */serverInfo:function(callback){cov_1ks4ntaci2().f[21]++;cov_1ks4ntaci2().s[62]++;callback=(cov_1ks4ntaci2().b[10][0]++,callback)||(cov_1ks4ntaci2().b[10][1]++,function(){cov_1ks4ntaci2().f[22]++;});var serverInfo=(cov_1ks4ntaci2().s[63]++,new root.ServerInfo(this));cov_1ks4ntaci2().s[64]++;return serverInfo.fetch(callback);},/** - * Parses a search query. - * - * @example - * - * service.parse("search index=_internal | head 1", function(err, parse) { - * console.log("Commands: ", parse.commands); - * }); - * - * @param {String} query The search query to parse. - * @param {Object} params An object of options for the parser: - * - `enable_lookups` (_boolean_): If `true`, performs reverse lookups to expand the search expression. - * - `output_mode` (_string_): The output format (XML or JSON). - * - `parse_only` (_boolean_): If `true`, disables the expansion of search due to evaluation of subsearches, time term expansion, lookups, tags, eventtypes, and sourcetype alias. - * - `reload_macros` (_boolean_): If `true`, reloads macro definitions from macros.conf. - * @param {Function} callback A function to call with the parse info: `(err, parse)`. - * - * @endpoint search/parser - * @method splunkjs.Service - */parse:function(query,params,callback){cov_1ks4ntaci2().f[23]++;cov_1ks4ntaci2().s[65]++;if((cov_1ks4ntaci2().b[12][0]++,!callback)&&(cov_1ks4ntaci2().b[12][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[11][0]++;cov_1ks4ntaci2().s[66]++;callback=params;cov_1ks4ntaci2().s[67]++;params={};}else{cov_1ks4ntaci2().b[11][1]++;}cov_1ks4ntaci2().s[68]++;callback=(cov_1ks4ntaci2().b[13][0]++,callback)||(cov_1ks4ntaci2().b[13][1]++,function(){cov_1ks4ntaci2().f[24]++;});cov_1ks4ntaci2().s[69]++;params=(cov_1ks4ntaci2().b[14][0]++,params)||(cov_1ks4ntaci2().b[14][1]++,{});cov_1ks4ntaci2().s[70]++;params.q=query;cov_1ks4ntaci2().s[71]++;return this.get(Paths.parser,params,function(err,response){cov_1ks4ntaci2().f[25]++;cov_1ks4ntaci2().s[72]++;if(err){cov_1ks4ntaci2().b[15][0]++;cov_1ks4ntaci2().s[73]++;callback(err);}else{cov_1ks4ntaci2().b[15][1]++;cov_1ks4ntaci2().s[74]++;callback(null,response.data);}});},/** - * Provides auto-complete suggestions for search queries. - * - * @example - * - * service.typeahead("index=", 10, function(err, options) { - * console.log("Autocompletion options: ", options); - * }); - * - * @param {String} prefix The query fragment to autocomplete. - * @param {Number} count The number of options to return (optional). - * @param {Function} callback A function to call with the autocompletion info: `(err, options)`. - * - * @endpoint search/typeahead - * @method splunkjs.Service - */typeahead:function(prefix,count,callback){cov_1ks4ntaci2().f[26]++;cov_1ks4ntaci2().s[75]++;if((cov_1ks4ntaci2().b[17][0]++,!callback)&&(cov_1ks4ntaci2().b[17][1]++,utils.isFunction(count))){cov_1ks4ntaci2().b[16][0]++;cov_1ks4ntaci2().s[76]++;callback=count;cov_1ks4ntaci2().s[77]++;count=10;}else{cov_1ks4ntaci2().b[16][1]++;}cov_1ks4ntaci2().s[78]++;callback=(cov_1ks4ntaci2().b[18][0]++,callback)||(cov_1ks4ntaci2().b[18][1]++,function(){cov_1ks4ntaci2().f[27]++;});var params=(cov_1ks4ntaci2().s[79]++,{count:(cov_1ks4ntaci2().b[19][0]++,count)||(cov_1ks4ntaci2().b[19][1]++,10),prefix:prefix});cov_1ks4ntaci2().s[80]++;return this.get(Paths.typeahead,params,function(err,response){cov_1ks4ntaci2().f[28]++;cov_1ks4ntaci2().s[81]++;if(err){cov_1ks4ntaci2().b[20][0]++;cov_1ks4ntaci2().s[82]++;callback(err);}else{cov_1ks4ntaci2().b[20][1]++;var results=(cov_1ks4ntaci2().s[83]++,((cov_1ks4ntaci2().b[21][0]++,response.data)||(cov_1ks4ntaci2().b[21][1]++,{})).results);cov_1ks4ntaci2().s[84]++;callback(null,(cov_1ks4ntaci2().b[22][0]++,results)||(cov_1ks4ntaci2().b[22][1]++,[]));}});},/** - * Logs an event to Splunk. - * - * @example - * - * service.log("A new event", {index: "_internal", sourcetype: "mysourcetype"}, function(err, result) { - * console.log("Submitted event: ", result); - * }); - * - * @param {String|Object} event The text for this event, or a JSON object. - * @param {Object} params A dictionary of parameters for indexing: - * - `index` (_string_): The index to send events from this input to. - * - `host` (_string_): The value to populate in the Host field for events from this data input. - * - `host_regex` (_string_): A regular expression used to extract the host value from each event. - * - `source` (_string_): The value to populate in the Source field for events from this data input. - * - `sourcetype` (_string_): The value to populate in the Sourcetype field for events from this data input. - * @param {Function} callback A function to call when the event is submitted: `(err, result)`. - * - * @endpoint receivers/simple - * @method splunkjs.Service - */log:function(event,params,callback){cov_1ks4ntaci2().f[29]++;cov_1ks4ntaci2().s[85]++;if((cov_1ks4ntaci2().b[24][0]++,!callback)&&(cov_1ks4ntaci2().b[24][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[23][0]++;cov_1ks4ntaci2().s[86]++;callback=params;cov_1ks4ntaci2().s[87]++;params={};}else{cov_1ks4ntaci2().b[23][1]++;}cov_1ks4ntaci2().s[88]++;callback=(cov_1ks4ntaci2().b[25][0]++,callback)||(cov_1ks4ntaci2().b[25][1]++,function(){cov_1ks4ntaci2().f[30]++;});cov_1ks4ntaci2().s[89]++;params=(cov_1ks4ntaci2().b[26][0]++,params)||(cov_1ks4ntaci2().b[26][1]++,{});// If the event is a JSON object, convert it to a string. -cov_1ks4ntaci2().s[90]++;if(utils.isObject(event)){cov_1ks4ntaci2().b[27][0]++;cov_1ks4ntaci2().s[91]++;event=JSON.stringify(event);}else{cov_1ks4ntaci2().b[27][1]++;}var path=(cov_1ks4ntaci2().s[92]++,this.paths.submitEvent);var method=(cov_1ks4ntaci2().s[93]++,"POST");var headers=(cov_1ks4ntaci2().s[94]++,{"Content-Type":"text/plain"});var body=(cov_1ks4ntaci2().s[95]++,event);var get=(cov_1ks4ntaci2().s[96]++,params);var post=(cov_1ks4ntaci2().s[97]++,{});var req=(cov_1ks4ntaci2().s[98]++,this.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[31]++;cov_1ks4ntaci2().s[99]++;if(err){cov_1ks4ntaci2().b[28][0]++;cov_1ks4ntaci2().s[100]++;callback(err);}else{cov_1ks4ntaci2().b[28][1]++;cov_1ks4ntaci2().s[101]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[102]++;return req;}});/** - * Provides a base definition for a Splunk endpoint, which is a combination of - * a specific service and path. Provides convenience methods for GET, POST, and - * DELETE operations used in splunkjs, automatically preparing the path correctly - * and allowing for relative calls. - * - * @class splunkjs.Service.Endpoint - */cov_1ks4ntaci2().s[103]++;root.Endpoint=Class.extend({/** - * Constructor for `splunkjs.Service.Endpoint`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} qualifiedPath A fully-qualified relative endpoint path (for example, "/services/search/jobs"). - * @return {splunkjs.Service.Endpoint} A new `splunkjs.Service.Endpoint` instance. - * - * @method splunkjs.Service.Endpoint - */init:function(service,qualifiedPath){cov_1ks4ntaci2().f[32]++;cov_1ks4ntaci2().s[104]++;if(!service){cov_1ks4ntaci2().b[29][0]++;cov_1ks4ntaci2().s[105]++;throw new Error("Passed in a null Service.");}else{cov_1ks4ntaci2().b[29][1]++;}cov_1ks4ntaci2().s[106]++;if(!qualifiedPath){cov_1ks4ntaci2().b[30][0]++;cov_1ks4ntaci2().s[107]++;throw new Error("Passed in an empty path.");}else{cov_1ks4ntaci2().b[30][1]++;}cov_1ks4ntaci2().s[108]++;this.service=service;cov_1ks4ntaci2().s[109]++;this.qualifiedPath=qualifiedPath;// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[110]++;this.get=utils.bind(this,this.get);cov_1ks4ntaci2().s[111]++;this.get_v2=utils.bind(this,this.get_v2);cov_1ks4ntaci2().s[112]++;this.post=utils.bind(this,this.post);cov_1ks4ntaci2().s[113]++;this.del=utils.bind(this,this.del);},/** - * Performs a relative GET request on an endpoint's path, - * combined with the parameters and a relative path if specified. - * - * @example - * - * // Will make a request to {service.prefix}/search/jobs/123456/results?offset=1 - * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); - * endpoint.get("results", {offset: 1}, function() { console.log("DONE"))}); - * - * @param {String} relpath A relative path to append to the endpoint path. - * @param {Object} params A dictionary of entity-specific parameters to add to the query string. - * @param {Function} callback A function to call when the request is complete: `(err, response)`. - * - * @method splunkjs.Service.Endpoint - */get:function(relpath,params,callback){cov_1ks4ntaci2().f[33]++;var url=(cov_1ks4ntaci2().s[114]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[115]++;if(relpath){cov_1ks4ntaci2().b[31][0]++;cov_1ks4ntaci2().s[116]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[31][1]++;}cov_1ks4ntaci2().s[117]++;return this.service.get(url,params,callback);},get_v2:function(relpath,params){cov_1ks4ntaci2().f[34]++;var url=(cov_1ks4ntaci2().s[118]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[119]++;if(relpath){cov_1ks4ntaci2().b[32][0]++;cov_1ks4ntaci2().s[120]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[32][1]++;}cov_1ks4ntaci2().s[121]++;return this.service.get_v2(url,params);},/** - * Performs a relative POST request on an endpoint's path, - * combined with the parameters and a relative path if specified. - * - * @example - * - * // Will make a request to {service.prefix}/search/jobs/123456/control - * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); - * endpoint.post("control", {action: "cancel"}, function() { console.log("CANCELLED"))}); - * - * @param {String} relpath A relative path to append to the endpoint path. - * @param {Object} params A dictionary of entity-specific parameters to add to the body. - * @param {Function} callback A function to call when the request is complete: `(err, response)`. - * - * @method splunkjs.Service.Endpoint - */post:function(relpath,params,callback){cov_1ks4ntaci2().f[35]++;var url=(cov_1ks4ntaci2().s[122]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[123]++;if(relpath){cov_1ks4ntaci2().b[33][0]++;cov_1ks4ntaci2().s[124]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[33][1]++;}cov_1ks4ntaci2().s[125]++;return this.service.post(url,params,callback);},/** - * Performs a relative DELETE request on an endpoint's path, - * combined with the parameters and a relative path if specified. - * - * @example - * - * // Will make a request to {service.prefix}/search/jobs/123456 - * var endpoint = new splunkjs.Service.Endpoint(service, "search/jobs/12345"); - * endpoint.delete("", {}, function() { console.log("DELETED"))}); - * - * @param {String} relpath A relative path to append to the endpoint path. - * @param {Object} params A dictionary of entity-specific parameters to add to the query string. - * @param {Function} callback A function to call when the request is complete: `(err, response)`. - * - * @method splunkjs.Service.Endpoint - */del:function(relpath,params,callback){cov_1ks4ntaci2().f[36]++;var url=(cov_1ks4ntaci2().s[126]++,this.qualifiedPath);// If we have a relative path, we will append it with a preceding -// slash. -cov_1ks4ntaci2().s[127]++;if(relpath){cov_1ks4ntaci2().b[34][0]++;cov_1ks4ntaci2().s[128]++;url=url+"/"+relpath;}else{cov_1ks4ntaci2().b[34][1]++;}cov_1ks4ntaci2().s[129]++;return this.service.del(url,params,callback);}});/** - * Provides a base definition for a Splunk resource (for example, an entity - * such as an index or search job, or a collection of entities). Provides - * basic methods for handling Splunk resources, such as validation and - * accessing properties. - * - * This class should not be used directly because most methods are meant to be overridden. - * - * @class splunkjs.Service.Resource - * @extends splunkjs.Service.Endpoint - */cov_1ks4ntaci2().s[130]++;root.Resource=root.Endpoint.extend({/** - * Constructor for `splunkjs.Service.Resource`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} path A relative endpoint path (for example, "search/jobs"). - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Resource} A new `splunkjs.Service.Resource` instance. - * - * @method splunkjs.Service.Resource - */init:function(service,path,namespace){cov_1ks4ntaci2().f[37]++;var fullpath=(cov_1ks4ntaci2().s[131]++,service.fullpath(path,namespace));cov_1ks4ntaci2().s[132]++;this._super(service,fullpath);cov_1ks4ntaci2().s[133]++;this.namespace=namespace;cov_1ks4ntaci2().s[134]++;this._properties={};cov_1ks4ntaci2().s[135]++;this._state={};// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[136]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[137]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[138]++;this.properties=utils.bind(this,this.properties);cov_1ks4ntaci2().s[139]++;this.state=utils.bind(this,this.state);cov_1ks4ntaci2().s[140]++;this.path=utils.bind(this,this.path);},/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Resource - */path:function(){cov_1ks4ntaci2().f[38]++;cov_1ks4ntaci2().s[141]++;throw new Error("MUST BE OVERRIDDEN");},/** - * Loads the resource and stores the properties. - * - * @param {Object} properties The properties for this resource. - * - * @method splunkjs.Service.Resource - * @protected - */_load:function(properties){cov_1ks4ntaci2().f[39]++;cov_1ks4ntaci2().s[142]++;this._properties=(cov_1ks4ntaci2().b[35][0]++,properties)||(cov_1ks4ntaci2().b[35][1]++,{});cov_1ks4ntaci2().s[143]++;this._state=(cov_1ks4ntaci2().b[36][0]++,properties)||(cov_1ks4ntaci2().b[36][1]++,{});},/** - * Refreshes the resource by fetching the object from the server - * and loading it. - * - * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. - * - * @method splunkjs.Service.Resource - * @protected - */fetch:function(callback){cov_1ks4ntaci2().f[40]++;cov_1ks4ntaci2().s[144]++;throw new Error("MUST BE OVERRIDDEN");},/** - * Retrieves the current properties for this resource. - * - * @return {Object} The properties. - * - * @method splunkjs.Service.Resource - */properties:function(){cov_1ks4ntaci2().f[41]++;cov_1ks4ntaci2().s[145]++;return this._properties;},/** - * Retrieves the current full state (properties and metadata) of this resource. - * - * @return {Object} The current full state of this resource. - * - * @method splunkjs.Service.Resource - */state:function(){cov_1ks4ntaci2().f[42]++;cov_1ks4ntaci2().s[146]++;return this._state;}});/** - * Defines a base class for a Splunk entity, which is a well-defined construct - * with certain operations (such as "properties", "update", and "delete"). - * Entities include search jobs, indexes, inputs, apps, and more. - * - * Provides basic methods for working with Splunk entities, such as fetching and - * updating them. - * - * @class splunkjs.Service.Entity - * @extends splunkjs.Service.Resource - */cov_1ks4ntaci2().s[147]++;root.Entity=root.Resource.extend({/** - * A static property that indicates whether to call `fetch` after an - * update to get the updated entity. By default, the entity is not - * fetched because the endpoint returns (echoes) the updated entity. - * - * @method splunkjs.Service.Entity - */fetchOnUpdate:false,/** - * Constructor for `splunkjs.Service.Entity`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} path A relative endpoint path (for example, "search/jobs"). - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. - * - * @method splunkjs.Service.Entity - */init:function(service,path,namespace){cov_1ks4ntaci2().f[43]++;cov_1ks4ntaci2().s[148]++;this._super(service,path,namespace);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[149]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[150]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[151]++;this.remove=utils.bind(this,this.remove);cov_1ks4ntaci2().s[152]++;this.update=utils.bind(this,this.update);cov_1ks4ntaci2().s[153]++;this.fields=utils.bind(this,this.fields);cov_1ks4ntaci2().s[154]++;this.links=utils.bind(this,this.links);cov_1ks4ntaci2().s[155]++;this.acl=utils.bind(this,this.acl);cov_1ks4ntaci2().s[156]++;this.author=utils.bind(this,this.author);cov_1ks4ntaci2().s[157]++;this.updated=utils.bind(this,this.updated);cov_1ks4ntaci2().s[158]++;this.published=utils.bind(this,this.published);cov_1ks4ntaci2().s[159]++;this.enable=utils.bind(this,this.enable);cov_1ks4ntaci2().s[160]++;this.disable=utils.bind(this,this.disable);cov_1ks4ntaci2().s[161]++;this.reload=utils.bind(this,this.reload);// Initial values -cov_1ks4ntaci2().s[162]++;this._properties={};cov_1ks4ntaci2().s[163]++;this._fields={};cov_1ks4ntaci2().s[164]++;this._acl={};cov_1ks4ntaci2().s[165]++;this._links={};},/** - * Loads the entity and stores the properties. - * - * @param {Object} properties The properties for this entity. - * - * @method splunkjs.Service.Entity - * @protected - */_load:function(properties){cov_1ks4ntaci2().f[44]++;cov_1ks4ntaci2().s[166]++;properties=utils.isArray(properties)?(cov_1ks4ntaci2().b[37][0]++,properties[0]):(cov_1ks4ntaci2().b[37][1]++,properties);// Initialize the properties to -// empty values -cov_1ks4ntaci2().s[167]++;properties=(cov_1ks4ntaci2().b[38][0]++,properties)||(cov_1ks4ntaci2().b[38][1]++,{content:{},fields:{},acl:{},links:{}});cov_1ks4ntaci2().s[168]++;this._super(properties);// Take out the entity-specific content -cov_1ks4ntaci2().s[169]++;this._properties=(cov_1ks4ntaci2().b[39][0]++,properties.content)||(cov_1ks4ntaci2().b[39][1]++,{});cov_1ks4ntaci2().s[170]++;this._fields=(cov_1ks4ntaci2().b[40][0]++,properties.fields)||(cov_1ks4ntaci2().b[40][1]++,this._fields)||(cov_1ks4ntaci2().b[40][2]++,{});cov_1ks4ntaci2().s[171]++;this._acl=(cov_1ks4ntaci2().b[41][0]++,properties.acl)||(cov_1ks4ntaci2().b[41][1]++,{});cov_1ks4ntaci2().s[172]++;this._links=(cov_1ks4ntaci2().b[42][0]++,properties.links)||(cov_1ks4ntaci2().b[42][1]++,{});cov_1ks4ntaci2().s[173]++;this._author=(cov_1ks4ntaci2().b[43][0]++,properties.author)||(cov_1ks4ntaci2().b[43][1]++,null);cov_1ks4ntaci2().s[174]++;this._updated=(cov_1ks4ntaci2().b[44][0]++,properties.updated)||(cov_1ks4ntaci2().b[44][1]++,null);cov_1ks4ntaci2().s[175]++;this._published=(cov_1ks4ntaci2().b[45][0]++,properties.published)||(cov_1ks4ntaci2().b[45][1]++,null);},/** - * Retrieves the fields information for this entity, indicating which - * fields are wildcards, required, and optional. - * - * @return {Object} The fields information. - * - * @method splunkjs.Service.Entity - */fields:function(){cov_1ks4ntaci2().f[45]++;cov_1ks4ntaci2().s[176]++;return this._fields;},/** - * Retrieves the access control list (ACL) information for this entity, - * which contains the permissions for accessing the entity. - * - * @return {Object} The ACL. - * - * @method splunkjs.Service.Entity - */acl:function(){cov_1ks4ntaci2().f[46]++;cov_1ks4ntaci2().s[177]++;return this._acl;},/** - * Retrieves the links information for this entity, which is the URI of - * the entity relative to the management port of a Splunk instance. - * - * @return {Object} The links information. - * - * @method splunkjs.Service.Entity - */links:function(){cov_1ks4ntaci2().f[47]++;cov_1ks4ntaci2().s[178]++;return this._links;},/** - * Retrieves the author information for this entity. - * - * @return {String} The author. - * - * @method splunkjs.Service.Entity - */author:function(){cov_1ks4ntaci2().f[48]++;cov_1ks4ntaci2().s[179]++;return this._author;},/** - * Retrieves the updated time for this entity. - * - * @return {String} The updated time. - * - * @method splunkjs.Service.Entity - */updated:function(){cov_1ks4ntaci2().f[49]++;cov_1ks4ntaci2().s[180]++;return this._updated;},/** - * Retrieves the published time for this entity. - * - * @return {String} The published time. - * - * @method splunkjs.Service.Entity - */published:function(){cov_1ks4ntaci2().f[50]++;cov_1ks4ntaci2().s[181]++;return this._published;},/** - * Refreshes the entity by fetching the object from the server and - * loading it. - * - * @param {Object} options An optional dictionary of collection filtering and pagination options: - * - `count` (_integer_): The maximum number of items to return. - * - `offset` (_integer_): The offset of the first item to return. - * - `search` (_string_): The search query to filter responses. - * - `sort_dir` (_string_): The direction to sort returned items: “asc” or “desc”. - * - `sort_key` (_string_): The field to use for sorting (optional). - * - `sort_mode` (_string_): The collating sequence for sorting returned items: “auto”, “alpha”, “alpha_case”, or “num”. - * @param {Function} callback A function to call when the object is retrieved: `(err, resource)`. - * - * @method splunkjs.Service.Entity - */fetch:function(options,callback){cov_1ks4ntaci2().f[51]++;cov_1ks4ntaci2().s[182]++;if((cov_1ks4ntaci2().b[47][0]++,!callback)&&(cov_1ks4ntaci2().b[47][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[46][0]++;cov_1ks4ntaci2().s[183]++;callback=options;cov_1ks4ntaci2().s[184]++;options={};}else{cov_1ks4ntaci2().b[46][1]++;}cov_1ks4ntaci2().s[185]++;callback=(cov_1ks4ntaci2().b[48][0]++,callback)||(cov_1ks4ntaci2().b[48][1]++,function(){cov_1ks4ntaci2().f[52]++;});cov_1ks4ntaci2().s[186]++;options=(cov_1ks4ntaci2().b[49][0]++,options)||(cov_1ks4ntaci2().b[49][1]++,{});var that=(cov_1ks4ntaci2().s[187]++,this);cov_1ks4ntaci2().s[188]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[53]++;cov_1ks4ntaci2().s[189]++;if(err){cov_1ks4ntaci2().b[50][0]++;cov_1ks4ntaci2().s[190]++;callback(err);}else{cov_1ks4ntaci2().b[50][1]++;cov_1ks4ntaci2().s[191]++;that._load(response.data?(cov_1ks4ntaci2().b[51][0]++,response.data.entry):(cov_1ks4ntaci2().b[51][1]++,null));cov_1ks4ntaci2().s[192]++;callback(null,that);}});},/** - * Deletes the entity from the server. - * - * @param {Function} callback A function to call when the object is deleted: `(err)`. - * - * @method splunkjs.Service.Entity - * @protected - */remove:function(callback){cov_1ks4ntaci2().f[54]++;cov_1ks4ntaci2().s[193]++;callback=(cov_1ks4ntaci2().b[52][0]++,callback)||(cov_1ks4ntaci2().b[52][1]++,function(){cov_1ks4ntaci2().f[55]++;});var that=(cov_1ks4ntaci2().s[194]++,this);cov_1ks4ntaci2().s[195]++;return this.del("",{},function(err){cov_1ks4ntaci2().f[56]++;cov_1ks4ntaci2().s[196]++;callback(err);});},/** - * Updates the entity on the server. - * - * @param {Object} props The properties to update the object with. - * @param {Function} callback A function to call when the object is updated: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */update:function(props,callback){cov_1ks4ntaci2().f[57]++;cov_1ks4ntaci2().s[197]++;callback=(cov_1ks4ntaci2().b[53][0]++,callback)||(cov_1ks4ntaci2().b[53][1]++,function(){cov_1ks4ntaci2().f[58]++;});cov_1ks4ntaci2().s[198]++;if(props.hasOwnProperty("name")){cov_1ks4ntaci2().b[54][0]++;cov_1ks4ntaci2().s[199]++;throw new Error("Cannot set 'name' field in 'update'");}else{cov_1ks4ntaci2().b[54][1]++;}var that=(cov_1ks4ntaci2().s[200]++,this);var req=(cov_1ks4ntaci2().s[201]++,this.post("",props,function(err,response){cov_1ks4ntaci2().f[59]++;cov_1ks4ntaci2().s[202]++;if((cov_1ks4ntaci2().b[56][0]++,!err)&&(cov_1ks4ntaci2().b[56][1]++,!that.fetchOnUpdate)){cov_1ks4ntaci2().b[55][0]++;cov_1ks4ntaci2().s[203]++;that._load(response.data.entry);cov_1ks4ntaci2().s[204]++;callback(err,that);}else{cov_1ks4ntaci2().b[55][1]++;cov_1ks4ntaci2().s[205]++;if((cov_1ks4ntaci2().b[58][0]++,!err)&&(cov_1ks4ntaci2().b[58][1]++,that.fetchOnUpdate)){cov_1ks4ntaci2().b[57][0]++;cov_1ks4ntaci2().s[206]++;that.fetch(function(){cov_1ks4ntaci2().f[60]++;cov_1ks4ntaci2().s[207]++;if(req.wasAborted){cov_1ks4ntaci2().b[59][0]++;cov_1ks4ntaci2().s[208]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[59][1]++;cov_1ks4ntaci2().s[209]++;callback.apply(null,arguments);}});}else{cov_1ks4ntaci2().b[57][1]++;cov_1ks4ntaci2().s[210]++;callback(err,that);}}}));cov_1ks4ntaci2().s[211]++;return req;},/** - * Disables the entity on the server. - * - * @param {Function} callback A function to call when the object is disabled: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */disable:function(callback){cov_1ks4ntaci2().f[61]++;cov_1ks4ntaci2().s[212]++;callback=(cov_1ks4ntaci2().b[60][0]++,callback)||(cov_1ks4ntaci2().b[60][1]++,function(){cov_1ks4ntaci2().f[62]++;});var that=(cov_1ks4ntaci2().s[213]++,this);cov_1ks4ntaci2().s[214]++;this.post("disable",{},function(err,response){cov_1ks4ntaci2().f[63]++;cov_1ks4ntaci2().s[215]++;if(err){cov_1ks4ntaci2().b[61][0]++;cov_1ks4ntaci2().s[216]++;callback(err);}else{cov_1ks4ntaci2().b[61][1]++;cov_1ks4ntaci2().s[217]++;callback(null,that);}});},/** - * Enables the entity on the server. - * - * @param {Function} callback A function to call when the object is enabled: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */enable:function(callback){cov_1ks4ntaci2().f[64]++;cov_1ks4ntaci2().s[218]++;callback=(cov_1ks4ntaci2().b[62][0]++,callback)||(cov_1ks4ntaci2().b[62][1]++,function(){cov_1ks4ntaci2().f[65]++;});var that=(cov_1ks4ntaci2().s[219]++,this);cov_1ks4ntaci2().s[220]++;this.post("enable",{},function(err,response){cov_1ks4ntaci2().f[66]++;cov_1ks4ntaci2().s[221]++;if(err){cov_1ks4ntaci2().b[63][0]++;cov_1ks4ntaci2().s[222]++;callback(err);}else{cov_1ks4ntaci2().b[63][1]++;cov_1ks4ntaci2().s[223]++;callback(null,that);}});},/** - * Reloads the entity on the server. - * - * @param {Function} callback A function to call when the object is reloaded: `(err, entity)`. - * - * @method splunkjs.Service.Entity - * @protected - */reload:function(callback){cov_1ks4ntaci2().f[67]++;cov_1ks4ntaci2().s[224]++;callback=(cov_1ks4ntaci2().b[64][0]++,callback)||(cov_1ks4ntaci2().b[64][1]++,function(){cov_1ks4ntaci2().f[68]++;});var that=(cov_1ks4ntaci2().s[225]++,this);cov_1ks4ntaci2().s[226]++;this.post("_reload",{},function(err,response){cov_1ks4ntaci2().f[69]++;cov_1ks4ntaci2().s[227]++;if(err){cov_1ks4ntaci2().b[65][0]++;cov_1ks4ntaci2().s[228]++;callback(err);}else{cov_1ks4ntaci2().b[65][1]++;cov_1ks4ntaci2().s[229]++;callback(null,that);}});}});/** - * Defines a base class for a Splunk collection, which is a well-defined construct - * that provides basic methods for working with collections of entities, such as - * creating and listing entities. - * - * @class splunkjs.Service.Collection - * @extends splunkjs.Service.Resource - */cov_1ks4ntaci2().s[230]++;root.Collection=root.Resource.extend({/** - * A static property that indicates whether to call `fetch` after an - * entity has been created. By default, the entity is not fetched - * because the endpoint returns (echoes) the new entity. - - * @method splunkjs.Service.Collection - */fetchOnEntityCreation:false,/** - * Constructor for `splunkjs.Service.Collection`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} path A relative endpoint path (for example, "search/jobs"). - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Collection} A new `splunkjs.Service.Collection` instance. - * - * @method splunkjs.Service.Collection - */init:function(service,path,namespace){cov_1ks4ntaci2().f[70]++;cov_1ks4ntaci2().s[231]++;this._super(service,path,namespace);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[232]++;this._load=utils.bind(this,this._load);cov_1ks4ntaci2().s[233]++;this.fetch=utils.bind(this,this.fetch);cov_1ks4ntaci2().s[234]++;this.create=utils.bind(this,this.create);cov_1ks4ntaci2().s[235]++;this.list=utils.bind(this,this.list);cov_1ks4ntaci2().s[236]++;this.item=utils.bind(this,this.item);cov_1ks4ntaci2().s[237]++;this.instantiateEntity=utils.bind(this,this.instantiateEntity);// Initial values -cov_1ks4ntaci2().s[238]++;this._entities=[];cov_1ks4ntaci2().s[239]++;this._entitiesByName={};cov_1ks4ntaci2().s[240]++;this._properties={};cov_1ks4ntaci2().s[241]++;this._paging={};cov_1ks4ntaci2().s[242]++;this._links={};},/** - * Creates a local instance of an entity. - * - * @param {Object} props The properties for this entity. - * @return {splunkjs.Service.Entity} A new `splunkjs.Service.Entity` instance. - * - * @method splunkjs.Service.Collection - */instantiateEntity:function(props){cov_1ks4ntaci2().f[71]++;cov_1ks4ntaci2().s[243]++;throw new Error("MUST BE OVERRIDDEN");},/** - * Loads the collection and properties, and creates a map of entity - * names to entity IDs (for retrieval purposes). - * - * @param {Object} properties The properties for this collection. - * - * @method splunkjs.Service.Collection - * @private - */_load:function(properties){cov_1ks4ntaci2().f[72]++;cov_1ks4ntaci2().s[244]++;this._super(properties);var entities=(cov_1ks4ntaci2().s[245]++,[]);var entitiesByName=(cov_1ks4ntaci2().s[246]++,{});var entityPropertyList=(cov_1ks4ntaci2().s[247]++,(cov_1ks4ntaci2().b[66][0]++,properties.entry)||(cov_1ks4ntaci2().b[66][1]++,[]));cov_1ks4ntaci2().s[248]++;for(var i=(cov_1ks4ntaci2().s[249]++,0);i1)&&(cov_1ks4ntaci2().b[90][1]++,!namespace)){cov_1ks4ntaci2().b[89][0]++;cov_1ks4ntaci2().s[303]++;// If there is more than one entity and we didn't -// specify a namespace, then we return an error -// saying the match is ambiguous -throw new Error("Ambiguous match for name '"+id+"'");}else{cov_1ks4ntaci2().b[89][1]++;cov_1ks4ntaci2().s[304]++;// There is more than one entity, and we do have -// a namespace, so we try and find it -for(var i=(cov_1ks4ntaci2().s[305]++,0);iPagination and Filtering options in the REST API documentation. - * @param {Function} callback A function to call when the history is retrieved: `(err, job, savedSearch)`. - * - * @endpoint saved/searches/{name}/history - * @method splunkjs.Service.SavedSearch - */history:function(options,callback){cov_1ks4ntaci2().f[97]++;cov_1ks4ntaci2().s[359]++;if((cov_1ks4ntaci2().b[106][0]++,!callback)&&(cov_1ks4ntaci2().b[106][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[105][0]++;cov_1ks4ntaci2().s[360]++;callback=options;cov_1ks4ntaci2().s[361]++;options={};}else{cov_1ks4ntaci2().b[105][1]++;}cov_1ks4ntaci2().s[362]++;callback=(cov_1ks4ntaci2().b[107][0]++,callback)||(cov_1ks4ntaci2().b[107][1]++,function(){cov_1ks4ntaci2().f[98]++;});cov_1ks4ntaci2().s[363]++;options=(cov_1ks4ntaci2().b[108][0]++,options)||(cov_1ks4ntaci2().b[108][1]++,{});var that=(cov_1ks4ntaci2().s[364]++,this);cov_1ks4ntaci2().s[365]++;return this.get("history",options,function(err,response){cov_1ks4ntaci2().f[99]++;cov_1ks4ntaci2().s[366]++;if(err){cov_1ks4ntaci2().b[109][0]++;cov_1ks4ntaci2().s[367]++;callback(err);cov_1ks4ntaci2().s[368]++;return;}else{cov_1ks4ntaci2().b[109][1]++;}var jobs=(cov_1ks4ntaci2().s[369]++,[]);var data=(cov_1ks4ntaci2().s[370]++,(cov_1ks4ntaci2().b[110][0]++,response.data.entry)||(cov_1ks4ntaci2().b[110][1]++,[]));cov_1ks4ntaci2().s[371]++;for(var i=(cov_1ks4ntaci2().s[372]++,0);iSaved search parameters on Splunk Developer Portal. - * @param {Function} callback A function to call when the object is updated: `(err, entity)`. - * - * @method splunkjs.Service.SavedSearch - */update:function(params,callback){cov_1ks4ntaci2().f[103]++;cov_1ks4ntaci2().s[383]++;params=(cov_1ks4ntaci2().b[112][0]++,params)||(cov_1ks4ntaci2().b[112][1]++,{});cov_1ks4ntaci2().s[384]++;if(!params.search){cov_1ks4ntaci2().b[113][0]++;var update=(cov_1ks4ntaci2().s[385]++,this._super);var req=(cov_1ks4ntaci2().s[386]++,this.fetch(function(err,search){cov_1ks4ntaci2().f[104]++;cov_1ks4ntaci2().s[387]++;if(err){cov_1ks4ntaci2().b[114][0]++;cov_1ks4ntaci2().s[388]++;callback(err);}else{cov_1ks4ntaci2().b[114][1]++;cov_1ks4ntaci2().s[389]++;params.search=search.properties().search;cov_1ks4ntaci2().s[390]++;update.call(search,params,function(){cov_1ks4ntaci2().f[105]++;cov_1ks4ntaci2().s[391]++;if(req.wasAborted){cov_1ks4ntaci2().b[115][0]++;cov_1ks4ntaci2().s[392]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[115][1]++;cov_1ks4ntaci2().s[393]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[394]++;return req;}else{cov_1ks4ntaci2().b[113][1]++;cov_1ks4ntaci2().s[395]++;return this._super(params,callback);}}});/** - * Represents a collection of saved searches. You can create and list saved - * searches using this collection container, or get a specific saved search. - * - * - * @endpoint saved/searches - * @class splunkjs.Service.SavedSearches - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[396]++;root.SavedSearches=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.SavedSearches - */path:function(){cov_1ks4ntaci2().f[106]++;cov_1ks4ntaci2().s[397]++;return Paths.savedSearches;},/** - * Creates a local instance of a saved search. - * - * @param {Object} props The properties for the new saved search. For a list of available parameters, see Saved search parameters on Splunk Developer Portal. - * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.SavedSearch` instance. - * - * @method splunkjs.Service.SavedSearches - */instantiateEntity:function(props){cov_1ks4ntaci2().f[107]++;var entityNamespace=(cov_1ks4ntaci2().s[398]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[399]++;return new root.SavedSearch(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.SavedSearches`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.SavedSearches} A new `splunkjs.Service.SavedSearches` instance. - * - * @method splunkjs.Service.SavedSearches - */init:function(service,namespace){cov_1ks4ntaci2().f[108]++;cov_1ks4ntaci2().s[400]++;this._super(service,this.path(),namespace);}});/** - * Represents a specific storage password, which you can then view, modify, and - * remove. - * - * @endpoint storage/passwords/{name} - * @class splunkjs.Service.StoragePassword - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[401]++;root.StoragePassword=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.StoragePassword - */path:function(){cov_1ks4ntaci2().f[109]++;cov_1ks4ntaci2().s[402]++;return Paths.storagePasswords+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.StoragePassword`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name for the new storage password. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.StoragePassword} A new `splunkjs.Service.StoragePassword` instance. - * - * @method splunkjs.Service.StoragePassword - */init:function(service,name,namespace){cov_1ks4ntaci2().f[110]++;cov_1ks4ntaci2().s[403]++;this.name=name;cov_1ks4ntaci2().s[404]++;this._super(service,this.path(),namespace);}});/** - * Represents a collection of storage passwords. You can create and list storage - * passwords using this collection container, or get a specific storage password. - * - * @endpoint storage/passwords - * @class splunkjs.Service.StoragePasswords - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[405]++;root.StoragePasswords=root.Collection.extend({/** - * Indicates whether to call `fetch` after an entity has been created. By - * default, the entity is not fetched because the endpoint returns - * (echoes) the new entity. - * - * @method splunkjs.Service.StoragePasswords - */fetchOnEntityCreation:true,/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.StoragePasswords - */path:function(){cov_1ks4ntaci2().f[111]++;cov_1ks4ntaci2().s[406]++;return Paths.storagePasswords;},/** - * Creates a local instance of a storage password. - * - * @param {Object} props The properties for the new storage password. For a list of available parameters, - * see - * POST storage/passwords on Splunk Developer Portal. - * @return {splunkjs.Service.SavedSearch} A new `splunkjs.Service.StoragePassword` instance. - * - * @method splunkjs.Service.StoragePasswords - */instantiateEntity:function(props){cov_1ks4ntaci2().f[112]++;var entityNamespace=(cov_1ks4ntaci2().s[407]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[408]++;return new root.StoragePassword(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.StoragePasswords`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.StoragePasswords} A new `splunkjs.Service.StoragePasswords` instance. - * - * @method splunkjs.Service.StoragePasswords - */init:function(service,namespace){cov_1ks4ntaci2().f[113]++;cov_1ks4ntaci2().s[409]++;this._super(service,this.path(),namespace);}});/** - * Represents a fired alert. - * You can retrieve several of the fired alert's properties by - * the corresponding function name. - * - * @endpoint alerts/fired_alerts/{name} - * @class splunkjs.Service.FiredAlert - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[410]++;root.FiredAlert=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.FiredAlert - */path:function(){cov_1ks4ntaci2().f[114]++;cov_1ks4ntaci2().s[411]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** - * Returns this alert's actions (such as notifying by email, running a - * script, adding to RSS, tracking in Alert Manager, and enabling - * summary indexing). - * - * @return {Array} of actions, an empty {Array} if no actions - * @method splunkjs.Service.FiredAlert - */actions:function(){cov_1ks4ntaci2().f[115]++;cov_1ks4ntaci2().s[412]++;return(cov_1ks4ntaci2().b[116][0]++,this.properties().actions)||(cov_1ks4ntaci2().b[116][1]++,[]);},/** - * Returns this alert's type. - * - * @return {String} the alert's type. - * @method splunkjs.Service.FiredAlert - */alertType:function(){cov_1ks4ntaci2().f[116]++;cov_1ks4ntaci2().s[413]++;return(cov_1ks4ntaci2().b[117][0]++,this.properties().alert_type)||(cov_1ks4ntaci2().b[117][1]++,null);},/** - * Indicates whether the result is a set of events (digest) or a single - * event (per result). - * - * This method is available in Splunk 4.3 and later. - * - * @return {Boolean} true if the result is a digest, false if per result - * @method splunkjs.Service.FiredAlert - */isDigestMode:function(){cov_1ks4ntaci2().f[117]++;cov_1ks4ntaci2().s[414]++;// Convert this property to a Boolean -return!!this.properties().digest_mode;},/** - * Returns the rendered expiration time for this alert. - * - * This method is available in Splunk 4.3 and later. - * - * @return {String} - * @method splunkjs.Service.FiredAlert - */expirationTime:function(){cov_1ks4ntaci2().f[118]++;cov_1ks4ntaci2().s[415]++;return(cov_1ks4ntaci2().b[118][0]++,this.properties().expiration_time_rendered)||(cov_1ks4ntaci2().b[118][1]++,null);},/** - * Returns the saved search for this alert. - * - * @return {String} The saved search name, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */savedSearchName:function(){cov_1ks4ntaci2().f[119]++;cov_1ks4ntaci2().s[416]++;return(cov_1ks4ntaci2().b[119][0]++,this.properties().savedsearch_name)||(cov_1ks4ntaci2().b[119][1]++,null);},/** - * Returns this alert's severity on a scale of 1 to 10, with 1 being the - * highest severity. - * - * @return {Number} this alert's severity, -1 if not specified - * @method splunkjs.Service.FiredAlert - */severity:function(){cov_1ks4ntaci2().f[120]++;cov_1ks4ntaci2().s[417]++;return(cov_1ks4ntaci2().b[120][0]++,parseInt(this.properties().severity,10))||(cov_1ks4ntaci2().b[120][1]++,-1);},/** - * Returns this alert's search ID (SID). - * - * @return {String} This alert's SID, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */sid:function(){cov_1ks4ntaci2().f[121]++;cov_1ks4ntaci2().s[418]++;return(cov_1ks4ntaci2().b[121][0]++,this.properties().sid)||(cov_1ks4ntaci2().b[121][1]++,null);},/** - * Returns the time this alert was triggered. - * - * @return {Number} This alert's trigger time, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */triggerTime:function(){cov_1ks4ntaci2().f[122]++;cov_1ks4ntaci2().s[419]++;return(cov_1ks4ntaci2().b[122][0]++,this.properties().trigger_time)||(cov_1ks4ntaci2().b[122][1]++,null);},/** - * Returns this alert's rendered trigger time. - * - * This method is available in Splunk 4.3 and later. - * - * @return {String} This alert's rendered trigger time, or {null} if not available. - * @method splunkjs.Service.FiredAlert - */triggerTimeRendered:function(){cov_1ks4ntaci2().f[123]++;cov_1ks4ntaci2().s[420]++;return(cov_1ks4ntaci2().b[123][0]++,this.properties().trigger_time_rendered)||(cov_1ks4ntaci2().b[123][1]++,null);},/** - * Returns the count of triggered alerts. - * - * This method is available in Splunk 4.3 and later. - * - * @return {Number} The number of triggered alerts, or -1 if not specified. - * @method splunkjs.Service.FiredAlert - */triggeredAlertCount:function(){cov_1ks4ntaci2().f[124]++;cov_1ks4ntaci2().s[421]++;return(cov_1ks4ntaci2().b[124][0]++,parseInt(this.properties().triggered_alerts,10))||(cov_1ks4ntaci2().b[124][1]++,-1);},/** - * Constructor for `splunkjs.Service.FiredAlert`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name for the new alert group. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.FiredAlert} A new `splunkjs.Service.FiredAlert` instance. - * - * @method splunkjs.Service.FiredAlert - */init:function(service,name,namespace){cov_1ks4ntaci2().f[125]++;cov_1ks4ntaci2().s[422]++;this.name=name;cov_1ks4ntaci2().s[423]++;this._super(service,this.path(),namespace);}});/** - * Represents a specific alert group, which you can then view and - * remove. - * - * @endpoint alerts/fired_alerts/{name} - * @class splunkjs.Service.FiredAlertGroup - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[424]++;root.FiredAlertGroup=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.FiredAlertGroup - */path:function(){cov_1ks4ntaci2().f[126]++;cov_1ks4ntaci2().s[425]++;return Paths.firedAlerts+"/"+encodeURIComponent(this.name);},/** - * Returns the `triggered_alert_count` property, the count - * of triggered alerts. - * - * @return {Number} the count of triggered alerts - * - * @method splunkjs.Service.FiredAlertGroup - */count:function(){cov_1ks4ntaci2().f[127]++;cov_1ks4ntaci2().s[426]++;return(cov_1ks4ntaci2().b[125][0]++,parseInt(this.properties().triggered_alert_count,10))||(cov_1ks4ntaci2().b[125][1]++,0);},/** - * Returns fired instances of this alert, which is - * a list of `splunkjs.Service.FiredAlert` instances. - * - * @example - * - * var alertGroup = service.firedAlertGroups().item("MyAlert"); - * alertGroup.list(function(err, firedAlerts, alert) { - * for(var i = 0; i < firedAlerts.length; i++) { - * console.log("Fired alert", i, ":", firedAlerts[i].sid); - * } - * }); - * - * @param {Function} callback A function to call when the fired alerts are retrieved: `(err, firedAlerts, alertGroup)`. - * - * @method splunkjs.Service.FiredAlertGroup - */list:function(options,callback){cov_1ks4ntaci2().f[128]++;cov_1ks4ntaci2().s[427]++;if((cov_1ks4ntaci2().b[127][0]++,!callback)&&(cov_1ks4ntaci2().b[127][1]++,utils.isFunction(options))){cov_1ks4ntaci2().b[126][0]++;cov_1ks4ntaci2().s[428]++;callback=options;cov_1ks4ntaci2().s[429]++;options={};}else{cov_1ks4ntaci2().b[126][1]++;}cov_1ks4ntaci2().s[430]++;callback=(cov_1ks4ntaci2().b[128][0]++,callback)||(cov_1ks4ntaci2().b[128][1]++,function(){cov_1ks4ntaci2().f[129]++;});cov_1ks4ntaci2().s[431]++;options=(cov_1ks4ntaci2().b[129][0]++,options)||(cov_1ks4ntaci2().b[129][1]++,{});var that=(cov_1ks4ntaci2().s[432]++,this);cov_1ks4ntaci2().s[433]++;return this.get("",options,function(err,response){cov_1ks4ntaci2().f[130]++;cov_1ks4ntaci2().s[434]++;if(err){cov_1ks4ntaci2().b[130][0]++;cov_1ks4ntaci2().s[435]++;callback(err);cov_1ks4ntaci2().s[436]++;return;}else{cov_1ks4ntaci2().b[130][1]++;}var firedAlerts=(cov_1ks4ntaci2().s[437]++,[]);var data=(cov_1ks4ntaci2().s[438]++,(cov_1ks4ntaci2().b[131][0]++,response.data.entry)||(cov_1ks4ntaci2().b[131][1]++,[]));cov_1ks4ntaci2().s[439]++;for(var i=(cov_1ks4ntaci2().s[440]++,0);iPOST apps/local endpoint in the REST API documentation. - * @return {splunkjs.Service.Application} A new `splunkjs.Service.Application` instance. - * - * @method splunkjs.Service.Applications - */instantiateEntity:function(props){cov_1ks4ntaci2().f[145]++;cov_1ks4ntaci2().s[478]++;return new root.Application(this.service,props.name,{});},/** - * Constructor for `splunkjs.Service.Applications`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @return {splunkjs.Service.Applications} A new `splunkjs.Service.Applications` instance. - * - * @method splunkjs.Service.Applications - */init:function(service){cov_1ks4ntaci2().f[146]++;cov_1ks4ntaci2().s[479]++;this._super(service,this.path(),{});}});/** - * Provides access to configuration information about the server. - * - * @endpoint server/info - * @class splunkjs.Service.ServerInfo - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[480]++;root.ServerInfo=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.ServerInfo - */path:function(){cov_1ks4ntaci2().f[147]++;cov_1ks4ntaci2().s[481]++;return Paths.info;},/** - * Constructor for `splunkjs.Service.ServerInfo`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @return {splunkjs.Service.ServerInfo} A new `splunkjs.Service.ServerInfo` instance. - * - * @method splunkjs.Service.ServerInfo - */init:function(service){cov_1ks4ntaci2().f[148]++;cov_1ks4ntaci2().s[482]++;this.name="server-info";cov_1ks4ntaci2().s[483]++;this._super(service,this.path(),{});}});/** - * Represents a specific Splunk user, which you can view, modify, and - * remove. - * - * @endpoint authentication/users/{name} - * @class splunkjs.Service.User - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[484]++;root.User=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.User - */path:function(){cov_1ks4ntaci2().f[149]++;cov_1ks4ntaci2().s[485]++;return Paths.users+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.User`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The Splunk username. - * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. - * - * @method splunkjs.Service.User - */init:function(service,name){cov_1ks4ntaci2().f[150]++;cov_1ks4ntaci2().s[486]++;this.name=name;cov_1ks4ntaci2().s[487]++;this._super(service,this.path(),{});}});/** - * Represents a collection of users. You can create and list users using - * this collection container, or get a specific user. - * - * @endpoint authentication/users - * @class splunkjs.Service.Users - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[488]++;root.Users=root.Collection.extend({/** - * Indicates whether to call `fetch` after an entity has been created. By - * default, the entity is not fetched because the endpoint returns - * (echoes) the new entity. - * - * @method splunkjs.Service.Users - */fetchOnEntityCreation:true,/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Users - */path:function(){cov_1ks4ntaci2().f[151]++;cov_1ks4ntaci2().s[489]++;return Paths.users;},/** - * Creates a local instance of a user. - * - * @param {Object} props The properties for this new user. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. - * @return {splunkjs.Service.User} A new `splunkjs.Service.User` instance. - * - * @method splunkjs.Service.Users - */instantiateEntity:function(props){cov_1ks4ntaci2().f[152]++;cov_1ks4ntaci2().s[490]++;return new root.User(this.service,props.name,{});},/** - * Constructor for `splunkjs.Service.Users`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @return {splunkjs.Service.Users} A new `splunkjs.Service.Users` instance. - * - * @method splunkjs.Service.Users - */init:function(service){cov_1ks4ntaci2().f[153]++;cov_1ks4ntaci2().s[491]++;this._super(service,this.path(),{});},/** - * Creates a new user. - * - * **Note:** This endpoint requires a special implementation. - * - * @param {Object} params A dictionary of properties. For a list of available parameters, see User authentication parameters on Splunk Developer Portal. - * @param {Function} callback A function to call with the new entity: `(err, createdEntity)`. - * - * @method splunkjs.Service.Users - */create:function(params,callback){cov_1ks4ntaci2().f[154]++;cov_1ks4ntaci2().s[492]++;callback=(cov_1ks4ntaci2().b[136][0]++,callback)||(cov_1ks4ntaci2().b[136][1]++,function(){cov_1ks4ntaci2().f[155]++;});var that=(cov_1ks4ntaci2().s[493]++,this);var req=(cov_1ks4ntaci2().s[494]++,this.post("",params,function(err,response){cov_1ks4ntaci2().f[156]++;cov_1ks4ntaci2().s[495]++;if(err){cov_1ks4ntaci2().b[137][0]++;cov_1ks4ntaci2().s[496]++;callback(err);}else{cov_1ks4ntaci2().b[137][1]++;// This endpoint requires us to use the passed-in name -var props=(cov_1ks4ntaci2().s[497]++,{name:params.name});var entity=(cov_1ks4ntaci2().s[498]++,that.instantiateEntity(props));cov_1ks4ntaci2().s[499]++;entity.fetch(function(){cov_1ks4ntaci2().f[157]++;cov_1ks4ntaci2().s[500]++;if(req.wasAborted){cov_1ks4ntaci2().b[138][0]++;cov_1ks4ntaci2().s[501]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[138][1]++;cov_1ks4ntaci2().s[502]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[503]++;return req;}});/** - * Represents a specific Splunk view, which you can view, modify, and - * remove. - * - * @endpoint data/ui/views/{name} - * @class splunkjs.Service.View - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[504]++;root.View=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.View - */path:function(){cov_1ks4ntaci2().f[158]++;cov_1ks4ntaci2().s[505]++;return Paths.views+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.View`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name of the view. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. - * - * @method splunkjs.Service.View - */init:function(service,name,namespace){cov_1ks4ntaci2().f[159]++;cov_1ks4ntaci2().s[506]++;this.name=name;cov_1ks4ntaci2().s[507]++;this._super(service,this.path(),namespace);}});/** - * Represents a collection of views. You can create and list views using - * this collection container, or get a specific view. - * - * @endpoint data/ui/views - * @class splunkjs.Service.Views - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[508]++;root.Views=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Views - */path:function(){cov_1ks4ntaci2().f[160]++;cov_1ks4ntaci2().s[509]++;return Paths.views;},/** - * Creates a local instance of a view. - * - * @param {Object} props The properties for the new view. For a list of available parameters, see the POST scheduled/views/{name} endpoint in the REST API documentation. - * @return {splunkjs.Service.View} A new `splunkjs.Service.View` instance. - * - * @method splunkjs.Service.Views - */instantiateEntity:function(props){cov_1ks4ntaci2().f[161]++;var entityNamespace=(cov_1ks4ntaci2().s[510]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[511]++;return new root.View(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.Views`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Views} A new `splunkjs.Service.Views` instance. - * - * @method splunkjs.Service.Views - */init:function(service,namespace){cov_1ks4ntaci2().f[162]++;cov_1ks4ntaci2().s[512]++;this._super(service,this.path(),namespace);}});/** - * Represents an index, which you can update and submit events to. - * - * @endpoint data/indexes/name - * @class splunkjs.Service.Index - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[513]++;root.Index=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Index - */path:function(){cov_1ks4ntaci2().f[163]++;cov_1ks4ntaci2().s[514]++;return Paths.indexes+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.Index`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name of the index. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. - * - * @method splunkjs.Service.Index - */init:function(service,name,namespace){cov_1ks4ntaci2().f[164]++;cov_1ks4ntaci2().s[515]++;this.name=name;cov_1ks4ntaci2().s[516]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[517]++;this.submitEvent=utils.bind(this,this.submitEvent);},/** - * Submits an event to this index. - * - * @example - * - * var index = service.indexes().item("_internal"); - * index.submitEvent("A new event", {sourcetype: "mysourcetype"}, function(err, result, index) { - * console.log("Submitted event: ", result); - * }); - * - * @param {String} event The text for this event. - * @param {Object} params A dictionary of parameters for indexing: - * - `host` (_string_): The value to populate in the host field for events from this data input. - * - `host_regex` (_string_): A regular expression used to extract the host value from each event. - * - `source` (_string_): The source value to fill in the metadata for this input's events. - * - `sourcetype` (_string_): The sourcetype to apply to events from this input. - * @param {Function} callback A function to call when the event is submitted: `(err, result, index)`. - * - * @endpoint receivers/simple?index={name} - * @method splunkjs.Service.Index - */submitEvent:function(event,params,callback){cov_1ks4ntaci2().f[165]++;cov_1ks4ntaci2().s[518]++;if((cov_1ks4ntaci2().b[140][0]++,!callback)&&(cov_1ks4ntaci2().b[140][1]++,utils.isFunction(params))){cov_1ks4ntaci2().b[139][0]++;cov_1ks4ntaci2().s[519]++;callback=params;cov_1ks4ntaci2().s[520]++;params={};}else{cov_1ks4ntaci2().b[139][1]++;}cov_1ks4ntaci2().s[521]++;callback=(cov_1ks4ntaci2().b[141][0]++,callback)||(cov_1ks4ntaci2().b[141][1]++,function(){cov_1ks4ntaci2().f[166]++;});cov_1ks4ntaci2().s[522]++;params=(cov_1ks4ntaci2().b[142][0]++,params)||(cov_1ks4ntaci2().b[142][1]++,{});// Add the index name -cov_1ks4ntaci2().s[523]++;params["index"]=this.name;var that=(cov_1ks4ntaci2().s[524]++,this);cov_1ks4ntaci2().s[525]++;return this.service.log(event,params,function(err,result){cov_1ks4ntaci2().f[167]++;cov_1ks4ntaci2().s[526]++;callback(err,result,that);});},remove:function(callback){cov_1ks4ntaci2().f[168]++;cov_1ks4ntaci2().s[527]++;if(this.service.versionCompare("5.0")<0){cov_1ks4ntaci2().b[143][0]++;cov_1ks4ntaci2().s[528]++;throw new Error("Indexes cannot be removed in Splunk 4.x");}else{cov_1ks4ntaci2().b[143][1]++;cov_1ks4ntaci2().s[529]++;return this._super(callback);}}});/** - * Represents a collection of indexes. You can create and list indexes using - * this collection container, or get a specific index. - * - * @endpoint data/indexes - * @class splunkjs.Service.Indexes - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[530]++;root.Indexes=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Indexes - */path:function(){cov_1ks4ntaci2().f[169]++;cov_1ks4ntaci2().s[531]++;return Paths.indexes;},/** - * Creates a local instance of an index. - * - * @param {Object} props The properties for the new index. For a list of available parameters, see Index parameters on Splunk Developer Portal. - * @return {splunkjs.Service.Index} A new `splunkjs.Service.Index` instance. - * - * @method splunkjs.Service.Indexes - */instantiateEntity:function(props){cov_1ks4ntaci2().f[170]++;var entityNamespace=(cov_1ks4ntaci2().s[532]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[533]++;return new root.Index(this.service,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.Indexes`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Indexes} A new `splunkjs.Service.Indexes` instance. - * - * @method splunkjs.Service.Indexes - */init:function(service,namespace){cov_1ks4ntaci2().f[171]++;cov_1ks4ntaci2().s[534]++;this._super(service,this.path(),namespace);},/** - * Creates an index with the given name and parameters. - * - * @example - * - * var indexes = service.indexes(); - * indexes.create("NewIndex", {assureUTF8: true}, function(err, newIndex) { - * console.log("CREATED"); - * }); - * - * @param {String} name A name for this index. - * @param {Object} params A dictionary of properties. For a list of available parameters, see Index parameters on Splunk Developer Portal. - * @param {Function} callback A function to call with the new index: `(err, createdIndex)`. - * - * @endpoint data/indexes - * @method splunkjs.Service.Indexes - */create:function(name,params,callback){cov_1ks4ntaci2().f[172]++;cov_1ks4ntaci2().s[535]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[145][0]++,utils.isObject(name))&&(cov_1ks4ntaci2().b[145][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[145][2]++,!callback)){cov_1ks4ntaci2().b[144][0]++;cov_1ks4ntaci2().s[536]++;callback=params;cov_1ks4ntaci2().s[537]++;params=name;cov_1ks4ntaci2().s[538]++;name=params.name;}else{cov_1ks4ntaci2().b[144][1]++;}cov_1ks4ntaci2().s[539]++;params=(cov_1ks4ntaci2().b[146][0]++,params)||(cov_1ks4ntaci2().b[146][1]++,{});cov_1ks4ntaci2().s[540]++;params["name"]=name;cov_1ks4ntaci2().s[541]++;return this._super(params,callback);}});/** - * Represents a specific stanza, which you can update and remove, from a - * configuration file. - * - * @endpoint configs/conf-{file}/{name}` - * @class splunkjs.Service.ConfigurationStanza - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[542]++;root.ConfigurationStanza=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.ConfigurationStanza - */path:function(){cov_1ks4ntaci2().f[173]++;var name=(cov_1ks4ntaci2().s[543]++,this.name==="default"?(cov_1ks4ntaci2().b[147][0]++,"_new"):(cov_1ks4ntaci2().b[147][1]++,this.name));cov_1ks4ntaci2().s[544]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.file)+"/"+encodeURIComponent(name);},/** - * Constructor for `splunkjs.Service.ConfigurationStanza`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} file The name of the configuration file. - * @param {String} name The name of the new stanza. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. - * - * @method splunkjs.Service.ConfigurationStanza - */init:function(service,file,name,namespace){cov_1ks4ntaci2().f[174]++;cov_1ks4ntaci2().s[545]++;this.name=name;cov_1ks4ntaci2().s[546]++;this.file=file;cov_1ks4ntaci2().s[547]++;this._super(service,this.path(),namespace);}});/** - * Represents a collection of stanzas for a specific property file. You can - * create and list stanzas using this collection container, or get a specific - * stanza. - * - * @endpoint configs/conf-{file} - * @class splunkjs.Service.ConfigurationFile - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[548]++;root.ConfigurationFile=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.ConfigurationFile - */path:function(){cov_1ks4ntaci2().f[175]++;cov_1ks4ntaci2().s[549]++;return Paths.configurations+"/conf-"+encodeURIComponent(this.name);},/** - * Creates a local instance of the default stanza in a configuration file. - * You cannot directly update the `ConfigurationStanza` returned by this function. - * - * This is equivalent to viewing `configs/conf-{file}/_new`. - * - * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. - * - * @method splunkjs.Service.ConfigurationFile - */getDefaultStanza:function(){cov_1ks4ntaci2().f[176]++;cov_1ks4ntaci2().s[550]++;return new root.ConfigurationStanza(this.service,this.name,"default",this.namespace);},/** - * Creates a local instance of a stanza in a configuration file. - * - * @param {Object} props The key-value properties for the new stanza. - * @return {splunkjs.Service.ConfigurationStanza} A new `splunkjs.Service.ConfigurationStanza` instance. - * - * @method splunkjs.Service.ConfigurationFile - */instantiateEntity:function(props){cov_1ks4ntaci2().f[177]++;var entityNamespace=(cov_1ks4ntaci2().s[551]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[552]++;return new root.ConfigurationStanza(this.service,this.name,props.name,entityNamespace);},/** - * Constructor for `splunkjs.Service.ConfigurationFile`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name of the configuration file. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. - * - * @method splunkjs.Service.ConfigurationFile - */init:function(service,name,namespace){cov_1ks4ntaci2().f[178]++;cov_1ks4ntaci2().s[553]++;this.name=name;cov_1ks4ntaci2().s[554]++;this._super(service,this.path(),namespace);},/** - * Creates a stanza in this configuration file. - * - * @example - * - * var file = service.configurations().item("props"); - * file.create("my_stanza", function(err, newStanza) { - * console.log("CREATED"); - * }); - * - * @param {String} stanzaName A name for this stanza. - * @param {Object} values A dictionary of key-value pairs to put in this stanza. - * @param {Function} callback A function to call with the created stanza: `(err, createdStanza)`. - * - * @endpoint configs/conf-{file} - * @method splunkjs.Service.ConfigurationFile - */create:function(stanzaName,values,callback){cov_1ks4ntaci2().f[179]++;cov_1ks4ntaci2().s[555]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[149][0]++,utils.isObject(stanzaName))&&(cov_1ks4ntaci2().b[149][1]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[149][2]++,!callback)){cov_1ks4ntaci2().b[148][0]++;cov_1ks4ntaci2().s[556]++;callback=values;cov_1ks4ntaci2().s[557]++;values=stanzaName;cov_1ks4ntaci2().s[558]++;stanzaName=values.name;}else{cov_1ks4ntaci2().b[148][1]++;}cov_1ks4ntaci2().s[559]++;if((cov_1ks4ntaci2().b[151][0]++,utils.isFunction(values))&&(cov_1ks4ntaci2().b[151][1]++,!callback)){cov_1ks4ntaci2().b[150][0]++;cov_1ks4ntaci2().s[560]++;callback=values;cov_1ks4ntaci2().s[561]++;values={};}else{cov_1ks4ntaci2().b[150][1]++;}cov_1ks4ntaci2().s[562]++;values=(cov_1ks4ntaci2().b[152][0]++,values)||(cov_1ks4ntaci2().b[152][1]++,{});cov_1ks4ntaci2().s[563]++;values["name"]=stanzaName;cov_1ks4ntaci2().s[564]++;return this._super(values,callback);}});/** - * Represents a collection of configuration files. You can create and list - * configuration files using this collection container, or get a specific file. - * - * @endpoint properties - * @class splunkjs.Service.Configurations - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[565]++;root.Configurations=root.Collection.extend({/** - * Indicates whether to call `fetch` after an entity has been created. By - * default, the entity is not fetched because the endpoint returns - * (echoes) the new entity. - * - * @method splunkjs.Service.Configurations - */fetchOnEntityCreation:true,/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Configurations - */path:function(){cov_1ks4ntaci2().f[180]++;cov_1ks4ntaci2().s[566]++;return Paths.properties;},/** - * Creates a local instance of a configuration file. - * - * @param {Object} props The properties for this configuration file. - * @return {splunkjs.Service.ConfigurationFile} A new `splunkjs.Service.ConfigurationFile` instance. - * - * @method splunkjs.Service.Configurations - */instantiateEntity:function(props){cov_1ks4ntaci2().f[181]++;cov_1ks4ntaci2().s[567]++;return new root.ConfigurationFile(this.service,props.name,this.namespace);},/** - * Constructor for `splunkjs.Service.Configurations`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Configurations} A new `splunkjs.Service.Configurations` instance. - * - * @method splunkjs.Service.Configurations - */init:function(service,namespace){cov_1ks4ntaci2().f[182]++;cov_1ks4ntaci2().s[568]++;if((cov_1ks4ntaci2().b[154][0]++,!namespace)||(cov_1ks4ntaci2().b[154][1]++,namespace.owner==="-")||(cov_1ks4ntaci2().b[154][2]++,namespace.app==="-")){cov_1ks4ntaci2().b[153][0]++;cov_1ks4ntaci2().s[569]++;throw new Error("Configurations requires a non-wildcard owner/app");}else{cov_1ks4ntaci2().b[153][1]++;}cov_1ks4ntaci2().s[570]++;this._super(service,this.path(),namespace);},/** - * Creates a configuration file. - * - * @example - * - * var configurations = service.configurations(); - * configurations.create("myprops", function(err, newFile) { - * console.log("CREATED"); - * }); - * - * @param {String} filename A name for this configuration file. - * @param {Function} callback A function to call with the new configuration file: `(err, createdFile)`. - * - * @endpoint properties - * @method splunkjs.Service.Configurations - */create:function(filename,callback){cov_1ks4ntaci2().f[183]++;cov_1ks4ntaci2().s[571]++;// If someone called us with the default style of (params, callback), -// lets make it work -if(utils.isObject(filename)){cov_1ks4ntaci2().b[155][0]++;cov_1ks4ntaci2().s[572]++;filename=filename["__conf"];}else{cov_1ks4ntaci2().b[155][1]++;}cov_1ks4ntaci2().s[573]++;callback=(cov_1ks4ntaci2().b[156][0]++,callback)||(cov_1ks4ntaci2().b[156][1]++,function(){cov_1ks4ntaci2().f[184]++;});var that=(cov_1ks4ntaci2().s[574]++,this);var req=(cov_1ks4ntaci2().s[575]++,this.post("",{__conf:filename},function(err,response){cov_1ks4ntaci2().f[185]++;cov_1ks4ntaci2().s[576]++;if(err){cov_1ks4ntaci2().b[157][0]++;cov_1ks4ntaci2().s[577]++;callback(err);}else{cov_1ks4ntaci2().b[157][1]++;var entity=(cov_1ks4ntaci2().s[578]++,new root.ConfigurationFile(that.service,filename));cov_1ks4ntaci2().s[579]++;entity.fetch(function(){cov_1ks4ntaci2().f[186]++;cov_1ks4ntaci2().s[580]++;if(req.wasAborted){cov_1ks4ntaci2().b[158][0]++;cov_1ks4ntaci2().s[581]++;return;// aborted, so ignore -}else{cov_1ks4ntaci2().b[158][1]++;cov_1ks4ntaci2().s[582]++;callback.apply(null,arguments);}});}}));cov_1ks4ntaci2().s[583]++;return req;},doesFileExist:async function(filename){cov_1ks4ntaci2().f[187]++;cov_1ks4ntaci2().s[584]++;try{var that=(cov_1ks4ntaci2().s[585]++,this);// 1. Fetch files list -var response=(cov_1ks4ntaci2().s[586]++,await this.get_v2("",{__conf:filename}));// 2. Filter the files -var files=(cov_1ks4ntaci2().s[587]++,response?.body?.entry?.filter(f=>{cov_1ks4ntaci2().f[188]++;cov_1ks4ntaci2().s[588]++;return f.name===filename;}));// 2. Check if the file exists -cov_1ks4ntaci2().s[589]++;if((cov_1ks4ntaci2().b[160][0]++,files)&&(cov_1ks4ntaci2().b[160][1]++,files.length==0)){cov_1ks4ntaci2().b[159][0]++;cov_1ks4ntaci2().s[590]++;return{code:"FILE_NOT_FOUND",message:`File with the name '${filename}' does not exist.`};}else{cov_1ks4ntaci2().b[159][1]++;}// 3. Create a local instance -var configurationFile=(cov_1ks4ntaci2().s[591]++,new root.ConfigurationFile(that.service,filename));// 4. Load the file content -var fetchedFile=(cov_1ks4ntaci2().s[592]++,await configurationFile.fetch_v2());cov_1ks4ntaci2().s[593]++;return{file:fetchedFile};}catch(error){cov_1ks4ntaci2().s[594]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},doesStanzaExist:async function(file,stanza){cov_1ks4ntaci2().f[189]++;cov_1ks4ntaci2().s[595]++;try{// 1. check if the stanza exists -var fetchedStanza=(cov_1ks4ntaci2().s[596]++,file.item(stanza));cov_1ks4ntaci2().s[597]++;if(!fetchedStanza){cov_1ks4ntaci2().b[161][0]++;cov_1ks4ntaci2().s[598]++;return{code:"STANZA_NOT_FOUND",message:`Stanza with the name '${stanza}' does not exist.`};}else{cov_1ks4ntaci2().b[161][1]++;cov_1ks4ntaci2().s[599]++;return{stanza:fetchedStanza};}}catch(error){cov_1ks4ntaci2().s[600]++;return{errorCode:"SYSTEM_ERROR",errorMessage:error};}},create_v2:async function(configs,svc,filename,stanza,keyValueMap,callback){cov_1ks4ntaci2().f[190]++;cov_1ks4ntaci2().s[601]++;callback=(cov_1ks4ntaci2().b[162][0]++,callback)||(cov_1ks4ntaci2().b[162][1]++,function(){cov_1ks4ntaci2().f[191]++;});var that=(cov_1ks4ntaci2().s[602]++,this);// 1. Check if the file exists -var doesFileExistResponse=(cov_1ks4ntaci2().s[603]++,await this.doesFileExist(filename));var configFile=(cov_1ks4ntaci2().s[604]++,doesFileExistResponse.file);// 2. If the file doesn't exist, create a new file -cov_1ks4ntaci2().s[605]++;if(!configFile){cov_1ks4ntaci2().b[163][0]++;cov_1ks4ntaci2().s[606]++;console.log(doesFileExistResponse);cov_1ks4ntaci2().s[607]++;console.log("Creating a new configuration file...");cov_1ks4ntaci2().s[608]++;that.create({__conf:filename},(err,newFile)=>{cov_1ks4ntaci2().f[192]++;cov_1ks4ntaci2().s[609]++;return console.log(`Configuration File created: ${filename}`);});cov_1ks4ntaci2().s[610]++;configFile=new root.ConfigurationFile(that.service,filename);cov_1ks4ntaci2().s[611]++;configFile=await configFile.fetch_v2();}else{cov_1ks4ntaci2().b[163][1]++;}// 2. Check if the stanza exists -var doesStanzaExistResponse=(cov_1ks4ntaci2().s[612]++,await this.doesStanzaExist(configFile,stanza));var configStanza=(cov_1ks4ntaci2().s[613]++,doesStanzaExistResponse.stanza);// 3. If the stanza doesn't exist, create a new stanza with given keyValueMap -cov_1ks4ntaci2().s[614]++;if(!configStanza){cov_1ks4ntaci2().b[164][0]++;cov_1ks4ntaci2().s[615]++;console.log(doesStanzaExistResponse);cov_1ks4ntaci2().s[616]++;console.log("Creating a new configuration stanza...");cov_1ks4ntaci2().s[617]++;configFile.create(stanza,keyValueMap,function(err,newStanza){cov_1ks4ntaci2().f[193]++;cov_1ks4ntaci2().s[618]++;console.log(`Configuration Stanza created: ${stanza}`);cov_1ks4ntaci2().s[619]++;callback();});}// 4. If the stanza exists, update it with the keyValueMap -else{cov_1ks4ntaci2().b[164][1]++;cov_1ks4ntaci2().s[620]++;configStanza.update(keyValueMap,(err,updatedStanza)=>{cov_1ks4ntaci2().f[194]++;cov_1ks4ntaci2().s[621]++;console.log(`Configuration Stanza updated: ${stanza}`);cov_1ks4ntaci2().s[622]++;callback();});}}});/** - * Represents a specific search job. You can perform different operations - * on this job, such as reading its status, canceling it, and getting results. - * - * @endpoint search/jobs/{search_id} - * @class splunkjs.Service.Job - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[623]++;root.Job=root.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Job - */path:function(){cov_1ks4ntaci2().f[195]++;cov_1ks4ntaci2().s[624]++;return Paths.jobs+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.Job`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} sid The search ID for this search job. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. - * - * @method splunkjs.Service.Job - */init:function(service,sid,namespace){cov_1ks4ntaci2().f[196]++;cov_1ks4ntaci2().s[625]++;this.name=sid;cov_1ks4ntaci2().s[626]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[627]++;this.sid=sid;// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[628]++;this.cancel=utils.bind(this,this.cancel);cov_1ks4ntaci2().s[629]++;this.disablePreview=utils.bind(this,this.disablePreview);cov_1ks4ntaci2().s[630]++;this.enablePreview=utils.bind(this,this.enablePreview);cov_1ks4ntaci2().s[631]++;this.events=utils.bind(this,this.events);cov_1ks4ntaci2().s[632]++;this.finalize=utils.bind(this,this.finalize);cov_1ks4ntaci2().s[633]++;this.pause=utils.bind(this,this.pause);cov_1ks4ntaci2().s[634]++;this.preview=utils.bind(this,this.preview);cov_1ks4ntaci2().s[635]++;this.results=utils.bind(this,this.results);cov_1ks4ntaci2().s[636]++;this.searchlog=utils.bind(this,this.searchlog);cov_1ks4ntaci2().s[637]++;this.setPriority=utils.bind(this,this.setPriority);cov_1ks4ntaci2().s[638]++;this.setTTL=utils.bind(this,this.setTTL);cov_1ks4ntaci2().s[639]++;this.summary=utils.bind(this,this.summary);cov_1ks4ntaci2().s[640]++;this.timeline=utils.bind(this,this.timeline);cov_1ks4ntaci2().s[641]++;this.touch=utils.bind(this,this.touch);cov_1ks4ntaci2().s[642]++;this.unpause=utils.bind(this,this.unpause);},/** - * Cancels a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.cancel(function(err) { - * console.log("CANCELLED"); - * }); - * - * @param {Function} callback A function to call when the search is done: `(err)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */cancel:function(callback){cov_1ks4ntaci2().f[197]++;var req=(cov_1ks4ntaci2().s[643]++,this.post("control",{action:"cancel"},callback));cov_1ks4ntaci2().s[644]++;return req;},/** - * Disables preview generation for a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.disablePreview(function(err, job) { - * console.log("PREVIEW DISABLED"); - * }); - * - * @param {Function} callback A function to call with this search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */disablePreview:function(callback){cov_1ks4ntaci2().f[198]++;cov_1ks4ntaci2().s[645]++;callback=(cov_1ks4ntaci2().b[165][0]++,callback)||(cov_1ks4ntaci2().b[165][1]++,function(){cov_1ks4ntaci2().f[199]++;});var that=(cov_1ks4ntaci2().s[646]++,this);var req=(cov_1ks4ntaci2().s[647]++,this.post("control",{action:"disablepreview"},function(err){cov_1ks4ntaci2().f[200]++;cov_1ks4ntaci2().s[648]++;callback(err,that);}));cov_1ks4ntaci2().s[649]++;return req;},/** - * Enables preview generation for a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.disablePreview(function(err, job) { - * console.log("PREVIEW ENABLED"); - * }); - * - * @param {Function} callback A function to call with this search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */enablePreview:function(callback){cov_1ks4ntaci2().f[201]++;cov_1ks4ntaci2().s[650]++;callback=(cov_1ks4ntaci2().b[166][0]++,callback)||(cov_1ks4ntaci2().b[166][1]++,function(){cov_1ks4ntaci2().f[202]++;});var that=(cov_1ks4ntaci2().s[651]++,this);var req=(cov_1ks4ntaci2().s[652]++,this.post("control",{action:"enablepreview"},function(err){cov_1ks4ntaci2().f[203]++;cov_1ks4ntaci2().s[653]++;callback(err,that);}));cov_1ks4ntaci2().s[654]++;return req;},/** - * Returns the events of a search job with given parameters. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.events({count: 10}, function(err, events, job) { - * console.log("Fields: ", events.fields); - * }); - * - * @param {Object} params The parameters for retrieving events. For a list of available parameters, see the GET search/jobs/{search_id}/events endpoint in the REST API documentation. - * @param {Function} callback A function to call when the events are retrieved: `(err, events, job)`. - * - * @endpoint search/jobs/{search_id}/events - * @method splunkjs.Service.Job - */events:function(params,callback){cov_1ks4ntaci2().f[204]++;cov_1ks4ntaci2().s[655]++;callback=(cov_1ks4ntaci2().b[167][0]++,callback)||(cov_1ks4ntaci2().b[167][1]++,function(){cov_1ks4ntaci2().f[205]++;});cov_1ks4ntaci2().s[656]++;params=(cov_1ks4ntaci2().b[168][0]++,params)||(cov_1ks4ntaci2().b[168][1]++,{});cov_1ks4ntaci2().s[657]++;params.output_mode=(cov_1ks4ntaci2().b[169][0]++,params.output_mode)||(cov_1ks4ntaci2().b[169][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[658]++,this);cov_1ks4ntaci2().s[659]++;return this.get("events",params,function(err,response){cov_1ks4ntaci2().f[206]++;cov_1ks4ntaci2().s[660]++;if(err){cov_1ks4ntaci2().b[170][0]++;cov_1ks4ntaci2().s[661]++;callback(err);}else{cov_1ks4ntaci2().b[170][1]++;cov_1ks4ntaci2().s[662]++;callback(null,response.data,that);}});},/** - * Finalizes a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.finalize(function(err, job) { - * console.log("JOB FINALIZED"); - * }); - * - * @param {Function} callback A function to call with the job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */finalize:function(callback){cov_1ks4ntaci2().f[207]++;cov_1ks4ntaci2().s[663]++;callback=(cov_1ks4ntaci2().b[171][0]++,callback)||(cov_1ks4ntaci2().b[171][1]++,function(){cov_1ks4ntaci2().f[208]++;});var that=(cov_1ks4ntaci2().s[664]++,this);var req=(cov_1ks4ntaci2().s[665]++,this.post("control",{action:"finalize"},function(err){cov_1ks4ntaci2().f[209]++;cov_1ks4ntaci2().s[666]++;callback(err,that);}));cov_1ks4ntaci2().s[667]++;return req;},/** - * Returns an iterator over this search job's events or results. - * - * @param {String} type One of {"events", "preview", "results"}. - * @param {Object} params A dictionary of optional parameters: - * - `pagesize` (_integer_): The number of items to return on each request. Defaults to as many as possible. - * @return {Object} An iterator object with a `next(callback)` method, where `callback` is of the form `(err, results, hasMoreResults)`. - * - * @endpoint search/jobs/{search_id}/results - * @method splunkjs.Service.Job - */iterator:function(type,params){cov_1ks4ntaci2().f[210]++;cov_1ks4ntaci2().s[668]++;return new root.PaginatedEndpointIterator(this[type],params);},/** - * Pauses a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.pause(function(err, job) { - * console.log("JOB PAUSED"); - * }); - * - * @param {Function} callback A function to call with the job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */pause:function(callback){cov_1ks4ntaci2().f[211]++;cov_1ks4ntaci2().s[669]++;callback=(cov_1ks4ntaci2().b[172][0]++,callback)||(cov_1ks4ntaci2().b[172][1]++,function(){cov_1ks4ntaci2().f[212]++;});var that=(cov_1ks4ntaci2().s[670]++,this);var req=(cov_1ks4ntaci2().s[671]++,this.post("control",{action:"pause"},function(err){cov_1ks4ntaci2().f[213]++;cov_1ks4ntaci2().s[672]++;callback(err,that);}));cov_1ks4ntaci2().s[673]++;return req;},/* - * Gets the preview results for a search job with given parameters. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.preview({count: 10}, function(err, results, job) { - * console.log("Fields: ", results.fields); - * }); - * - * @param {Object} params The parameters for retrieving preview results. For a list of available parameters, see the GET search/jobs/{search_id}/results_preview endpoint in the REST API documentation. - * @param {Function} callback A function to call when the preview results are retrieved : `(err, results, job)`. - * - * @endpoint search/jobs/{search_id}/results_preview - * @method splunkjs.Service.Job - */preview:function(params,callback){cov_1ks4ntaci2().f[214]++;cov_1ks4ntaci2().s[674]++;callback=(cov_1ks4ntaci2().b[173][0]++,callback)||(cov_1ks4ntaci2().b[173][1]++,function(){cov_1ks4ntaci2().f[215]++;});cov_1ks4ntaci2().s[675]++;params=(cov_1ks4ntaci2().b[174][0]++,params)||(cov_1ks4ntaci2().b[174][1]++,{});cov_1ks4ntaci2().s[676]++;params.output_mode=(cov_1ks4ntaci2().b[175][0]++,params.output_mode)||(cov_1ks4ntaci2().b[175][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[677]++,this);cov_1ks4ntaci2().s[678]++;return this.get("results_preview",params,function(err,response){cov_1ks4ntaci2().f[216]++;cov_1ks4ntaci2().s[679]++;if(err){cov_1ks4ntaci2().b[176][0]++;cov_1ks4ntaci2().s[680]++;callback(err);}else{cov_1ks4ntaci2().b[176][1]++;cov_1ks4ntaci2().s[681]++;callback(null,response.data,that);}});},/** - * Gets the results for a search job with given parameters. - * - * The callback can get `undefined` for its `results` parameter if the - * job is not yet done. To avoid this, use the `Job.track()` method to - * wait until the job is complete prior to fetching the results with - * this method. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.results({count: 10}, function(err, results, job) { - * console.log("Fields: ", results.results); - * }); - * - * @param {Object} params The parameters for retrieving search results. For a list of available parameters, see the GET search/jobs/{search_id}/results endpoint in the REST API documentation. - * @param {Function} callback A function to call when the results are retrieved: `(err, results, job)`. - * - * @endpoint search/jobs/{search_id}/results - * @method splunkjs.Service.Job - */results:function(params,callback){cov_1ks4ntaci2().f[217]++;cov_1ks4ntaci2().s[682]++;callback=(cov_1ks4ntaci2().b[177][0]++,callback)||(cov_1ks4ntaci2().b[177][1]++,function(){cov_1ks4ntaci2().f[218]++;});cov_1ks4ntaci2().s[683]++;params=(cov_1ks4ntaci2().b[178][0]++,params)||(cov_1ks4ntaci2().b[178][1]++,{});cov_1ks4ntaci2().s[684]++;params.output_mode=(cov_1ks4ntaci2().b[179][0]++,params.output_mode)||(cov_1ks4ntaci2().b[179][1]++,"json_rows");var that=(cov_1ks4ntaci2().s[685]++,this);cov_1ks4ntaci2().s[686]++;return this.get("results",params,function(err,response){cov_1ks4ntaci2().f[219]++;cov_1ks4ntaci2().s[687]++;if(err){cov_1ks4ntaci2().b[180][0]++;cov_1ks4ntaci2().s[688]++;callback(err);}else{cov_1ks4ntaci2().b[180][1]++;cov_1ks4ntaci2().s[689]++;callback(null,response.data,that);}});},/** - * Gets the search log for this search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.searchlog(function(err, searchlog, job) { - * console.log(searchlog); - * }); - * - * @param {Function} callback A function to call with the search log and job: `(err, searchlog, job)`. - * - * @endpoint search/jobs/{search_id}/search.log - * @method splunkjs.Service.Job - */searchlog:function(callback){cov_1ks4ntaci2().f[220]++;cov_1ks4ntaci2().s[690]++;callback=(cov_1ks4ntaci2().b[181][0]++,callback)||(cov_1ks4ntaci2().b[181][1]++,function(){cov_1ks4ntaci2().f[221]++;});var that=(cov_1ks4ntaci2().s[691]++,this);cov_1ks4ntaci2().s[692]++;return this.get("search.log",{},function(err,response){cov_1ks4ntaci2().f[222]++;cov_1ks4ntaci2().s[693]++;if(err){cov_1ks4ntaci2().b[182][0]++;cov_1ks4ntaci2().s[694]++;callback(err);}else{cov_1ks4ntaci2().b[182][1]++;cov_1ks4ntaci2().s[695]++;callback(null,response.data,that);}});},/** - * Sets the priority for this search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.setPriority(6, function(err, job) { - * console.log("JOB PRIORITY SET"); - * }); - * - * @param {Number} value The priority (an integer between 1-10). A higher value means a higher priority. - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */setPriority:function(value,callback){cov_1ks4ntaci2().f[223]++;cov_1ks4ntaci2().s[696]++;callback=(cov_1ks4ntaci2().b[183][0]++,callback)||(cov_1ks4ntaci2().b[183][1]++,function(){cov_1ks4ntaci2().f[224]++;});var that=(cov_1ks4ntaci2().s[697]++,this);var req=(cov_1ks4ntaci2().s[698]++,this.post("control",{action:"setpriority",priority:value},function(err){cov_1ks4ntaci2().f[225]++;cov_1ks4ntaci2().s[699]++;callback(err,that);}));cov_1ks4ntaci2().s[700]++;return req;},/** - * Sets the time to live (TTL) for the search job, which is the time before - * the search job expires after it has been completed and is still available. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.setTTL(1000, function(err, job) { - * console.log("JOB TTL SET"); - * }); - * - * @param {Number} value The time to live, in seconds. - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */setTTL:function(value,callback){cov_1ks4ntaci2().f[226]++;cov_1ks4ntaci2().s[701]++;callback=(cov_1ks4ntaci2().b[184][0]++,callback)||(cov_1ks4ntaci2().b[184][1]++,function(){cov_1ks4ntaci2().f[227]++;});var that=(cov_1ks4ntaci2().s[702]++,this);var req=(cov_1ks4ntaci2().s[703]++,this.post("control",{action:"setttl",ttl:value},function(err){cov_1ks4ntaci2().f[228]++;cov_1ks4ntaci2().s[704]++;callback(err,that);}));cov_1ks4ntaci2().s[705]++;return req;},/** - * Gets the summary for this search job with the given parameters. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.summary({top_count: 5}, function(err, summary, job) { - * console.log("Summary: ", summary); - * }); - * - * @param {Object} params The parameters for retrieving the summary. For a list of available parameters, see the GET search/jobs/{search_id}/summary endpoint in the REST API documentation. - * @param {Function} callback A function to call with the summary and search job: `(err, summary, job)`. - * - * @endpoint search/jobs/{search_id}/summmary - * @method splunkjs.Service.Job - */summary:function(params,callback){cov_1ks4ntaci2().f[229]++;cov_1ks4ntaci2().s[706]++;callback=(cov_1ks4ntaci2().b[185][0]++,callback)||(cov_1ks4ntaci2().b[185][1]++,function(){cov_1ks4ntaci2().f[230]++;});var that=(cov_1ks4ntaci2().s[707]++,this);cov_1ks4ntaci2().s[708]++;return this.get("summary",params,function(err,response){cov_1ks4ntaci2().f[231]++;cov_1ks4ntaci2().s[709]++;if(err){cov_1ks4ntaci2().b[186][0]++;cov_1ks4ntaci2().s[710]++;callback(err);}else{cov_1ks4ntaci2().b[186][1]++;cov_1ks4ntaci2().s[711]++;callback(null,response.data,that);}});},/** - * Gets the timeline for this search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.timeline({time_format: "%c"}, function(err, job, timeline) { - * console.log("Timeline: ", timeline); - * }); - * - * @param {Object} params The parameters for retrieving the timeline. For a list of available parameters, see the GET search/jobs/{search_id}/timeline endpoint in the REST API documentation. - * @param {Function} callback A function to call with the timeline and search job: `(err, timeline, job)`. - * - * @endpoint search/jobs/{search_id}/timeline - * @method splunkjs.Service.Job - */timeline:function(params,callback){cov_1ks4ntaci2().f[232]++;cov_1ks4ntaci2().s[712]++;callback=(cov_1ks4ntaci2().b[187][0]++,callback)||(cov_1ks4ntaci2().b[187][1]++,function(){cov_1ks4ntaci2().f[233]++;});var that=(cov_1ks4ntaci2().s[713]++,this);cov_1ks4ntaci2().s[714]++;return this.get("timeline",params,function(err,response){cov_1ks4ntaci2().f[234]++;cov_1ks4ntaci2().s[715]++;if(err){cov_1ks4ntaci2().b[188][0]++;cov_1ks4ntaci2().s[716]++;callback(err);}else{cov_1ks4ntaci2().b[188][1]++;cov_1ks4ntaci2().s[717]++;callback(null,response.data,that);}});},/** - * Touches a search job, which means extending the expiration time of - * the search to now plus the time to live (TTL). - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.touch(function(err) { - * console.log("JOB TOUCHED"); - * }); - * - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */touch:function(callback){cov_1ks4ntaci2().f[235]++;cov_1ks4ntaci2().s[718]++;callback=(cov_1ks4ntaci2().b[189][0]++,callback)||(cov_1ks4ntaci2().b[189][1]++,function(){cov_1ks4ntaci2().f[236]++;});var that=(cov_1ks4ntaci2().s[719]++,this);var req=(cov_1ks4ntaci2().s[720]++,this.post("control",{action:"touch"},function(err){cov_1ks4ntaci2().f[237]++;cov_1ks4ntaci2().s[721]++;callback(err,that);}));cov_1ks4ntaci2().s[722]++;return req;},/** - * Starts polling the status of this search job, and fires callbacks - * upon each status change. - * - * @param {Object} options A dictionary of optional parameters: - * - `period` (_integer_): The number of milliseconds to wait between each poll. Defaults to 500. - * @param {Object|Function} callbacks A dictionary of optional callbacks: - * - `ready`: A function `(job)` invoked when the job's properties first become available. - * - `progress`: A function `(job)` invoked whenever new job properties are available. - * - `done`: A function `(job)` invoked if the job completes successfully. No further polling is done. - * - `failed`: A function `(job)` invoked if the job fails executing on the server. No further polling is done. - * - `error`: A function `(err)` invoked if an error occurs while polling. No further polling is done. - * Or, if a function `(job)`, equivalent to passing it as a `done` callback. - * - * @method splunkjs.Service.Job - */track:function(options,callbacks){cov_1ks4ntaci2().f[238]++;var period=(cov_1ks4ntaci2().s[723]++,(cov_1ks4ntaci2().b[190][0]++,options.period)||(cov_1ks4ntaci2().b[190][1]++,500));// ms -cov_1ks4ntaci2().s[724]++;if(utils.isFunction(callbacks)){cov_1ks4ntaci2().b[191][0]++;cov_1ks4ntaci2().s[725]++;callbacks={done:callbacks};}else{cov_1ks4ntaci2().b[191][1]++;}var noCallbacksAfterReady=(cov_1ks4ntaci2().s[726]++,(cov_1ks4ntaci2().b[192][0]++,!callbacks.progress)&&(cov_1ks4ntaci2().b[192][1]++,!callbacks.done)&&(cov_1ks4ntaci2().b[192][2]++,!callbacks.failed)&&(cov_1ks4ntaci2().b[192][3]++,!callbacks.error));cov_1ks4ntaci2().s[727]++;callbacks.ready=(cov_1ks4ntaci2().b[193][0]++,callbacks.ready)||(cov_1ks4ntaci2().b[193][1]++,function(){cov_1ks4ntaci2().f[239]++;});cov_1ks4ntaci2().s[728]++;callbacks.progress=(cov_1ks4ntaci2().b[194][0]++,callbacks.progress)||(cov_1ks4ntaci2().b[194][1]++,function(){cov_1ks4ntaci2().f[240]++;});cov_1ks4ntaci2().s[729]++;callbacks.done=(cov_1ks4ntaci2().b[195][0]++,callbacks.done)||(cov_1ks4ntaci2().b[195][1]++,function(){cov_1ks4ntaci2().f[241]++;});cov_1ks4ntaci2().s[730]++;callbacks.failed=(cov_1ks4ntaci2().b[196][0]++,callbacks.failed)||(cov_1ks4ntaci2().b[196][1]++,function(){cov_1ks4ntaci2().f[242]++;});cov_1ks4ntaci2().s[731]++;callbacks.error=(cov_1ks4ntaci2().b[197][0]++,callbacks.error)||(cov_1ks4ntaci2().b[197][1]++,function(){cov_1ks4ntaci2().f[243]++;});// For use by tests only -cov_1ks4ntaci2().s[732]++;callbacks._preready=(cov_1ks4ntaci2().b[198][0]++,callbacks._preready)||(cov_1ks4ntaci2().b[198][1]++,function(){cov_1ks4ntaci2().f[244]++;});cov_1ks4ntaci2().s[733]++;callbacks._stoppedAfterReady=(cov_1ks4ntaci2().b[199][0]++,callbacks._stoppedAfterReady)||(cov_1ks4ntaci2().b[199][1]++,function(){cov_1ks4ntaci2().f[245]++;});var that=(cov_1ks4ntaci2().s[734]++,this);var emittedReady=(cov_1ks4ntaci2().s[735]++,false);var doneLooping=(cov_1ks4ntaci2().s[736]++,false);cov_1ks4ntaci2().s[737]++;Async.whilst(function(){cov_1ks4ntaci2().f[246]++;cov_1ks4ntaci2().s[738]++;return!doneLooping;},function(nextIteration){cov_1ks4ntaci2().f[247]++;cov_1ks4ntaci2().s[739]++;that.fetch(function(err,job){cov_1ks4ntaci2().f[248]++;cov_1ks4ntaci2().s[740]++;if(err){cov_1ks4ntaci2().b[200][0]++;cov_1ks4ntaci2().s[741]++;nextIteration(err);cov_1ks4ntaci2().s[742]++;return;}else{cov_1ks4ntaci2().b[200][1]++;}var dispatchState=(cov_1ks4ntaci2().s[743]++,job.properties().dispatchState);var notReady=(cov_1ks4ntaci2().s[744]++,(cov_1ks4ntaci2().b[201][0]++,dispatchState==="QUEUED")||(cov_1ks4ntaci2().b[201][1]++,dispatchState==="PARSING"));cov_1ks4ntaci2().s[745]++;if(notReady){cov_1ks4ntaci2().b[202][0]++;cov_1ks4ntaci2().s[746]++;callbacks._preready(job);}else{cov_1ks4ntaci2().b[202][1]++;cov_1ks4ntaci2().s[747]++;if(!emittedReady){cov_1ks4ntaci2().b[203][0]++;cov_1ks4ntaci2().s[748]++;callbacks.ready(job);cov_1ks4ntaci2().s[749]++;emittedReady=true;// Optimization: Don't keep polling the job if the -// caller only cares about the `ready` event. -cov_1ks4ntaci2().s[750]++;if(noCallbacksAfterReady){cov_1ks4ntaci2().b[204][0]++;cov_1ks4ntaci2().s[751]++;callbacks._stoppedAfterReady(job);cov_1ks4ntaci2().s[752]++;doneLooping=true;cov_1ks4ntaci2().s[753]++;nextIteration();cov_1ks4ntaci2().s[754]++;return;}else{cov_1ks4ntaci2().b[204][1]++;}}else{cov_1ks4ntaci2().b[203][1]++;}cov_1ks4ntaci2().s[755]++;callbacks.progress(job);var props=(cov_1ks4ntaci2().s[756]++,job.properties());cov_1ks4ntaci2().s[757]++;if((cov_1ks4ntaci2().b[206][0]++,dispatchState==="DONE")&&(cov_1ks4ntaci2().b[206][1]++,props.isDone)){cov_1ks4ntaci2().b[205][0]++;cov_1ks4ntaci2().s[758]++;callbacks.done(job);cov_1ks4ntaci2().s[759]++;doneLooping=true;cov_1ks4ntaci2().s[760]++;nextIteration();cov_1ks4ntaci2().s[761]++;return;}else{cov_1ks4ntaci2().b[205][1]++;cov_1ks4ntaci2().s[762]++;if((cov_1ks4ntaci2().b[208][0]++,dispatchState==="FAILED")&&(cov_1ks4ntaci2().b[208][1]++,props.isFailed)){cov_1ks4ntaci2().b[207][0]++;cov_1ks4ntaci2().s[763]++;callbacks.failed(job);cov_1ks4ntaci2().s[764]++;doneLooping=true;cov_1ks4ntaci2().s[765]++;nextIteration();cov_1ks4ntaci2().s[766]++;return;}else{cov_1ks4ntaci2().b[207][1]++;}}}cov_1ks4ntaci2().s[767]++;Async.sleep(period,nextIteration);});},function(err){cov_1ks4ntaci2().f[249]++;cov_1ks4ntaci2().s[768]++;if(err){cov_1ks4ntaci2().b[209][0]++;cov_1ks4ntaci2().s[769]++;callbacks.error(err);}else{cov_1ks4ntaci2().b[209][1]++;}});},/** - * Resumes a search job. - * - * @example - * - * var job = service.jobs().item("mysid"); - * job.unpause(function(err) { - * console.log("JOB UNPAUSED"); - * }); - * - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @endpoint search/jobs/{search_id}/control - * @method splunkjs.Service.Job - */unpause:function(callback){cov_1ks4ntaci2().f[250]++;cov_1ks4ntaci2().s[770]++;callback=(cov_1ks4ntaci2().b[210][0]++,callback)||(cov_1ks4ntaci2().b[210][1]++,function(){cov_1ks4ntaci2().f[251]++;});var that=(cov_1ks4ntaci2().s[771]++,this);var req=(cov_1ks4ntaci2().s[772]++,this.post("control",{action:"unpause"},function(err){cov_1ks4ntaci2().f[252]++;cov_1ks4ntaci2().s[773]++;callback(err,that);}));cov_1ks4ntaci2().s[774]++;return req;}});/** - * Represents a collection of search jobs. You can create and list search - * jobs using this collection container, or get a specific search job. - * - * @endpoint search/jobs - * @class splunkjs.Service.Jobs - * @extends splunkjs.Service.Collection - */cov_1ks4ntaci2().s[775]++;root.Jobs=root.Collection.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.Jobs - */path:function(){cov_1ks4ntaci2().f[253]++;cov_1ks4ntaci2().s[776]++;return Paths.jobs;},/** - * Creates a local instance of a job. - * - * @param {Object} props The properties for this new job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * @return {splunkjs.Service.Job} A new `splunkjs.Service.Job` instance. - * - * @method splunkjs.Service.Jobs - */instantiateEntity:function(props){cov_1ks4ntaci2().f[254]++;var sid=(cov_1ks4ntaci2().s[777]++,props.content.sid);var entityNamespace=(cov_1ks4ntaci2().s[778]++,utils.namespaceFromProperties(props));cov_1ks4ntaci2().s[779]++;return new root.Job(this.service,sid,entityNamespace);},/** - * Constructor for `splunkjs.Service.Jobs`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {Object} namespace Namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @return {splunkjs.Service.Jobs} A new `splunkjs.Service.Jobs` instance. - * - * @method splunkjs.Service.Jobs - */init:function(service,namespace){cov_1ks4ntaci2().f[255]++;cov_1ks4ntaci2().s[780]++;this._super(service,this.path(),namespace);// We perform the bindings so that every function works -// properly when it is passed as a callback. -cov_1ks4ntaci2().s[781]++;this.create=utils.bind(this,this.create);},/** - * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: - * - * - Use `exec_mode=normal` to return a search job ID immediately (default). - * Poll for completion to find out when you can retrieve search results. - * - * - Use `exec_mode=blocking` to return the search job ID when the search has finished. - * - * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * @param {Function} callback A function to call with the created job: `(err, createdJob)`. - * - * @endpoint search/jobs - * @method splunkjs.Service.Jobs - */create:function(query,params,callback){cov_1ks4ntaci2().f[256]++;cov_1ks4ntaci2().s[782]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[212][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[212][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[212][2]++,!callback)){cov_1ks4ntaci2().b[211][0]++;cov_1ks4ntaci2().s[783]++;callback=params;cov_1ks4ntaci2().s[784]++;params=query;cov_1ks4ntaci2().s[785]++;query=params.search;}else{cov_1ks4ntaci2().b[211][1]++;}cov_1ks4ntaci2().s[786]++;callback=(cov_1ks4ntaci2().b[213][0]++,callback)||(cov_1ks4ntaci2().b[213][1]++,function(){cov_1ks4ntaci2().f[257]++;});cov_1ks4ntaci2().s[787]++;params=(cov_1ks4ntaci2().b[214][0]++,params)||(cov_1ks4ntaci2().b[214][1]++,{});cov_1ks4ntaci2().s[788]++;params.search=query;cov_1ks4ntaci2().s[789]++;if(((cov_1ks4ntaci2().b[216][0]++,params.exec_mode)||(cov_1ks4ntaci2().b[216][1]++,"")).toLowerCase()==="oneshot"){cov_1ks4ntaci2().b[215][0]++;cov_1ks4ntaci2().s[790]++;throw new Error("Please use splunkjs.Service.Jobs.oneshotSearch for exec_mode=oneshot");}else{cov_1ks4ntaci2().b[215][1]++;}cov_1ks4ntaci2().s[791]++;if(!params.search){cov_1ks4ntaci2().b[217][0]++;cov_1ks4ntaci2().s[792]++;callback("Must provide a query to create a search job");cov_1ks4ntaci2().s[793]++;return;}else{cov_1ks4ntaci2().b[217][1]++;}var that=(cov_1ks4ntaci2().s[794]++,this);cov_1ks4ntaci2().s[795]++;return this.post("",params,function(err,response){cov_1ks4ntaci2().f[258]++;cov_1ks4ntaci2().s[796]++;if(err){cov_1ks4ntaci2().b[218][0]++;cov_1ks4ntaci2().s[797]++;callback(err);}else{cov_1ks4ntaci2().b[218][1]++;var job=(cov_1ks4ntaci2().s[798]++,new root.Job(that.service,response.data.sid,that.namespace));cov_1ks4ntaci2().s[799]++;callback(null,job);}});},/** - * Creates a search job with a given search query and optional parameters, including `exec_mode` to specify the type of search: - * - * - Use `exec_mode=normal` to return a search job ID immediately (default). - * Poll for completion to find out when you can retrieve search results. - * - * - Use `exec_mode=blocking` to return the search job ID when the search has finished. - * - * To run a oneshot search, which does not create a job but rather returns the search results, use `Service.Jobs.oneshotSearch`. - * - * @example - * - * var jobs = service.jobs(); - * jobs.search("search ERROR", {id: "myjob_123"}, function(err, newJob) { - * console.log("CREATED": newJob.sid); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search job. For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {Function} callback A function to call with the new search job: `(err, createdJob)`. - * - * @endpoint search/jobs - * @method splunkjs.Service.Jobs - */search:function(query,params,callback){cov_1ks4ntaci2().f[259]++;cov_1ks4ntaci2().s[800]++;return this.create(query,params,callback);},/** - * Creates a oneshot search from a given search query and parameters. - * - * @example - * - * var jobs = service.jobs(); - * jobs.oneshotSearch("search ERROR", {id: "myjob_123"}, function(err, results) { - * console.log("RESULT FIELDS": results.fields); - * }); - * - * @param {String} query The search query. - * @param {Object} params A dictionary of properties for the search: - * - `output_mode` (_string_): Specifies the output format of the results (XML, JSON, or CSV). - * - `earliest_time` (_string_): Specifies the earliest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `latest_time` (_string_): Specifies the latest time in the time range to search. The time string can be a UTC time (with fractional seconds), a relative time specifier (to now), or a formatted time string. - * - `rf` (_string_): Specifies one or more fields to add to the search. - * @param {Function} callback A function to call with the results of the search: `(err, results)`. - * - * @endpoint search/jobs - * @method splunkjs.Service.Jobs - */oneshotSearch:function(query,params,callback){cov_1ks4ntaci2().f[260]++;cov_1ks4ntaci2().s[801]++;// If someone called us with the default style of (params, callback), -// lets make it work -if((cov_1ks4ntaci2().b[220][0]++,utils.isObject(query))&&(cov_1ks4ntaci2().b[220][1]++,utils.isFunction(params))&&(cov_1ks4ntaci2().b[220][2]++,!callback)){cov_1ks4ntaci2().b[219][0]++;cov_1ks4ntaci2().s[802]++;callback=params;cov_1ks4ntaci2().s[803]++;params=query;cov_1ks4ntaci2().s[804]++;query=params.search;}else{cov_1ks4ntaci2().b[219][1]++;}cov_1ks4ntaci2().s[805]++;callback=(cov_1ks4ntaci2().b[221][0]++,callback)||(cov_1ks4ntaci2().b[221][1]++,function(){cov_1ks4ntaci2().f[261]++;});cov_1ks4ntaci2().s[806]++;params=(cov_1ks4ntaci2().b[222][0]++,params)||(cov_1ks4ntaci2().b[222][1]++,{});cov_1ks4ntaci2().s[807]++;params.search=query;cov_1ks4ntaci2().s[808]++;params.exec_mode="oneshot";cov_1ks4ntaci2().s[809]++;if(!params.search){cov_1ks4ntaci2().b[223][0]++;cov_1ks4ntaci2().s[810]++;callback("Must provide a query to create a search job");}else{cov_1ks4ntaci2().b[223][1]++;}var outputMode=(cov_1ks4ntaci2().s[811]++,(cov_1ks4ntaci2().b[224][0]++,params.output_mode)||(cov_1ks4ntaci2().b[224][1]++,"json_rows"));var path=(cov_1ks4ntaci2().s[812]++,this.qualifiedPath);var method=(cov_1ks4ntaci2().s[813]++,"POST");var headers=(cov_1ks4ntaci2().s[814]++,{});var post=(cov_1ks4ntaci2().s[815]++,params);var get=(cov_1ks4ntaci2().s[816]++,{output_mode:outputMode});var body=(cov_1ks4ntaci2().s[817]++,null);var req=(cov_1ks4ntaci2().s[818]++,this.service.request(path,method,get,post,body,headers,function(err,response){cov_1ks4ntaci2().f[262]++;cov_1ks4ntaci2().s[819]++;if(err){cov_1ks4ntaci2().b[225][0]++;cov_1ks4ntaci2().s[820]++;callback(err);}else{cov_1ks4ntaci2().b[225][1]++;cov_1ks4ntaci2().s[821]++;callback(null,response.data);}}));cov_1ks4ntaci2().s[822]++;return req;}});/** - * Represents a field of a data model object. - * This is a helper class for `DataModelCalculation` - * and `DataModelObject`. - * - * Has these properties: - * - `fieldName` (_string_): The name of this field. - * - `displayName` (_string_): A human readable name for this field. - * - `type` (_string_): The type of this field. - * - `multivalued` (_boolean_): Whether this field is multivalued. - * - `required` (_boolean_): Whether this field is required. - * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. - * - `editable` (_boolean_): Whether this field can be edited. - * - `comment` (_string_): A comment for this field, or `null` if there isn't one. - * - `fieldSearch` (_string_): A search query fragment for this field. - * - `lineage` (_array_): An array of strings of the lineage of the data model - * on which this field is defined. - * - `owner` (_string_): The name of the data model object on which this field is defined. - * - * Possible types for a data model field: - * - `string` - * - `boolean` - * - `number` - * - `timestamp` - * - `objectCount` - * - `childCount` - * - `ipv4` - * - * @class splunkjs.Service.DataModelField - */cov_1ks4ntaci2().s[823]++;root.DataModelField=Class.extend({_types:["string","number","timestamp","objectCount","childCount","ipv4","boolean"],/** - * Constructor for a data model field. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `fieldName` (_string_): The name of this field. - * - `displayName` (_string_): A human readable name for this field. - * - `type` (_string_): The type of this field, see valid types in class docs. - * - `multivalue` (_boolean_): Whether this field is multivalued. - * - `required` (_boolean_): Whether this field is required on events in the object - * - `hidden` (_boolean_): Whether this field should be displayed in a data model UI. - * - `editable` (_boolean_): Whether this field can be edited. - * - `comment` (_string_): A comment for this field, or `null` if there isn't one. - * - `fieldSearch` (_string_): A search query fragment for this field. - * - `lineage` (_string_): The lineage of the data model object on which this field - * is defined, items are delimited by a dot. This is converted into an array of - * strings upon construction. - * - * @method splunkjs.Service.DataModelField - */init:function(props){cov_1ks4ntaci2().f[263]++;cov_1ks4ntaci2().s[824]++;props=(cov_1ks4ntaci2().b[226][0]++,props)||(cov_1ks4ntaci2().b[226][1]++,{});cov_1ks4ntaci2().s[825]++;props.owner=(cov_1ks4ntaci2().b[227][0]++,props.owner)||(cov_1ks4ntaci2().b[227][1]++,"");cov_1ks4ntaci2().s[826]++;this.name=props.fieldName;cov_1ks4ntaci2().s[827]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[828]++;this.type=props.type;cov_1ks4ntaci2().s[829]++;this.multivalued=props.multivalue;cov_1ks4ntaci2().s[830]++;this.required=props.required;cov_1ks4ntaci2().s[831]++;this.hidden=props.hidden;cov_1ks4ntaci2().s[832]++;this.editable=props.editable;cov_1ks4ntaci2().s[833]++;this.comment=(cov_1ks4ntaci2().b[228][0]++,props.comment)||(cov_1ks4ntaci2().b[228][1]++,null);cov_1ks4ntaci2().s[834]++;this.fieldSearch=props.fieldSearch;cov_1ks4ntaci2().s[835]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[836]++;this.owner=this.lineage[this.lineage.length-1];},/** - * Is this data model field of type string? - * - * @return {Boolean} True if this data model field is of type string. - * - * @method splunkjs.Service.DataModelField - */isString:function(){cov_1ks4ntaci2().f[264]++;cov_1ks4ntaci2().s[837]++;return"string"===this.type;},/** - * Is this data model field of type number? - * - * @return {Boolean} True if this data model field is of type number. - * - * @method splunkjs.Service.DataModelField - */isNumber:function(){cov_1ks4ntaci2().f[265]++;cov_1ks4ntaci2().s[838]++;return"number"===this.type;},/** - * Is this data model field of type timestamp? - * - * @return {Boolean} True if this data model field is of type timestamp. - * - * @method splunkjs.Service.DataModelField - */isTimestamp:function(){cov_1ks4ntaci2().f[266]++;cov_1ks4ntaci2().s[839]++;return"timestamp"===this.type;},/** - * Is this data model field of type object count? - * - * @return {Boolean} True if this data model field is of type object count. - * - * @method splunkjs.Service.DataModelField - */isObjectcount:function(){cov_1ks4ntaci2().f[267]++;cov_1ks4ntaci2().s[840]++;return"objectCount"===this.type;},/** - * Is this data model field of type child count? - * - * @return {Boolean} True if this data model field is of type child count. - * - * @method splunkjs.Service.DataModelField - */isChildcount:function(){cov_1ks4ntaci2().f[268]++;cov_1ks4ntaci2().s[841]++;return"childCount"===this.type;},/** - * Is this data model field of type ipv4? - * - * @return {Boolean} True if this data model field is of type ipv4. - * - * @method splunkjs.Service.DataModelField - */isIPv4:function(){cov_1ks4ntaci2().f[269]++;cov_1ks4ntaci2().s[842]++;return"ipv4"===this.type;},/** - * Is this data model field of type boolean? - * - * @return {Boolean} True if this data model field is of type boolean. - * - * @method splunkjs.Service.DataModelField - */isBoolean:function(){cov_1ks4ntaci2().f[270]++;cov_1ks4ntaci2().s[843]++;return"boolean"===this.type;}});/** - * Represents a constraint on a `DataModelObject` or a `DataModelField`. - * - * Has these properties: - * - `query` (_string_): The search query defining this data model constraint. - * - `lineage` (_array_): The lineage of this data model constraint. - * - `owner` (_string_): The name of the data model object that owns - * this data model constraint. - * - * @class splunkjs.Service.DataModelConstraint - */cov_1ks4ntaci2().s[844]++;root.DataModelConstraint=Class.extend({/** - * Constructor for a data model constraint. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `search` (_string_): The Splunk search query this constraint specifies. - * - `owner` (_string_): The lineage of the data model object that owns this - * constraint, items are delimited by a dot. This is converted into - * an array of strings upon construction. - * - * @method splunkjs.Service.DataModelConstraint - */init:function(props){cov_1ks4ntaci2().f[271]++;cov_1ks4ntaci2().s[845]++;props=(cov_1ks4ntaci2().b[229][0]++,props)||(cov_1ks4ntaci2().b[229][1]++,{});cov_1ks4ntaci2().s[846]++;props.owner=(cov_1ks4ntaci2().b[230][0]++,props.owner)||(cov_1ks4ntaci2().b[230][1]++,"");cov_1ks4ntaci2().s[847]++;this.query=props.search;cov_1ks4ntaci2().s[848]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[849]++;this.owner=this.lineage[this.lineage.length-1];}});/** - * Used for specifying a calculation on a `DataModelObject`. - * - * Has these properties: - * - `id` (_string_): The ID for this data model calculation. - * - `type` (_string_): The type of this data model calculation. - * - `comment` (_string_|_null_): The comment for this data model calculation, or `null`. - * - `editable` (_boolean_): True if this calculation can be edited, false otherwise. - * - `lineage` (_array_): The lineage of the data model object on which this calculation - * is defined in an array of strings. - * - `owner` (_string_): The data model that this calculation belongs to. - * - `outputFields` (_array_): The fields output by this calculation. - * - * The Rex and Eval types have an additional property: - * - `expression` (_string_): The expression to use for this calculation. - * - * The Rex and GeoIP types have an additional property: - * - `inputField` (_string_): The field to use for calculation. - * - * The Lookup type has additional properties: - * - `lookupName` (_string_): The name of the lookup to perform. - * - `inputFieldMappings` (_object_): The mappings from fields in the events to fields in the lookup. - * - * Valid types of calculations are: - * - `Lookup` - * - `Eval` - * - `GeoIP` - * - `Rex` - * - * @class splunkjs.Service.DataModelCalculation - */cov_1ks4ntaci2().s[850]++;root.DataModelCalculation=Class.extend({_types:["Lookup","Eval","GeoIP","Rex"],/** - * Constructor for a data model calculation. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `calculationID` (_string_): The ID of this calculation. - * - `calculationType` (_string_): The type of this calculation, see class docs for valid types. - * - `editable` (_boolean_): Whether this calculation can be edited. - * - `comment` (_string_): A comment for this calculation, or `null` if there isn't one. - * - `owner` (_string_): The lineage of the data model object on which this calculation - * is defined, items are delimited by a dot. This is converted into an array of - * strings upon construction. - * - `outputFields` (_array_): An array of the fields this calculation generates. - * - `expression` (_string_): The expression to use for this calculation; exclusive to `Eval` and `Rex` calculations (optional) - * - `inputField` (_string_): The field to use for calculation; exclusive to `GeoIP` and `Rex` calculations (optional) - * - `lookupName` (_string_): The name of the lookup to perform; exclusive to `Lookup` calculations (optional) - * - `inputFieldMappings` (_array_): One element array containing an object with the mappings from fields in the events to fields - * in the lookup; exclusive to `Lookup` calculations (optional) - * - * @method splunkjs.Service.DataModelCalculation - */init:function(props){cov_1ks4ntaci2().f[272]++;cov_1ks4ntaci2().s[851]++;props=(cov_1ks4ntaci2().b[231][0]++,props)||(cov_1ks4ntaci2().b[231][1]++,{});cov_1ks4ntaci2().s[852]++;props.owner=(cov_1ks4ntaci2().b[232][0]++,props.owner)||(cov_1ks4ntaci2().b[232][1]++,"");cov_1ks4ntaci2().s[853]++;this.id=props.calculationID;cov_1ks4ntaci2().s[854]++;this.type=props.calculationType;cov_1ks4ntaci2().s[855]++;this.comment=(cov_1ks4ntaci2().b[233][0]++,props.comment)||(cov_1ks4ntaci2().b[233][1]++,null);cov_1ks4ntaci2().s[856]++;this.editable=props.editable;cov_1ks4ntaci2().s[857]++;this.lineage=props.owner.split(".");cov_1ks4ntaci2().s[858]++;this.owner=this.lineage[this.lineage.length-1];cov_1ks4ntaci2().s[859]++;this.outputFields=[];cov_1ks4ntaci2().s[860]++;for(var i=(cov_1ks4ntaci2().s[861]++,0);iSearch job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {Function} callback A function to call when done creating the search job: `(err, job)`. - * @method splunkjs.Service.Pivot - */run:function(args,callback){cov_1ks4ntaci2().f[280]++;cov_1ks4ntaci2().s[884]++;if(utils.isUndefined(callback)){cov_1ks4ntaci2().b[240][0]++;cov_1ks4ntaci2().s[885]++;callback=args;cov_1ks4ntaci2().s[886]++;args={};}else{cov_1ks4ntaci2().b[240][1]++;}cov_1ks4ntaci2().s[887]++;if((cov_1ks4ntaci2().b[242][0]++,!args)||(cov_1ks4ntaci2().b[242][1]++,Object.keys(args).length===0)){cov_1ks4ntaci2().b[241][0]++;cov_1ks4ntaci2().s[888]++;args={};}else{cov_1ks4ntaci2().b[241][1]++;}// If tstats is undefined, use pivotSearch (try to run an accelerated search if possible) -cov_1ks4ntaci2().s[889]++;this.service.search((cov_1ks4ntaci2().b[243][0]++,this.tstatsSearch)||(cov_1ks4ntaci2().b[243][1]++,this.pivotSearch),args,callback);}});/** - * PivotSpecification represents a pivot to be done on a particular data model object. - * The user creates a PivotSpecification on some data model object, adds filters, row splits, - * column splits, and cell values, then calls the pivot method to query splunkd and - * get a set of SPL queries corresponding to this specification. - * - * Call the `pivot` method to query Splunk for SPL queries corresponding to this pivot. - * - * This class supports a fluent API, each function except `init`, `toJsonObject` & `pivot` - * return the modified `splunkjs.Service.PivotSpecification` instance. - * - * @example - * service.dataModels().fetch(function(err, dataModels) { - * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); - * var pivotSpecification = searches.createPivotSpecification(); - * pivotSpecification - * .addRowSplit("user", "Executing user") - * .addRangeColumnSplit("exec_time", {limit: 4}) - * .addCellValue("search", "Search Query", "values") - * .pivot(function(err, pivot) { - * console.log("Got a Pivot object from the Splunk server!"); - * }); - * }); - * - * Has these properties: - * - `dataModelObject` (_splunkjs.Service.DataModelObject_): The `DataModelObject` from which - * this `PivotSpecification` was created. - * - `columns` (_array_): The column splits on this `PivotSpecification`. - * - `rows` (_array_): The row splits on this `PivotSpecification`. - * - `filters` (_array_): The filters on this `PivotSpecification`. - * - `cells` (_array_): The cell aggregations for this`PivotSpecification`. - * - `accelerationNamespace` (_string_|_null_): The name of the `DataModel` that owns the `DataModelObject` - * on which this `PivotSpecification` was created if the `DataModel` is accelerated. Alternatively, - * you can set this property manually to the sid of an acceleration job in the format `sid=`. - * - * Valid comparison types are: - * - `boolean` - * - `string` - * - `number` - * - `ipv4` - * - * Valid boolean comparisons are: - * - `=` - * - `is` - * - `isNull` - * - `isNotNull` - * - * Valid string comparisons are: - * - `=` - * - `is` - * - `isNull` - * - `isNotNull` - * - `contains` - * - `doesNotContain` - * - `startsWith` - * - `endsWith` - * - `regex` - * - * Valid number comparisons are: - * - `=` - * - `!=` - * - `<` - * - `>` - * - `<=` - * - `>=` - * - `is` - * - `isNull` - * - `isNotNull` - * - * Valid ipv4 comparisons are: - * - `is` - * - `isNull` - * - `isNotNull` - * - `contains` - * - `doesNotContain` - * - `startsWith` - * - * Valid binning values are: - * - `auto` - * - `year` - * - `month` - * - `day` - * - `hour` - * - `minute` - * - `second` - * - * Valid sort directions are: - * - `ASCENDING` - * - `DECENDING` - * - `DEFAULT` - * - * Valid stats functions are: - * - `list` - * - `values` - * - `first` - * - `last` - * - `count` - * - `dc` - * - `sum` - * - `average` - * - `max` - * - `min` - * - `stdev` - * - `duration` - * - `earliest` - * - `latest` - * - * @class splunkjs.Service.PivotSpecification - */cov_1ks4ntaci2().s[890]++;root.PivotSpecification=Class.extend({_comparisons:{boolean:["=","is","isNull","isNotNull"],string:["=","is","isNull","isNotNull","contains","doesNotContain","startsWith","endsWith","regex"],number:["=","!=","<",">","<=",">=","is","isNull","isNotNull"],ipv4:["is","isNull","isNotNull","contains","doesNotContain","startsWith"]},_binning:["auto","year","month","day","hour","minute","second"],_sortDirection:["ASCENDING","DESCENDING","DEFAULT"],_statsFunctions:["list","values","first","last","count","dc","sum","average","max","min","stdev","duration","earliest","latest"],/** - * Constructor for a pivot specification. - * - * @constructor - * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. - * - * @method splunkjs.Service.PivotSpecification - */init:function(dataModelObject){cov_1ks4ntaci2().f[281]++;cov_1ks4ntaci2().s[891]++;this.dataModelObject=dataModelObject;cov_1ks4ntaci2().s[892]++;this.columns=[];cov_1ks4ntaci2().s[893]++;this.rows=[];cov_1ks4ntaci2().s[894]++;this.filters=[];cov_1ks4ntaci2().s[895]++;this.cells=[];cov_1ks4ntaci2().s[896]++;this.accelerationNamespace=dataModelObject.dataModel.isAccelerated()?(cov_1ks4ntaci2().b[244][0]++,dataModelObject.dataModel.name):(cov_1ks4ntaci2().b[244][1]++,null);cov_1ks4ntaci2().s[897]++;this.run=utils.bind(this,this.run);cov_1ks4ntaci2().s[898]++;this.pivot=utils.bind(this,this.pivot);},/** - * Set the acceleration cache for this pivot specification to a job, - * usually generated by createLocalAccelerationJob on a DataModelObject - * instance, as the acceleration cache for this pivot specification. - * - * @param {String|splunkjs.Service.Job} sid The sid of an acceleration job, - * or, a `splunkjs.Service.Job` instance. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */setAccelerationJob:function(sid){cov_1ks4ntaci2().f[282]++;cov_1ks4ntaci2().s[899]++;// If a search object is passed in, get its sid -if((cov_1ks4ntaci2().b[246][0]++,sid)&&(cov_1ks4ntaci2().b[246][1]++,sid instanceof Service.Job)){cov_1ks4ntaci2().b[245][0]++;cov_1ks4ntaci2().s[900]++;sid=sid.sid;}else{cov_1ks4ntaci2().b[245][1]++;}cov_1ks4ntaci2().s[901]++;if(!sid){cov_1ks4ntaci2().b[247][0]++;cov_1ks4ntaci2().s[902]++;throw new Error("Sid to use for acceleration must not be null.");}else{cov_1ks4ntaci2().b[247][1]++;}cov_1ks4ntaci2().s[903]++;this.accelerationNamespace="sid="+sid;cov_1ks4ntaci2().s[904]++;return this;},/** - * Add a filter on a boolean valued field. The filter will be a constraint of the form - * `field `comparison` compareTo`, for example: `is_remote = false`. - * - * @param {String} fieldName The name of field to filter on - * @param {String} comparisonType The type of comparison, see class docs for valid types. - * @param {String} comparisonOp The comparison, see class docs for valid comparisons, based on type. - * @param {String} compareTo The value to compare the field to. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addFilter:function(fieldName,comparisonType,comparisonOp,compareTo){cov_1ks4ntaci2().f[283]++;cov_1ks4ntaci2().s[905]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[248][0]++;cov_1ks4ntaci2().s[906]++;throw new Error("Cannot add filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[248][1]++;}cov_1ks4ntaci2().s[907]++;if(comparisonType!==this.dataModelObject.fieldByName(fieldName).type){cov_1ks4ntaci2().b[249][0]++;cov_1ks4ntaci2().s[908]++;throw new Error("Cannot add "+comparisonType+" filter on "+fieldName+" because it is of type "+this.dataModelObject.fieldByName(fieldName).type);}else{cov_1ks4ntaci2().b[249][1]++;}cov_1ks4ntaci2().s[909]++;if(!utils.contains(this._comparisons[comparisonType],comparisonOp)){cov_1ks4ntaci2().b[250][0]++;cov_1ks4ntaci2().s[910]++;throw new Error("Cannot add "+comparisonType+" filter because "+comparisonOp+" is not a valid comparison operator");}else{cov_1ks4ntaci2().b[250][1]++;}var ret=(cov_1ks4ntaci2().s[911]++,{fieldName:fieldName,owner:this.dataModelObject.fieldByName(fieldName).lineage.join("."),type:comparisonType});// These fields are type dependent -cov_1ks4ntaci2().s[912]++;if(utils.contains(["boolean","string","ipv4","number"],ret.type)){cov_1ks4ntaci2().b[251][0]++;cov_1ks4ntaci2().s[913]++;ret.rule={comparator:comparisonOp,compareTo:compareTo};}else{cov_1ks4ntaci2().b[251][1]++;}cov_1ks4ntaci2().s[914]++;this.filters.push(ret);cov_1ks4ntaci2().s[915]++;return this;},/** - * Add a limit on the events shown in a pivot by sorting them according to some field, then taking - * the specified number from the beginning or end of the list. - * - * @param {String} fieldName The name of field to filter on. - * @param {String} sortAttribute The name of the field to use for sorting. - * @param {String} sortDirection The direction to sort events, see class docs for valid types. - * @param {String} limit The number of values from the sorted list to allow through this filter. - * @param {String} statsFunction The stats function to use for aggregation before sorting, see class docs for valid types. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addLimitFilter:function(fieldName,sortAttribute,sortDirection,limit,statsFunction){cov_1ks4ntaci2().f[284]++;cov_1ks4ntaci2().s[916]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[252][0]++;cov_1ks4ntaci2().s[917]++;throw new Error("Cannot add limit filter on a nonexistent field.");}else{cov_1ks4ntaci2().b[252][1]++;}var f=(cov_1ks4ntaci2().s[918]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[919]++;if(!utils.contains(["string","number","objectCount"],f.type)){cov_1ks4ntaci2().b[253][0]++;cov_1ks4ntaci2().s[920]++;throw new Error("Cannot add limit filter on "+fieldName+" because it is of type "+f.type);}else{cov_1ks4ntaci2().b[253][1]++;}cov_1ks4ntaci2().s[921]++;if((cov_1ks4ntaci2().b[255][0]++,"string"===f.type)&&(cov_1ks4ntaci2().b[255][1]++,!utils.contains(["count","dc"],statsFunction))){cov_1ks4ntaci2().b[254][0]++;cov_1ks4ntaci2().s[922]++;throw new Error("Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[254][1]++;}cov_1ks4ntaci2().s[923]++;if((cov_1ks4ntaci2().b[257][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[257][1]++,!utils.contains(["count","dc","average","sum"],statsFunction))){cov_1ks4ntaci2().b[256][0]++;cov_1ks4ntaci2().s[924]++;throw new Error("Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found "+statsFunction);}else{cov_1ks4ntaci2().b[256][1]++;}cov_1ks4ntaci2().s[925]++;if((cov_1ks4ntaci2().b[259][0]++,"objectCount"===f.type)&&(cov_1ks4ntaci2().b[259][1]++,!utils.contains(["count"],statsFunction))){cov_1ks4ntaci2().b[258][0]++;cov_1ks4ntaci2().s[926]++;throw new Error("Stats function for fields of type object count must be COUNT; found "+statsFunction);}else{cov_1ks4ntaci2().b[258][1]++;}var filter=(cov_1ks4ntaci2().s[927]++,{fieldName:fieldName,owner:f.lineage.join("."),type:f.type,attributeName:sortAttribute,attributeOwner:this.dataModelObject.fieldByName(sortAttribute).lineage.join("."),sortDirection:sortDirection,limitAmount:limit,statsFn:statsFunction});// Assumed "highest" is preferred for when sortDirection is "DEFAULT" -cov_1ks4ntaci2().s[928]++;filter.limitType="ASCENDING"===sortDirection?(cov_1ks4ntaci2().b[260][0]++,"lowest"):(cov_1ks4ntaci2().b[260][1]++,"highest");cov_1ks4ntaci2().s[929]++;this.filters.push(filter);cov_1ks4ntaci2().s[930]++;return this;},/** - * Add a row split on a numeric or string valued field, splitting on each distinct value of the field. - * - * @param {String} fieldName The name of field to split on. - * @param {String} label A human readable name for this set of rows. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addRowSplit:function(fieldName,label){cov_1ks4ntaci2().f[285]++;cov_1ks4ntaci2().s[931]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[261][0]++;cov_1ks4ntaci2().s[932]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[261][1]++;}var f=(cov_1ks4ntaci2().s[933]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[934]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[262][0]++;cov_1ks4ntaci2().s[935]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[262][1]++;}var row=(cov_1ks4ntaci2().s[936]++,{fieldName:fieldName,owner:f.owner,type:f.type,label:label});cov_1ks4ntaci2().s[937]++;if("number"===f.type){cov_1ks4ntaci2().b[263][0]++;cov_1ks4ntaci2().s[938]++;row.display="all";}else{cov_1ks4ntaci2().b[263][1]++;}cov_1ks4ntaci2().s[939]++;this.rows.push(row);cov_1ks4ntaci2().s[940]++;return this;},/** - * Add a row split on a numeric field, splitting into numeric ranges. - * - * This split generates bins with edges equivalent to the - * classic loop 'for i in to by ' but with a maximum - * number of bins . This dispatches to the stats and xyseries search commands. - * See their documentation for more details. - * - * @param {String} fieldName The field to split on. - * @param {String} label A human readable name for this set of rows. - * @param {Object} options An optional dictionary of collection filtering and pagination options: - * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. - * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. - * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. - * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addRangeRowSplit:function(field,label,ranges){cov_1ks4ntaci2().f[286]++;cov_1ks4ntaci2().s[941]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[264][0]++;cov_1ks4ntaci2().s[942]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[264][1]++;}var f=(cov_1ks4ntaci2().s[943]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[944]++;if("number"!==f.type){cov_1ks4ntaci2().b[265][0]++;cov_1ks4ntaci2().s[945]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[265][1]++;}var updateRanges=(cov_1ks4ntaci2().s[946]++,{});cov_1ks4ntaci2().s[947]++;if((cov_1ks4ntaci2().b[267][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[267][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[266][0]++;cov_1ks4ntaci2().s[948]++;updateRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[266][1]++;}cov_1ks4ntaci2().s[949]++;if((cov_1ks4ntaci2().b[269][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[269][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[268][0]++;cov_1ks4ntaci2().s[950]++;updateRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[268][1]++;}cov_1ks4ntaci2().s[951]++;if((cov_1ks4ntaci2().b[271][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[271][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[270][0]++;cov_1ks4ntaci2().s[952]++;updateRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[270][1]++;}cov_1ks4ntaci2().s[953]++;if((cov_1ks4ntaci2().b[273][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[273][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[272][0]++;cov_1ks4ntaci2().s[954]++;updateRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[272][1]++;}cov_1ks4ntaci2().s[955]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,display:"ranges",ranges:updateRanges});cov_1ks4ntaci2().s[956]++;return this;},/** - * Add a row split on a boolean valued field. - * - * @param {String} fieldName The name of field to split on. - * @param {String} label A human readable name for this set of rows. - * @param {String} trueDisplayValue A string to display in the true valued row label. - * @param {String} falseDisplayValue A string to display in the false valued row label. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addBooleanRowSplit:function(field,label,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[287]++;cov_1ks4ntaci2().s[957]++;if(!this.dataModelObject.fieldByName(field)){cov_1ks4ntaci2().b[274][0]++;cov_1ks4ntaci2().s[958]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[274][1]++;}var f=(cov_1ks4ntaci2().s[959]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[960]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[275][0]++;cov_1ks4ntaci2().s[961]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[275][1]++;}cov_1ks4ntaci2().s[962]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[963]++;return this;},/** - * Add a row split on a timestamp valued field, binned by the specified bucket size. - * - * @param {String} fieldName The name of field to split on. - * @param {String} label A human readable name for this set of rows. - * @param {String} binning The size of bins to use, see class docs for valid types. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addTimestampRowSplit:function(field,label,binning){cov_1ks4ntaci2().f[288]++;cov_1ks4ntaci2().s[964]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[276][0]++;cov_1ks4ntaci2().s[965]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[276][1]++;}var f=(cov_1ks4ntaci2().s[966]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[967]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[277][0]++;cov_1ks4ntaci2().s[968]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[277][1]++;}cov_1ks4ntaci2().s[969]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[278][0]++;cov_1ks4ntaci2().s[970]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[278][1]++;}cov_1ks4ntaci2().s[971]++;this.rows.push({fieldName:field,owner:f.owner,type:f.type,label:label,period:binning});cov_1ks4ntaci2().s[972]++;return this;},/** - * Add a column split on a string or number valued field, producing a column for - * each distinct value of the field. - * - * @param {String} fieldName The name of field to split on. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addColumnSplit:function(fieldName){cov_1ks4ntaci2().f[289]++;cov_1ks4ntaci2().s[973]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[279][0]++;cov_1ks4ntaci2().s[974]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[279][1]++;}var f=(cov_1ks4ntaci2().s[975]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[976]++;if(!utils.contains(["number","string"],f.type)){cov_1ks4ntaci2().b[280][0]++;cov_1ks4ntaci2().s[977]++;throw new Error("Field was of type "+f.type+", expected number or string.");}else{cov_1ks4ntaci2().b[280][1]++;}var col=(cov_1ks4ntaci2().s[978]++,{fieldName:fieldName,owner:f.owner,type:f.type});cov_1ks4ntaci2().s[979]++;if("number"===f.type){cov_1ks4ntaci2().b[281][0]++;cov_1ks4ntaci2().s[980]++;col.display="all";}else{cov_1ks4ntaci2().b[281][1]++;}cov_1ks4ntaci2().s[981]++;this.columns.push(col);cov_1ks4ntaci2().s[982]++;return this;},/** - * Add a column split on a numeric field, splitting the values into ranges. - * - * @param {String} fieldName The field to split on. - * @param {Object} options An optional dictionary of collection filtering and pagination options: - * - `start` (_integer_): The value of the start of the first range, or null to take the lowest value in the events. - * - `end` (_integer_): The value for the end of the last range, or null to take the highest value in the events. - * - `step` (_integer_): The the width of each range, or null to have Splunk calculate it. - * - `limit` (_integer_): The maximum number of ranges to split into, or null for no limit. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addRangeColumnSplit:function(fieldName,ranges){cov_1ks4ntaci2().f[290]++;cov_1ks4ntaci2().s[983]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[282][0]++;cov_1ks4ntaci2().s[984]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[282][1]++;}var f=(cov_1ks4ntaci2().s[985]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[986]++;if("number"!==f.type){cov_1ks4ntaci2().b[283][0]++;cov_1ks4ntaci2().s[987]++;throw new Error("Field was of type "+f.type+", expected number.");}else{cov_1ks4ntaci2().b[283][1]++;}// In Splunk 6.0.1.1, data models incorrectly expect strings for these fields -// instead of numbers. In 6.1, this is fixed and both are accepted. -var updatedRanges=(cov_1ks4ntaci2().s[988]++,{});cov_1ks4ntaci2().s[989]++;if((cov_1ks4ntaci2().b[285][0]++,!utils.isUndefined(ranges.start))&&(cov_1ks4ntaci2().b[285][1]++,ranges.start!==null)){cov_1ks4ntaci2().b[284][0]++;cov_1ks4ntaci2().s[990]++;updatedRanges.start=ranges.start;}else{cov_1ks4ntaci2().b[284][1]++;}cov_1ks4ntaci2().s[991]++;if((cov_1ks4ntaci2().b[287][0]++,!utils.isUndefined(ranges.end))&&(cov_1ks4ntaci2().b[287][1]++,ranges.end!==null)){cov_1ks4ntaci2().b[286][0]++;cov_1ks4ntaci2().s[992]++;updatedRanges.end=ranges.end;}else{cov_1ks4ntaci2().b[286][1]++;}cov_1ks4ntaci2().s[993]++;if((cov_1ks4ntaci2().b[289][0]++,!utils.isUndefined(ranges.step))&&(cov_1ks4ntaci2().b[289][1]++,ranges.step!==null)){cov_1ks4ntaci2().b[288][0]++;cov_1ks4ntaci2().s[994]++;updatedRanges.size=ranges.step;}else{cov_1ks4ntaci2().b[288][1]++;}cov_1ks4ntaci2().s[995]++;if((cov_1ks4ntaci2().b[291][0]++,!utils.isUndefined(ranges.limit))&&(cov_1ks4ntaci2().b[291][1]++,ranges.limit!==null)){cov_1ks4ntaci2().b[290][0]++;cov_1ks4ntaci2().s[996]++;updatedRanges.maxNumberOf=ranges.limit;}else{cov_1ks4ntaci2().b[290][1]++;}cov_1ks4ntaci2().s[997]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,display:"ranges",ranges:updatedRanges});cov_1ks4ntaci2().s[998]++;return this;},/** - * Add a column split on a boolean valued field. - * - * @param {String} fieldName The name of field to split on. - * @param {String} trueDisplayValue A string to display in the true valued column label. - * @param {String} falseDisplayValue A string to display in the false valued column label. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addBooleanColumnSplit:function(fieldName,trueDisplayValue,falseDisplayValue){cov_1ks4ntaci2().f[291]++;cov_1ks4ntaci2().s[999]++;if(!this.dataModelObject.fieldByName(fieldName)){cov_1ks4ntaci2().b[292][0]++;cov_1ks4ntaci2().s[1000]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[292][1]++;}var f=(cov_1ks4ntaci2().s[1001]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1002]++;if("boolean"!==f.type){cov_1ks4ntaci2().b[293][0]++;cov_1ks4ntaci2().s[1003]++;throw new Error("Field was of type "+f.type+", expected boolean.");}else{cov_1ks4ntaci2().b[293][1]++;}cov_1ks4ntaci2().s[1004]++;this.columns.push({fieldName:fieldName,owner:f.owner,type:f.type,trueLabel:trueDisplayValue,falseLabel:falseDisplayValue});cov_1ks4ntaci2().s[1005]++;return this;},/** - * Add a column split on a timestamp valued field, binned by the specified bucket size. - * - * @param {String} fieldName The name of field to split on. - * @param {String} binning The size of bins to use, see class docs for valid types. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addTimestampColumnSplit:function(field,binning){cov_1ks4ntaci2().f[292]++;cov_1ks4ntaci2().s[1006]++;if(!this.dataModelObject.hasField(field)){cov_1ks4ntaci2().b[294][0]++;cov_1ks4ntaci2().s[1007]++;throw new Error("Did not find field "+field);}else{cov_1ks4ntaci2().b[294][1]++;}var f=(cov_1ks4ntaci2().s[1008]++,this.dataModelObject.fieldByName(field));cov_1ks4ntaci2().s[1009]++;if("timestamp"!==f.type){cov_1ks4ntaci2().b[295][0]++;cov_1ks4ntaci2().s[1010]++;throw new Error("Field was of type "+f.type+", expected timestamp.");}else{cov_1ks4ntaci2().b[295][1]++;}cov_1ks4ntaci2().s[1011]++;if(!utils.contains(this._binning,binning)){cov_1ks4ntaci2().b[296][0]++;cov_1ks4ntaci2().s[1012]++;throw new Error("Invalid binning "+binning+" found. Valid values are: "+this._binning.join(", "));}else{cov_1ks4ntaci2().b[296][1]++;}cov_1ks4ntaci2().s[1013]++;this.columns.push({fieldName:field,owner:f.owner,type:f.type,period:binning});cov_1ks4ntaci2().s[1014]++;return this;},/** - * Add an aggregate to each cell of the pivot. - * - * @param {String} fieldName The name of field to aggregate. - * @param {String} label a human readable name for this aggregate. - * @param {String} statsFunction The function to use for aggregation, see class docs for valid stats functions. - * @return {splunkjs.Service.PivotSpecification} The updated pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */addCellValue:function(fieldName,label,statsFunction){cov_1ks4ntaci2().f[293]++;cov_1ks4ntaci2().s[1015]++;if(!this.dataModelObject.hasField(fieldName)){cov_1ks4ntaci2().b[297][0]++;cov_1ks4ntaci2().s[1016]++;throw new Error("Did not find field "+fieldName);}else{cov_1ks4ntaci2().b[297][1]++;}var f=(cov_1ks4ntaci2().s[1017]++,this.dataModelObject.fieldByName(fieldName));cov_1ks4ntaci2().s[1018]++;if((cov_1ks4ntaci2().b[299][0]++,utils.contains(["string","ipv4"],f.type))&&(cov_1ks4ntaci2().b[299][1]++,!utils.contains(["list","values","first","last","count","dc"],statsFunction))){cov_1ks4ntaci2().b[298][0]++;cov_1ks4ntaci2().s[1019]++;throw new Error("Stats function on string and IPv4 fields must be one of:"+" list, distinct_values, first, last, count, or distinct_count; found "+statsFunction);}else{cov_1ks4ntaci2().b[298][1]++;cov_1ks4ntaci2().s[1020]++;if((cov_1ks4ntaci2().b[301][0]++,"number"===f.type)&&(cov_1ks4ntaci2().b[301][1]++,!utils.contains(["sum","count","average","min","max","stdev","list","values"],statsFunction))){cov_1ks4ntaci2().b[300][0]++;cov_1ks4ntaci2().s[1021]++;throw new Error("Stats function on number field must be must be one of:"+" sum, count, average, max, min, stdev, list, or distinct_values; found "+statsFunction);}else{cov_1ks4ntaci2().b[300][1]++;cov_1ks4ntaci2().s[1022]++;if((cov_1ks4ntaci2().b[303][0]++,"timestamp"===f.type)&&(cov_1ks4ntaci2().b[303][1]++,!utils.contains(["duration","earliest","latest","list","values"],statsFunction))){cov_1ks4ntaci2().b[302][0]++;cov_1ks4ntaci2().s[1023]++;throw new Error("Stats function on timestamp field must be one of:"+" duration, earliest, latest, list, or distinct values; found "+statsFunction);}else{cov_1ks4ntaci2().b[302][1]++;cov_1ks4ntaci2().s[1024]++;if((cov_1ks4ntaci2().b[305][0]++,utils.contains(["objectCount","childCount"],f.type))&&(cov_1ks4ntaci2().b[305][1]++,"count"!==statsFunction)){cov_1ks4ntaci2().b[304][0]++;cov_1ks4ntaci2().s[1025]++;throw new Error("Stats function on childcount and objectcount fields must be count; "+"found "+statsFunction);}else{cov_1ks4ntaci2().b[304][1]++;cov_1ks4ntaci2().s[1026]++;if("boolean"===f.type){cov_1ks4ntaci2().b[306][0]++;cov_1ks4ntaci2().s[1027]++;throw new Error("Cannot use boolean valued fields as cell values.");}else{cov_1ks4ntaci2().b[306][1]++;}}}}}cov_1ks4ntaci2().s[1028]++;this.cells.push({fieldName:fieldName,owner:f.lineage.join("."),type:f.type,label:label,sparkline:false,// Not properly implemented in core yet. -value:statsFunction});cov_1ks4ntaci2().s[1029]++;return this;},/** - * Returns a JSON ready object representation of this pivot specification. - * - * @return {Object} The JSON ready object representation of this pivot specification. - * - * @method splunkjs.Service.PivotSpecification - */toJsonObject:function(){cov_1ks4ntaci2().f[294]++;cov_1ks4ntaci2().s[1030]++;return{dataModel:this.dataModelObject.dataModel.name,baseClass:this.dataModelObject.name,rows:this.rows,columns:this.columns,cells:this.cells,filters:this.filters};},/** - * Query Splunk for SPL queries corresponding to a pivot report - * for this data model, defined by this `PivotSpecification`. - * - * @example - * - * service.dataModels().fetch(function(err, dataModels) { - * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); - * var pivotSpec = searches.createPivotSpecification(); - * // Use of the fluent API - * pivotSpec.addRowSplit("user", "Executing user") - * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) - * .addCellValue("search", "Search Query", "values") - * .pivot(function(pivotErr, pivot) { - * console.log("Pivot search is:", pivot.search); - * }); - * }); - * - * @param {Function} callback A function to call when done getting the pivot: `(err, pivot)`. - * - * @method splunkjs.Service.PivotSpecification - */pivot:function(callback){cov_1ks4ntaci2().f[295]++;var svc=(cov_1ks4ntaci2().s[1031]++,this.dataModelObject.dataModel.service);var args=(cov_1ks4ntaci2().s[1032]++,{pivot_json:JSON.stringify(this.toJsonObject())});cov_1ks4ntaci2().s[1033]++;if(!utils.isUndefined(this.accelerationNamespace)){cov_1ks4ntaci2().b[307][0]++;cov_1ks4ntaci2().s[1034]++;args.namespace=this.accelerationNamespace;}else{cov_1ks4ntaci2().b[307][1]++;}cov_1ks4ntaci2().s[1035]++;return svc.get(Paths.pivot+"/"+encodeURIComponent(this.dataModelObject.dataModel.name),args,function(err,response){cov_1ks4ntaci2().f[296]++;cov_1ks4ntaci2().s[1036]++;if(err){cov_1ks4ntaci2().b[308][0]++;cov_1ks4ntaci2().s[1037]++;callback(new Error(err.data.messages[0].text),response);cov_1ks4ntaci2().s[1038]++;return;}else{cov_1ks4ntaci2().b[308][1]++;}cov_1ks4ntaci2().s[1039]++;if((cov_1ks4ntaci2().b[310][0]++,response.data.entry)&&(cov_1ks4ntaci2().b[310][1]++,response.data.entry[0])){cov_1ks4ntaci2().b[309][0]++;cov_1ks4ntaci2().s[1040]++;callback(null,new root.Pivot(svc,response.data.entry[0].content));}else{cov_1ks4ntaci2().b[309][1]++;cov_1ks4ntaci2().s[1041]++;callback(new Error("Didn't get a Pivot report back from Splunk"),response);}});},/** - * Convenience method to wrap up the `PivotSpecification.pivot()` and - * `Pivot.run()` function calls. - * - * Query Splunk for SPL queries corresponding to a pivot report - * for this data model, defined by this `PivotSpecification`; then, - * starts a search job running this pivot, accelerated if possible. - * - * service.dataModels().fetch(function(fetchErr, dataModels) { - * var searches = dataModels.item("internal_audit_logs").objectByName("searches"); - * var pivotSpec = searches.createPivotSpecification(); - * // Use of the fluent API - * pivotSpec.addRowSplit("user", "Executing user") - * .addRangeColumnSplit("exec_time", {start: 0, end: 12, step: 5, limit: 4}) - * .addCellValue("search", "Search Query", "values") - * .run(function(err, job, pivot) { - * console.log("Job SID is:", job.sid); - * console.log("Pivot search is:", pivot.search); - * }); - * }); - * @param {Object} args A dictionary of properties for the search job (optional). For a list of available parameters, see Search job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {Function} callback A function to call when done getting the pivot: `(err, job, pivot)`. - * - * @method splunkjs.Service.PivotSpecification - */run:function(args,callback){cov_1ks4ntaci2().f[297]++;cov_1ks4ntaci2().s[1042]++;if(!callback){cov_1ks4ntaci2().b[311][0]++;cov_1ks4ntaci2().s[1043]++;callback=args;cov_1ks4ntaci2().s[1044]++;args={};}else{cov_1ks4ntaci2().b[311][1]++;}cov_1ks4ntaci2().s[1045]++;args=(cov_1ks4ntaci2().b[312][0]++,args)||(cov_1ks4ntaci2().b[312][1]++,{});cov_1ks4ntaci2().s[1046]++;this.pivot(function(err,pivot){cov_1ks4ntaci2().f[298]++;cov_1ks4ntaci2().s[1047]++;if(err){cov_1ks4ntaci2().b[313][0]++;cov_1ks4ntaci2().s[1048]++;callback(err,null,null);}else{cov_1ks4ntaci2().b[313][1]++;cov_1ks4ntaci2().s[1049]++;pivot.run(args,Async.augment(callback,pivot));}});}});/** - * Represents one of the structured views in a `DataModel`. - * - * Has these properties: - * - `dataModel` (_splunkjs.Service.DataModel_): The `DataModel` to which this `DataModelObject` belongs. - * - `name` (_string_): The name of this `DataModelObject`. - * - `displayName` (_string_): The human readable name of this `DataModelObject`. - * - `parentName` (_string_): The name of the parent `DataModelObject` to this one. - * - `lineage` (_array_): An array of strings of the lineage of the data model - * on which this field is defined. - * - `fields` (_object_): A dictionary of `DataModelField` objects, accessible by name. - * - `constraints` (_array_): An array of `DataModelConstraint` objects. - * - `calculations` (_object_): A dictionary of `DataModelCalculation` objects, accessible by ID. - * - * BaseSearch has an additional property: - * - `baseSearch` (_string_): The search query wrapped by this data model object. - * - * BaseTransaction has additional properties: - * - `groupByFields` (_string_): The fields that will be used to group events into transactions. - * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned - * and split into transactions. - * - `maxSpan` (_string_): The maximum time span of a transaction. - * - `maxPause` (_string_): The maximum pause time of a transaction. - * - * @class splunkjs.Service.DataModelObject - */cov_1ks4ntaci2().s[1050]++;root.DataModelObject=Class.extend({/** - * Constructor for a data model object. - * SDK users are not expected to invoke this constructor directly. - * - * @constructor - * @param {Object} props A dictionary of properties to set: - * - `objectName` (_string_): The name for this data model object. - * - `displayName` (_string_): A human readable name for this data model object. - * - `parentName` (_string_): The name of the data model that owns this data model object. - * - `lineage` (_string_): The lineage of the data model that owns this data model object, - * items are delimited by a dot. This is converted into an array of - * strings upon construction. - * - `fields` (_array_): An array of data model fields. - * - `constraints` (_array_): An array of data model constraints. - * - `calculations` (_array_): An array of data model calculations. - * - `baseSearch` (_string_): The search query wrapped by this data model object; exclusive to BaseSearch (optional) - * - `groupByFields` (_array_): The fields that will be used to group events into transactions; exclusive to BaseTransaction (optional) - * - `objectsToGroup` (_array_): Names of the data model objects that should be unioned - * and split into transactions; exclusive to BaseTransaction (optional) - * - `maxSpan` (_string_): The maximum time span of a transaction; exclusive to BaseTransaction (optional) - * - `maxPause` (_string_): The maximum pause time of a transaction; exclusive to BaseTransaction (optional) - * - * @param {splunkjs.Service.DataModel} parentDataModel The `DataModel` that owns this data model object. - * - * @method splunkjs.Service.DataModelObject - */init:function(props,parentDataModel){cov_1ks4ntaci2().f[299]++;cov_1ks4ntaci2().s[1051]++;props=(cov_1ks4ntaci2().b[314][0]++,props)||(cov_1ks4ntaci2().b[314][1]++,{});cov_1ks4ntaci2().s[1052]++;props.owner=(cov_1ks4ntaci2().b[315][0]++,props.owner)||(cov_1ks4ntaci2().b[315][1]++,"");cov_1ks4ntaci2().s[1053]++;this.dataModel=parentDataModel;cov_1ks4ntaci2().s[1054]++;this.name=props.objectName;cov_1ks4ntaci2().s[1055]++;this.displayName=props.displayName;cov_1ks4ntaci2().s[1056]++;this.parentName=props.parentName;cov_1ks4ntaci2().s[1057]++;this.lineage=props.lineage.split(".");// Properties exclusive to BaseTransaction -cov_1ks4ntaci2().s[1058]++;if(props.hasOwnProperty("groupByFields")){cov_1ks4ntaci2().b[316][0]++;cov_1ks4ntaci2().s[1059]++;this.groupByFields=props.groupByFields;}else{cov_1ks4ntaci2().b[316][1]++;}cov_1ks4ntaci2().s[1060]++;if(props.hasOwnProperty("objectsToGroup")){cov_1ks4ntaci2().b[317][0]++;cov_1ks4ntaci2().s[1061]++;this.objectsToGroup=props.objectsToGroup;}else{cov_1ks4ntaci2().b[317][1]++;}cov_1ks4ntaci2().s[1062]++;if(props.hasOwnProperty("transactionMaxTimeSpan")){cov_1ks4ntaci2().b[318][0]++;cov_1ks4ntaci2().s[1063]++;this.maxSpan=props.transactionMaxTimeSpan;}else{cov_1ks4ntaci2().b[318][1]++;}cov_1ks4ntaci2().s[1064]++;if(props.hasOwnProperty("transactionMaxPause")){cov_1ks4ntaci2().b[319][0]++;cov_1ks4ntaci2().s[1065]++;this.maxPause=props.transactionMaxPause;}else{cov_1ks4ntaci2().b[319][1]++;}// Property exclusive to BaseSearch -cov_1ks4ntaci2().s[1066]++;if(props.hasOwnProperty("baseSearch")){cov_1ks4ntaci2().b[320][0]++;cov_1ks4ntaci2().s[1067]++;this.baseSearch=props.baseSearch;}else{cov_1ks4ntaci2().b[320][1]++;}// Parse fields -cov_1ks4ntaci2().s[1068]++;this.fields={};cov_1ks4ntaci2().s[1069]++;for(var i=(cov_1ks4ntaci2().s[1070]++,0);iSearch job parameters on Splunk Developer Portal. - * **Note:** This method throws an error if the `exec_mode=oneshot` parameter is passed in with the properties dictionary. - * @param {String} querySuffix A search query, starting with a '|' that will be appended to the command to fetch the contents of this data model object (e.g., "| head 3"). - * @param {Function} callback A function to call with the search job: `(err, job)`. - * - * @method splunkjs.Service.DataModelObject - */startSearch:function(params,querySuffix,callback){cov_1ks4ntaci2().f[311]++;var query=(cov_1ks4ntaci2().s[1113]++,"| datamodel "+this.dataModel.name+" "+this.name+" search");// Prepend a space to the querySuffix, or set it to an empty string if null or undefined -cov_1ks4ntaci2().s[1114]++;querySuffix=querySuffix?(cov_1ks4ntaci2().b[327][0]++," "+querySuffix):(cov_1ks4ntaci2().b[327][1]++,"");cov_1ks4ntaci2().s[1115]++;this.dataModel.service.search(query+querySuffix,params,callback);},/** - * Returns the data model object this one inherits from if it is a user defined, - * otherwise return null. - * - * @return {splunkjs.Service.DataModelObject|null} This data model object's parent - * or null if this is not a user defined data model object. - * - * @method splunkjs.Service.DataModelObject - */parent:function(){cov_1ks4ntaci2().f[312]++;cov_1ks4ntaci2().s[1116]++;return this.dataModel.objectByName(this.parentName);},/** - * Returns a new Pivot Specification, accepts no parameters. - * - * @return {splunkjs.Service.PivotSpecification} A new pivot specification. - * - * @method splunkjs.Service.DataModelObject - */createPivotSpecification:function(){cov_1ks4ntaci2().f[313]++;cov_1ks4ntaci2().s[1117]++;// Pass in this DataModelObject to create a PivotSpecification -return new root.PivotSpecification(this);}});/** - * Represents a data model on the server. Data models - * contain `DataModelObject` instances, which specify structured - * views on Splunk data. - * - * @endpoint datamodel/model/{name} - * @class splunkjs.Service.DataModel - * @extends splunkjs.Service.Entity - */cov_1ks4ntaci2().s[1118]++;root.DataModel=Service.Entity.extend({/** - * Retrieves the REST endpoint path for this resource (with no namespace). - * - * @method splunkjs.Service.DataModel - */path:function(){cov_1ks4ntaci2().f[314]++;cov_1ks4ntaci2().s[1119]++;return Paths.dataModels+"/"+encodeURIComponent(this.name);},/** - * Constructor for `splunkjs.Service.DataModel`. - * - * @constructor - * @param {splunkjs.Service} service A `Service` instance. - * @param {String} name The name for the new data model. - * @param {Object} namespace (Optional) namespace information: - * - `owner` (_string_): The Splunk username, such as "admin". A value of "nobody" means no specific user. The "-" wildcard means all users. - * - `app` (_string_): The app context for this resource (such as "search"). The "-" wildcard means all apps. - * - `sharing` (_string_): A mode that indicates how the resource is shared. The sharing mode can be "user", "app", "global", or "system". - * @param {Object} props Properties of this data model: - * - `acceleration` (_string_): A JSON object with an `enabled` key, representing if acceleration is enabled or not. - * - `concise` (_string_): Indicates whether to list a concise JSON description of the data model, should always be "0". - * - `description` (_string_): The JSON describing the data model. - * - `displayName` (_string_): The name displayed for the data model in Splunk Web. - * - * @method splunkjs.Service.DataModel - */init:function(service,name,namespace,props){cov_1ks4ntaci2().f[315]++;cov_1ks4ntaci2().s[1120]++;// If not given a 4th arg, assume the namespace was omitted -if(!props){cov_1ks4ntaci2().b[328][0]++;cov_1ks4ntaci2().s[1121]++;props=namespace;cov_1ks4ntaci2().s[1122]++;namespace={};}else{cov_1ks4ntaci2().b[328][1]++;}cov_1ks4ntaci2().s[1123]++;this.name=name;cov_1ks4ntaci2().s[1124]++;this._super(service,this.path(),namespace);cov_1ks4ntaci2().s[1125]++;this.acceleration=(cov_1ks4ntaci2().b[329][0]++,JSON.parse(props.content.acceleration))||(cov_1ks4ntaci2().b[329][1]++,{});cov_1ks4ntaci2().s[1126]++;if(this.acceleration.hasOwnProperty("enabled")){cov_1ks4ntaci2().b[330][0]++;cov_1ks4ntaci2().s[1127]++;// convert the enabled property to a boolean -this.acceleration.enabled=!!this.acceleration.enabled;}else{cov_1ks4ntaci2().b[330][1]++;}// concise=0 (false) forces the server to return all details of the newly created data model. -// we do not want a summary of this data model -cov_1ks4ntaci2().s[1128]++;if((cov_1ks4ntaci2().b[332][0]++,!props.hasOwnProperty("concise"))||(cov_1ks4ntaci2().b[332][1]++,utils.isUndefined(props.concise))){cov_1ks4ntaci2().b[331][0]++;cov_1ks4ntaci2().s[1129]++;this.concise="0";}else{cov_1ks4ntaci2().b[331][1]++;}var dataModelDefinition=(cov_1ks4ntaci2().s[1130]++,JSON.parse(props.content.description));cov_1ks4ntaci2().s[1131]++;this.objectNames=dataModelDefinition.objectNameList;cov_1ks4ntaci2().s[1132]++;this.displayName=dataModelDefinition.displayName;cov_1ks4ntaci2().s[1133]++;this.description=dataModelDefinition.description;// Parse the objects for this data model -var objs=(cov_1ks4ntaci2().s[1134]++,dataModelDefinition.objects);cov_1ks4ntaci2().s[1135]++;this.objects=[];cov_1ks4ntaci2().s[1136]++;for(var i=(cov_1ks4ntaci2().s[1137]++,0);i0);}});}});})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2UuanMiXSwibmFtZXMiOlsiQ29udGV4dCIsInJlcXVpcmUiLCJIdHRwIiwiQXN5bmMiLCJQYXRocyIsIkNsYXNzIiwidXRpbHMiLCJyb290IiwiZXhwb3J0cyIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSIsImV4dGVuZCIsImluaXQiLCJfc3VwZXIiLCJhcHBseSIsImFyZ3VtZW50cyIsIm1vZHVsZSIsInNwZWNpYWxpemUiLCJiaW5kIiwiYXBwcyIsImNvbmZpZ3VyYXRpb25zIiwiaW5kZXhlcyIsInNhdmVkU2VhcmNoZXMiLCJqb2JzIiwidXNlcnMiLCJjdXJyZW50VXNlciIsInZpZXdzIiwiZmlyZWRBbGVydEdyb3VwcyIsImRhdGFNb2RlbHMiLCJvd25lciIsImFwcCIsImh0dHAiLCJzY2hlbWUiLCJob3N0IiwicG9ydCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZXNzaW9uS2V5IiwidmVyc2lvbiIsIkFwcGxpY2F0aW9ucyIsIm5hbWVzcGFjZSIsIkNvbmZpZ3VyYXRpb25zIiwiSW5kZXhlcyIsIlNhdmVkU2VhcmNoZXMiLCJzdG9yYWdlUGFzc3dvcmRzIiwiU3RvcmFnZVBhc3N3b3JkcyIsIkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb24iLCJKb2JzIiwiRGF0YU1vZGVscyIsIlVzZXJzIiwiVmlld3MiLCJzZWFyY2giLCJxdWVyeSIsInBhcmFtcyIsImNhbGxiYWNrIiwiaXNGdW5jdGlvbiIsImdldEpvYiIsInNpZCIsImpvYiIsIkpvYiIsImZldGNoIiwib25lc2hvdFNlYXJjaCIsInRoYXQiLCJyZXEiLCJnZXQiLCJlcnIiLCJyZXNwb25zZSIsImRhdGEiLCJlbnRyeSIsImNvbnRlbnQiLCJ1c2VyIiwiVXNlciIsIndhc0Fib3J0ZWQiLCJzZXJ2ZXJJbmZvIiwiU2VydmVySW5mbyIsInBhcnNlIiwicSIsInBhcnNlciIsInR5cGVhaGVhZCIsInByZWZpeCIsImNvdW50IiwicmVzdWx0cyIsImxvZyIsImV2ZW50IiwiaXNPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5IiwicGF0aCIsInBhdGhzIiwic3VibWl0RXZlbnQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsInBvc3QiLCJyZXF1ZXN0IiwiRW5kcG9pbnQiLCJzZXJ2aWNlIiwicXVhbGlmaWVkUGF0aCIsIkVycm9yIiwiZ2V0X3YyIiwiZGVsIiwicmVscGF0aCIsInVybCIsIlJlc291cmNlIiwiZnVsbHBhdGgiLCJfcHJvcGVydGllcyIsIl9zdGF0ZSIsIl9sb2FkIiwicHJvcGVydGllcyIsInN0YXRlIiwiRW50aXR5IiwiZmV0Y2hPblVwZGF0ZSIsInJlbW92ZSIsInVwZGF0ZSIsImZpZWxkcyIsImxpbmtzIiwiYWNsIiwiYXV0aG9yIiwidXBkYXRlZCIsInB1Ymxpc2hlZCIsImVuYWJsZSIsImRpc2FibGUiLCJyZWxvYWQiLCJfZmllbGRzIiwiX2FjbCIsIl9saW5rcyIsImlzQXJyYXkiLCJfYXV0aG9yIiwiX3VwZGF0ZWQiLCJfcHVibGlzaGVkIiwib3B0aW9ucyIsInByb3BzIiwiaGFzT3duUHJvcGVydHkiLCJDb2xsZWN0aW9uIiwiZmV0Y2hPbkVudGl0eUNyZWF0aW9uIiwiY3JlYXRlIiwibGlzdCIsIml0ZW0iLCJpbnN0YW50aWF0ZUVudGl0eSIsIl9lbnRpdGllcyIsIl9lbnRpdGllc0J5TmFtZSIsIl9wYWdpbmciLCJlbnRpdGllcyIsImVudGl0aWVzQnlOYW1lIiwiZW50aXR5UHJvcGVydHlMaXN0IiwiaSIsImxlbmd0aCIsImVudGl0eSIsInB1c2giLCJuYW1lIiwicGFnaW5nIiwiZmV0Y2hfdjIiLCJpZCIsImlzRW1wdHkiLCJmdWxsUGF0aCIsImNsb25lIiwiU2F2ZWRTZWFyY2giLCJlbmNvZGVVUklDb21wb25lbnQiLCJhY2tub3dsZWRnZSIsImRpc3BhdGNoIiwiaGlzdG9yeSIsInN1cHByZXNzSW5mbyIsImFsZXJ0Q291bnQiLCJwYXJzZUludCIsInRyaWdnZXJlZF9hbGVydF9jb3VudCIsImZpcmVkQWxlcnRHcm91cCIsIkZpcmVkQWxlcnRHcm91cCIsImpvYkRhdGEiLCJuYW1lc3BhY2VGcm9tUHJvcGVydGllcyIsImNhbGwiLCJlbnRpdHlOYW1lc3BhY2UiLCJTdG9yYWdlUGFzc3dvcmQiLCJGaXJlZEFsZXJ0IiwiZmlyZWRBbGVydHMiLCJhY3Rpb25zIiwiYWxlcnRUeXBlIiwiYWxlcnRfdHlwZSIsImlzRGlnZXN0TW9kZSIsImRpZ2VzdF9tb2RlIiwiZXhwaXJhdGlvblRpbWUiLCJleHBpcmF0aW9uX3RpbWVfcmVuZGVyZWQiLCJzYXZlZFNlYXJjaE5hbWUiLCJzYXZlZHNlYXJjaF9uYW1lIiwic2V2ZXJpdHkiLCJ0cmlnZ2VyVGltZSIsInRyaWdnZXJfdGltZSIsInRyaWdnZXJUaW1lUmVuZGVyZWQiLCJ0cmlnZ2VyX3RpbWVfcmVuZGVyZWQiLCJ0cmlnZ2VyZWRBbGVydENvdW50IiwidHJpZ2dlcmVkX2FsZXJ0cyIsImZpcmVkQWxlcnREYXRhIiwiZmlyZWRBbGVydCIsIkFwcGxpY2F0aW9uIiwic2V0dXBJbmZvIiwidXBkYXRlSW5mbyIsImluZm8iLCJWaWV3IiwiSW5kZXgiLCJyZXN1bHQiLCJ2ZXJzaW9uQ29tcGFyZSIsIkNvbmZpZ3VyYXRpb25TdGFuemEiLCJmaWxlIiwiQ29uZmlndXJhdGlvbkZpbGUiLCJnZXREZWZhdWx0U3RhbnphIiwic3RhbnphTmFtZSIsInZhbHVlcyIsImZpbGVuYW1lIiwiX19jb25mIiwiZG9lc0ZpbGVFeGlzdCIsImZpbGVzIiwiZmlsdGVyIiwiZiIsImNvZGUiLCJtZXNzYWdlIiwiY29uZmlndXJhdGlvbkZpbGUiLCJmZXRjaGVkRmlsZSIsImVycm9yIiwiZXJyb3JDb2RlIiwiZXJyb3JNZXNzYWdlIiwiZG9lc1N0YW56YUV4aXN0Iiwic3RhbnphIiwiZmV0Y2hlZFN0YW56YSIsImNyZWF0ZV92MiIsImNvbmZpZ3MiLCJzdmMiLCJrZXlWYWx1ZU1hcCIsImRvZXNGaWxlRXhpc3RSZXNwb25zZSIsImNvbmZpZ0ZpbGUiLCJjb25zb2xlIiwibmV3RmlsZSIsImRvZXNTdGFuemFFeGlzdFJlc3BvbnNlIiwiY29uZmlnU3RhbnphIiwibmV3U3RhbnphIiwidXBkYXRlZFN0YW56YSIsImNhbmNlbCIsImRpc2FibGVQcmV2aWV3IiwiZW5hYmxlUHJldmlldyIsImV2ZW50cyIsImZpbmFsaXplIiwicGF1c2UiLCJwcmV2aWV3Iiwic2VhcmNobG9nIiwic2V0UHJpb3JpdHkiLCJzZXRUVEwiLCJzdW1tYXJ5IiwidGltZWxpbmUiLCJ0b3VjaCIsInVucGF1c2UiLCJhY3Rpb24iLCJvdXRwdXRfbW9kZSIsIml0ZXJhdG9yIiwidHlwZSIsIlBhZ2luYXRlZEVuZHBvaW50SXRlcmF0b3IiLCJ2YWx1ZSIsInByaW9yaXR5IiwidHRsIiwidHJhY2siLCJjYWxsYmFja3MiLCJwZXJpb2QiLCJkb25lIiwibm9DYWxsYmFja3NBZnRlclJlYWR5IiwicHJvZ3Jlc3MiLCJmYWlsZWQiLCJyZWFkeSIsIl9wcmVyZWFkeSIsIl9zdG9wcGVkQWZ0ZXJSZWFkeSIsImVtaXR0ZWRSZWFkeSIsImRvbmVMb29waW5nIiwid2hpbHN0IiwibmV4dEl0ZXJhdGlvbiIsImRpc3BhdGNoU3RhdGUiLCJub3RSZWFkeSIsImlzRG9uZSIsImlzRmFpbGVkIiwic2xlZXAiLCJleGVjX21vZGUiLCJ0b0xvd2VyQ2FzZSIsIm91dHB1dE1vZGUiLCJEYXRhTW9kZWxGaWVsZCIsIl90eXBlcyIsImZpZWxkTmFtZSIsImRpc3BsYXlOYW1lIiwibXVsdGl2YWx1ZWQiLCJtdWx0aXZhbHVlIiwicmVxdWlyZWQiLCJoaWRkZW4iLCJlZGl0YWJsZSIsImNvbW1lbnQiLCJmaWVsZFNlYXJjaCIsImxpbmVhZ2UiLCJzcGxpdCIsImlzU3RyaW5nIiwiaXNOdW1iZXIiLCJpc1RpbWVzdGFtcCIsImlzT2JqZWN0Y291bnQiLCJpc0NoaWxkY291bnQiLCJpc0lQdjQiLCJpc0Jvb2xlYW4iLCJEYXRhTW9kZWxDb25zdHJhaW50IiwiRGF0YU1vZGVsQ2FsY3VsYXRpb24iLCJjYWxjdWxhdGlvbklEIiwiY2FsY3VsYXRpb25UeXBlIiwib3V0cHV0RmllbGRzIiwiZXhwcmVzc2lvbiIsImlucHV0RmllbGQiLCJsb29rdXBOYW1lIiwiaW5wdXRGaWVsZE1hcHBpbmdzIiwibG9va3VwSW5wdXRzIiwib3V0cHV0RmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJpc0VkaXRhYmxlIiwiaXNMb29rdXAiLCJpc0V2YWwiLCJpc1JleCIsImlzR2VvSVAiLCJQaXZvdCIsImRyaWxsZG93blNlYXJjaCIsImRyaWxsZG93bl9zZWFyY2giLCJwcmV0dHlRdWVyeSIsIm9wZW5JblNlYXJjaCIsIm9wZW5faW5fc2VhcmNoIiwicGl2b3RTZWFyY2giLCJwaXZvdF9zZWFyY2giLCJ0c3RhdHNTZWFyY2giLCJ0c3RhdHNfc2VhcmNoIiwicnVuIiwiYXJncyIsImlzVW5kZWZpbmVkIiwiUGl2b3RTcGVjaWZpY2F0aW9uIiwiX2NvbXBhcmlzb25zIiwiYm9vbGVhbiIsInN0cmluZyIsIm51bWJlciIsImlwdjQiLCJfYmlubmluZyIsIl9zb3J0RGlyZWN0aW9uIiwiX3N0YXRzRnVuY3Rpb25zIiwiZGF0YU1vZGVsT2JqZWN0IiwiY29sdW1ucyIsInJvd3MiLCJmaWx0ZXJzIiwiY2VsbHMiLCJhY2NlbGVyYXRpb25OYW1lc3BhY2UiLCJkYXRhTW9kZWwiLCJpc0FjY2VsZXJhdGVkIiwicGl2b3QiLCJzZXRBY2NlbGVyYXRpb25Kb2IiLCJhZGRGaWx0ZXIiLCJjb21wYXJpc29uVHlwZSIsImNvbXBhcmlzb25PcCIsImNvbXBhcmVUbyIsImhhc0ZpZWxkIiwiZmllbGRCeU5hbWUiLCJjb250YWlucyIsInJldCIsImpvaW4iLCJydWxlIiwiY29tcGFyYXRvciIsImFkZExpbWl0RmlsdGVyIiwic29ydEF0dHJpYnV0ZSIsInNvcnREaXJlY3Rpb24iLCJsaW1pdCIsInN0YXRzRnVuY3Rpb24iLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlT3duZXIiLCJsaW1pdEFtb3VudCIsInN0YXRzRm4iLCJsaW1pdFR5cGUiLCJhZGRSb3dTcGxpdCIsImxhYmVsIiwicm93IiwiZGlzcGxheSIsImFkZFJhbmdlUm93U3BsaXQiLCJmaWVsZCIsInJhbmdlcyIsInVwZGF0ZVJhbmdlcyIsInN0YXJ0IiwiZW5kIiwic3RlcCIsInNpemUiLCJtYXhOdW1iZXJPZiIsImFkZEJvb2xlYW5Sb3dTcGxpdCIsInRydWVEaXNwbGF5VmFsdWUiLCJmYWxzZURpc3BsYXlWYWx1ZSIsInRydWVMYWJlbCIsImZhbHNlTGFiZWwiLCJhZGRUaW1lc3RhbXBSb3dTcGxpdCIsImJpbm5pbmciLCJhZGRDb2x1bW5TcGxpdCIsImNvbCIsImFkZFJhbmdlQ29sdW1uU3BsaXQiLCJ1cGRhdGVkUmFuZ2VzIiwiYWRkQm9vbGVhbkNvbHVtblNwbGl0IiwiYWRkVGltZXN0YW1wQ29sdW1uU3BsaXQiLCJhZGRDZWxsVmFsdWUiLCJzcGFya2xpbmUiLCJ0b0pzb25PYmplY3QiLCJiYXNlQ2xhc3MiLCJwaXZvdF9qc29uIiwibWVzc2FnZXMiLCJ0ZXh0IiwiYXVnbWVudCIsIkRhdGFNb2RlbE9iamVjdCIsInBhcmVudERhdGFNb2RlbCIsIm9iamVjdE5hbWUiLCJwYXJlbnROYW1lIiwiZ3JvdXBCeUZpZWxkcyIsIm9iamVjdHNUb0dyb3VwIiwibWF4U3BhbiIsInRyYW5zYWN0aW9uTWF4VGltZVNwYW4iLCJtYXhQYXVzZSIsInRyYW5zYWN0aW9uTWF4UGF1c2UiLCJiYXNlU2VhcmNoIiwiY29uc3RyYWludHMiLCJqIiwiY2FsY3VsYXRpb25zIiwiayIsImlzQmFzZVNlYXJjaCIsImlzQmFzZVRyYW5zYWN0aW9uIiwiZmllbGROYW1lcyIsImNhbGN1bGF0ZWRGaWVsZHMiLCJhbGxGaWVsZHMiLCJjb21iaW5lZEZpZWxkcyIsImNmIiwiYWxsRmllbGROYW1lcyIsImNhbGN1bGF0aW9uSURzIiwiY2FsY3VsYXRpb24iLCJjYWxjdWxhdGVkRmllbGROYW1lcyIsImNyZWF0ZUxvY2FsQWNjZWxlcmF0aW9uSm9iIiwiZWFybGllc3RUaW1lIiwidW5kZWZpbmVkIiwiZWFybGllc3RfdGltZSIsInN0YXJ0U2VhcmNoIiwicXVlcnlTdWZmaXgiLCJwYXJlbnQiLCJvYmplY3RCeU5hbWUiLCJjcmVhdGVQaXZvdFNwZWNpZmljYXRpb24iLCJEYXRhTW9kZWwiLCJhY2NlbGVyYXRpb24iLCJlbmFibGVkIiwiY29uY2lzZSIsImRhdGFNb2RlbERlZmluaXRpb24iLCJkZXNjcmlwdGlvbiIsIm9iamVjdE5hbWVzIiwib2JqZWN0TmFtZUxpc3QiLCJvYmpzIiwib2JqZWN0cyIsImhhc09iamVjdCIsInVwZGF0ZWRQcm9wcyIsImFjY2NlbGVyYXRpb24iLCJjcm9uX3NjaGVkdWxlIiwiY3JvblNjaGVkdWxlIiwiZGF0YU1vZGVsTmFtZXNwYWNlIiwicmVwbGFjZSIsImVuZHBvaW50IiwiX2VuZHBvaW50IiwiX3BhZ2VzaXplIiwicGFnZXNpemUiLCJfb2Zmc2V0IiwibmV4dCIsIm9mZnNldCIsIm51bVJlc3VsdHMiXSwibWFwcGluZ3MiOiJvc3ZOQWVZO21IQWZaLEssQ0FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLENBQUMsVUFBVyxDQUNSLGFBRFEsd0JBR1IsR0FBSUEsQ0FBQUEsT0FBTywwQkFBT0MsT0FBTyxDQUFDLFdBQUQsQ0FBZCxDQUFYLENBQ0EsR0FBSUMsQ0FBQUEsSUFBSSwwQkFBVUQsT0FBTyxDQUFDLFFBQUQsQ0FBakIsQ0FBUixDQUNBLEdBQUlFLENBQUFBLEtBQUssMEJBQVNGLE9BQU8sQ0FBQyxTQUFELENBQWhCLENBQVQsQ0FDQSxHQUFJRyxDQUFBQSxLQUFLLDBCQUFTSCxPQUFPLENBQUMsU0FBRCxDQUFQLENBQW1CRyxLQUE1QixDQUFULENBQ0EsR0FBSUMsQ0FBQUEsS0FBSywwQkFBU0osT0FBTyxDQUFDLGdCQUFELENBQVAsQ0FBMEJJLEtBQW5DLENBQVQsQ0FDQSxHQUFJQyxDQUFBQSxLQUFLLDBCQUFTTCxPQUFPLENBQUMsU0FBRCxDQUFoQixDQUFULENBRUEsR0FBSU0sQ0FBQUEsSUFBSSwwQkFBRyw0QkFBQUMsT0FBTywrQkFBSSxJQUFKLENBQVYsQ0FBUixDQUNBLEdB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MkJBRURwRixJQUFJLENBQUM2WSxPQUFMLEVBQWdCRyxVQUFoQixDQUZDLDJCQUlEeFosUUFBUSxDQUFDLElBQUQsQ0FBTzJCLE9BQVAsQ0FBZ0I2WCxVQUFVLENBQUcsQ0FBN0IsQ0FBUixDQUNILENBQ0osQ0FWTSxDQUFQLENBV0gsQ0E3QnlDLENBQWIsQ0FBakMsQ0ErQkgsQ0EzcExEIiwic291cmNlc0NvbnRlbnQiOlsiLyohKi9cbi8vIENvcHlyaWdodCAyMDE0IFNwbHVuaywgSW5jLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik6IHlvdSBtYXlcbi8vIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluXG4vLyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUXG4vLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGVcbi8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIFxuICAgIHZhciBDb250ZXh0ICAgICA9IHJlcXVpcmUoJy4vY29udGV4dCcpO1xuICAgIHZhciBIdHRwICAgICAgICA9IHJlcXVpcmUoJy4vaHR0cCcpO1xuICAgIHZhciBBc3luYyAgICAgICA9IHJlcXVpcmUoJy4vYXN5bmMnKTtcbiAgICB2YXIgUGF0aHMgICAgICAgPSByZXF1aXJlKCcuL3BhdGhzJykuUGF0aHM7XG4gICAgdmFyIENsYXNzICAgICAgID0gcmVxdWlyZSgnLi9qcXVlcnkuY2xhc3MnKS5DbGFzcztcbiAgICB2YXIgdXRpbHMgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG4gICAgXG4gICAgdmFyIHJvb3QgPSBleHBvcnRzIHx8IHRoaXM7XG4gICAgdmFyIFNlcnZpY2UgPSBudWxsO1xuICAgIFxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvIFNwbHVuayBFbnRlcnByaXNlIGFuZCBTcGx1bmsgU3Rvcm0uXG4gICAgICogXG4gICAgICogVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgYW5kIGlzIHRoZXJlZm9yZSBTREstcHJpdmF0ZS5cbiAgICAgKiBcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMucHJpdmF0ZS5CYXNlU2VydmljZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLkNvbnRleHRcbiAgICAgKi9cbiAgICB2YXIgQmFzZVNlcnZpY2UgPSBDb250ZXh0LmV4dGVuZCh7XG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByb290IGFjY2VzcyBwb2ludCB0byBTcGx1bmsgZnVuY3Rpb25hbGl0eSB3aXRoIHR5cGVkIGFjY2VzcyB0byBcbiAgICAgKiBTcGx1bmsgcmVzb3VyY2VzIHN1Y2ggYXMgc2VhcmNoZXMsIGluZGV4ZXMsIGlucHV0cywgYW5kIG1vcmUuIFByb3ZpZGVzXG4gICAgICogbWV0aG9kcyB0byBhdXRoZW50aWNhdGUgYW5kIGNyZWF0ZSBzcGVjaWFsaXplZCBpbnN0YW5jZXMgb2YgdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZVxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLnByaXZhdGUuQmFzZVNlcnZpY2VcbiAgICAgKi9cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHJvb3QgPSBTZXJ2aWNlID0gQmFzZVNlcnZpY2UuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLkh0dHB9IGh0dHAgQW4gaW5zdGFuY2Ugb2YgYSBgc3BsdW5ranMuSHR0cGAgY2xhc3MuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbmFsIHBhcmFtZXRlcnM6IFxuICAgICAgICAgKiAgICAtIGBzY2hlbWVgIChfc3RyaW5nXyk6IFRoZSBzY2hlbWUgKFwiaHR0cFwiIG9yIFwiaHR0cHNcIikgZm9yIGFjY2Vzc2luZyBTcGx1bmsuXG4gICAgICAgICAqICAgIC0gYGhvc3RgIChfc3RyaW5nXyk6IFRoZSBob3N0IG5hbWUgKHRoZSBkZWZhdWx0IGlzIFwibG9jYWxob3N0XCIpLlxuICAgICAgICAgKiAgICAtIGBwb3J0YCAoX2ludGVnZXJfKTogVGhlIHBvcnQgbnVtYmVyICh0aGUgZGVmYXVsdCBpcyA4MDg5KS5cbiAgICAgICAgICogICAgLSBgdXNlcm5hbWVgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgYWNjb3VudCB1c2VybmFtZSwgd2hpY2ggaXMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIFNwbHVuayBpbnN0YW5jZS5cbiAgICAgICAgICogICAgLSBgcGFzc3dvcmRgIChfc3RyaW5nXyk6IFRoZSBwYXNzd29yZCwgd2hpY2ggaXMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIFNwbHVuayBpbnN0YW5jZS5cbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBvd25lciAodXNlcm5hbWUpIGNvbXBvbmVudCBvZiB0aGUgbmFtZXNwYWNlLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29tcG9uZW50IG9mIHRoZSBuYW1lc3BhY2UuXG4gICAgICAgICAqICAgIC0gYHNlc3Npb25LZXlgIChfc3RyaW5nXyk6IFRoZSBjdXJyZW50IHNlc3Npb24gdG9rZW4uXG4gICAgICAgICAqICAgIC0gYGF1dG9sb2dpbmAgKF9ib29sZWFuXyk6IGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2cgaW4gYWdhaW4gaWYgdGhlIHNlc3Npb24gdGVybWluYXRlcywgYGZhbHNlYCBpZiBub3QgKGB0cnVlYCBieSBkZWZhdWx0KS5cbiAgICAgICAgICogICAgLSBgdmVyc2lvbmAgKF9zdHJpbmdfKTogVGhlIHZlcnNpb24gc3RyaW5nIGZvciBTcGx1bmssIGZvciBleGFtcGxlIFwiNC4zLjJcIiAodGhlIGRlZmF1bHQgaXMgXCI1LjBcIikuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2V9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgIC8vIFdlIHBlcmZvcm0gdGhlIGJpbmRpbmdzIHNvIHRoYXQgZXZlcnkgZnVuY3Rpb24gd29ya3MgXG4gICAgICAgICAgICAvLyBwcm9wZXJseSB3aGVuIGl0IGlzIHBhc3NlZCBhcyBhIGNhbGxiYWNrLlxuICAgICAgICAgICAgdGhpcy5zcGVjaWFsaXplICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3BlY2lhbGl6ZSk7XG4gICAgICAgICAgICB0aGlzLmFwcHMgICAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5hcHBzKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbnMgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmNvbmZpZ3VyYXRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlcyAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmluZGV4ZXMpO1xuICAgICAgICAgICAgdGhpcy5zYXZlZFNlYXJjaGVzICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2F2ZWRTZWFyY2hlcyk7XG4gICAgICAgICAgICB0aGlzLmpvYnMgICAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5qb2JzKTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVzZXJzKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICAgIHRoaXMudmlld3MgICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnZpZXdzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZWRBbGVydEdyb3VwcyAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZpcmVkQWxlcnRHcm91cHMpO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWxzICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGF0YU1vZGVscyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgYFNlcnZpY2VgIGluc3RhbmNlIGZvclxuICAgICAgICAgKiBhIHNwZWNpZmljIG5hbWVzcGFjZSBjb250ZXh0LiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc3ZjID0gLi4uO1xuICAgICAgICAgKiAgICAgIHZhciBuZXdTZXJ2aWNlID0gc3ZjLnNwZWNpYWxpemUoXCJteXVzZXJcIiwgXCJ1bml4XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3duZXIgVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwIFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlfSBUaGUgc3BlY2lhbGl6ZWQgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIHNwZWNpYWxpemU6IGZ1bmN0aW9uKG93bmVyLCBhcHApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmljZSh0aGlzLmh0dHAsIHtcbiAgICAgICAgICAgICAgICBzY2hlbWU6IHRoaXMuc2NoZW1lLFxuICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuaG9zdCwgICBcbiAgICAgICAgICAgICAgICBwb3J0OiB0aGlzLnBvcnQsICAgICAgIFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIG93bmVyOiBvd25lcixcbiAgICAgICAgICAgICAgICBhcHA6IGFwcCwgXG4gICAgICAgICAgICAgICAgc2Vzc2lvbktleTogdGhpcy5zZXNzaW9uS2V5LFxuICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYEFwcGxpY2F0aW9uc2AgY29sbGVjdGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBcbiAgICAgICAgICogbGlzdCBpbnN0YWxsZWQgYXBwcyBhbmQgcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlbS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBMaXN0IGluc3RhbGxlZCBhcHBzXG4gICAgICAgICAqICAgICAgdmFyIGFwcHMgPSBzdmMuYXBwcygpO1xuICAgICAgICAgKiAgICAgIGFwcHMuZmV0Y2goZnVuY3Rpb24oZXJyKSB7IGNvbnNvbGUubG9nKGFwcHMubGlzdCgpKTsgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbn0gVGhlIGBBcHBsaWNhdGlvbnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBhcHBzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5BcHBsaWNhdGlvbnModGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYENvbmZpZ3VyYXRpb25zYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBcbiAgICAgICAgICogY3JlYXRlLCBsaXN0LCBhbmQgcmV0cmlldmUgY29uZmlndXJhdGlvbiAoLmNvbmYpIGZpbGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsIHByb3BlcnRpZXMgaW4gdGhlICdwcm9wcy5jb25mJyBmaWxlXG4gICAgICAgICAqICAgICAgdmFyIGZpbGVzID0gc3ZjLmNvbmZpZ3VyYXRpb25zKCk7XG4gICAgICAgICAqICAgICAgZmlsZXMuaXRlbShcInByb3BzXCIsIGZ1bmN0aW9uKGVyciwgcHJvcHNGaWxlKSB7XG4gICAgICAgICAqICAgICAgICAgIHByb3BzRmlsZS5mZXRjaChmdW5jdGlvbihlcnIsIHByb3BzKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwcm9wcy5wcm9wZXJ0aWVzKCkpOyBcbiAgICAgICAgICogICAgICAgICAgfSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zfSBUaGUgYENvbmZpZ3VyYXRpb25zYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgY29uZmlnc1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBjb25maWd1cmF0aW9uczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuQ29uZmlndXJhdGlvbnModGhpcywgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgSW5kZXhlc2AgY29sbGVjdGlvbiwgd2hpY2ggbGV0cyB5b3UgY3JlYXRlLCBcbiAgICAgICAgICogbGlzdCwgYW5kIHVwZGF0ZSBpbmRleGVzLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFuIF9pbnRlcm5hbCBpbmRleFxuICAgICAgICAgKiAgICAgIHZhciBpbmRleGVzID0gc3ZjLmluZGV4ZXMoKTtcbiAgICAgICAgICogICAgICBpbmRleGVzLmZldGNoKGZ1bmN0aW9uKGVyciwgaW5kZXhlcykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzLml0ZW0oXCJfaW50ZXJuYWxcIik7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiV2FzIGluZGV4IGZvdW5kOiBcIiArICEhaW5kZXgpO1xuICAgICAgICAgKiAgICAgICAgICAvLyBgaW5kZXhgIGlzIGFuIEluZGV4IG9iamVjdC5cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSW5kZXhlc30gVGhlIGBJbmRleGVzYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgZGF0YS9pbmRleGVzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc1xuICAgICAgICAgKi8gICAgICAgIFxuICAgICAgICBpbmRleGVzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHsgXG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuSW5kZXhlcyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBTYXZlZFNlYXJjaGVzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdVxuICAgICAgICAgKiBjcmVhdGUsIGxpc3QsIGFuZCB1cGRhdGUgc2F2ZWQgc2VhcmNoZXMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsICMgb2Ygc2F2ZWQgc2VhcmNoZXNcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2hlcyA9IHN2Yy5zYXZlZFNlYXJjaGVzKCk7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2hlcy5mZXRjaChmdW5jdGlvbihlcnIsIHNhdmVkU2VhcmNoZXMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCIjIE9mIFNhdmVkIFNlYXJjaGVzOiBcIiArIHNhdmVkU2VhcmNoZXMubGlzdCgpLmxlbmd0aCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXN9IFRoZSBgU2F2ZWRTZWFyY2hlc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi9cbiAgICAgICAgc2F2ZWRTZWFyY2hlczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuU2F2ZWRTZWFyY2hlcyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBTdG9yYWdlUGFzc3dvcmRzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdVxuICAgICAgICAgKiBjcmVhdGUsIGxpc3QsIGFuZCB1cGRhdGUgc3RvcmFnZSBwYXNzd29yZHMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsICMgb2Ygc3RvcmFnZSBwYXNzd29yZHNcbiAgICAgICAgICogICAgICB2YXIgc3RvcmFnZVBhc3N3b3JkcyA9IHN2Yy5zdG9yYWdlUGFzc3dvcmRzKCk7XG4gICAgICAgICAqICAgICAgc3RvcmFnZVBhc3N3b3Jkcy5mZXRjaChmdW5jdGlvbihlcnIsIHN0b3JhZ2VQYXNzd29yZHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCIjIG9mIFN0b3JhZ2UgUGFzc3dvcmRzOiBcIiArIHN0b3JhZ2VQYXNzd29yZHMubGlzdCgpLmxlbmd0aCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHN9IFRoZSBgU3RvcmFnZVBhc3N3b3Jkc2AgY29sbGVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHN0b3JhZ2UvcGFzc3dvcmRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi9cbiAgICAgICAgc3RvcmFnZVBhc3N3b3JkczogZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuU3RvcmFnZVBhc3N3b3Jkcyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBgRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbmAgY29sbGVjdGlvbiwgd2hpY2ggbGV0cyB5b3VcbiAgICAgICAgICogbGlzdCBhbGVydCBncm91cHMuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgICAgIFxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsICMgb2YgZmlyZWQgYWxlcnQgZ3JvdXBzXG4gICAgICAgICAqICAgICAgdmFyIGZpcmVkQWxlcnRHcm91cHMgPSBzdmMuZmlyZWRBbGVydEdyb3VwcygpO1xuICAgICAgICAgKiAgICAgIGZpcmVkQWxlcnRHcm91cHMuZmV0Y2goZnVuY3Rpb24oZXJyLCBmaXJlZEFsZXJ0R3JvdXBzKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiIyBvZiBhbGVydCBncm91cHM6IFwiICsgZmlyZWRBbGVydEdyb3Vwcy5saXN0KCkubGVuZ3RoKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbn0gVGhlIGBGaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uYCBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqIEBzZWUgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBmaXJlZEFsZXJ0R3JvdXBzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uKHRoaXMsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBKb2JzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIGxpc3QsXG4gICAgICAgICAqIGFuZCByZXRyaWV2ZSBzZWFyY2ggam9icy4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gTGlzdCBhbGwgam9iIElEc1xuICAgICAgICAgKiAgICAgIHZhciBqb2JzID0gc3ZjLmpvYnMoKTtcbiAgICAgICAgICogICAgICBqb2JzLmZldGNoKGZ1bmN0aW9uKGVyciwgam9icykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgbGlzdCA9IGpvYnMubGlzdCgpO1xuICAgICAgICAgKiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKb2IgXCIgKyAoaSsxKSArIFwiOiBcIiArIGxpc3RbaV0uc2lkKTtcbiAgICAgICAgICogICAgICAgICAgfVxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Kb2JzfSBUaGUgYEpvYnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9ic1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIGpvYnM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkpvYnModGhpcywgbmFtZXNwYWNlKTsgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBEYXRhTW9kZWxzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIGxpc3QsXG4gICAgICAgICAqIGFuZCByZXRyaWV2ZSBkYXRhIG1vZGVscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IGRhdGFtb2RlbC9tb2RlbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICogQHNlZSBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIGRhdGFNb2RlbHM6IGZ1bmN0aW9uKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkRhdGFNb2RlbHModGhpcywgbmFtZXNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgYFVzZXJzYCBjb2xsZWN0aW9uLCB3aGljaCBsZXRzIHlvdSBjcmVhdGUsIFxuICAgICAgICAgKiBsaXN0LCBhbmQgcmV0cmlldmUgdXNlcnMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsIHVzZXJuYW1lc1xuICAgICAgICAgKiAgICAgIHZhciB1c2VycyA9IHN2Yy51c2VycygpO1xuICAgICAgICAgKiAgICAgIHVzZXJzLmZldGNoKGZ1bmN0aW9uKGVyciwgdXNlcnMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIGxpc3QgPSB1c2Vycy5saXN0KCk7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVzZXIgXCIgKyAoaSsxKSArIFwiOiBcIiArIGxpc3RbaV0ucHJvcGVydGllcygpLm5hbWUpO1xuICAgICAgICAgKiAgICAgICAgICB9XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcnN9IFRoZSBgVXNlcnNgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhdXRob3JpemF0aW9uL3VzZXJzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuVXNlcnNcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Vc2Vycyh0aGlzKTsgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGBWaWV3c2AgY29sbGVjdGlvbiwgd2hpY2ggbGV0cyB5b3UgY3JlYXRlLFxuICAgICAgICAgKiBsaXN0LCBhbmQgcmV0cmlldmUgdmlld3MgKGN1c3RvbSBVSXMgYnVpbHQgaW4gU3BsdW5rJ3MgYXBwIGZyYW1ld29yaykuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIC8vIExpc3QgYWxsIHZpZXdzXG4gICAgICAgICAqICAgICAgdmFyIHZpZXdzID0gc3ZjLnZpZXdzKCk7XG4gICAgICAgICAqICAgICAgdmlld3MuZmV0Y2goZnVuY3Rpb24oZXJyLCB2aWV3cykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgbGlzdCA9IHZpZXdzLmxpc3QoKTtcbiAgICAgICAgICogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmlldyBcIiArIChpKzEpICsgXCI6IFwiICsgbGlzdFtpXS5wcm9wZXJ0aWVzKCkubmFtZSk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld3N9IFRoZSBgVmlld3NgIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBkYXRhL3VpL3ZpZXdzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKiBAc2VlIHNwbHVua2pzLlNlcnZpY2UuVmlld3NcbiAgICAgICAgICovXG4gICAgICAgIHZpZXdzOiBmdW5jdGlvbihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5WaWV3cyh0aGlzLCBuYW1lc3BhY2UpOyAgXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNlYXJjaCBqb2Igd2l0aCBhIGdpdmVuIHNlYXJjaCBxdWVyeSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycywgaW5jbHVkaW5nIGBleGVjX21vZGVgIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygc2VhcmNoOlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPW5vcm1hbGAgdG8gcmV0dXJuIGEgc2VhcmNoIGpvYiBJRCBpbW1lZGlhdGVseSAoZGVmYXVsdCkuXG4gICAgICAgICAqICAgICAgUG9sbCBmb3IgY29tcGxldGlvbiB0byBmaW5kIG91dCB3aGVuIHlvdSBjYW4gcmV0cmlldmUgc2VhcmNoIHJlc3VsdHMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPWJsb2NraW5nYCB0byByZXR1cm4gdGhlIHNlYXJjaCBqb2IgSUQgd2hlbiB0aGUgc2VhcmNoIGhhcyBmaW5pc2hlZC5cbiAgICAgICAgICogXG4gICAgICAgICAqIFRvIHJ1biBhIG9uZXNob3Qgc2VhcmNoLCB3aGljaCBkb2VzIG5vdCBjcmVhdGUgYSBqb2IgYnV0IHJhdGhlciByZXR1cm5zIHRoZSBzZWFyY2ggcmVzdWx0cywgdXNlIGBTZXJ2aWNlLm9uZXNob3RTZWFyY2hgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2Uuc2VhcmNoKFwic2VhcmNoIEVSUk9SXCIsIHtpZDogXCJteWpvYl8xMjNcIn0sIGZ1bmN0aW9uKGVyciwgbmV3Sm9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiOiBuZXdKb2Iuc2lkKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiIGh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIGpvYjogYChlcnIsIGNyZWF0ZWRKb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgc2VhcmNoOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBuYW1lc3BhY2UsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24obmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmFtZXNwYWNlO1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBqb2JzID0gbmV3IHJvb3QuSm9icyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGpvYnMuc2VhcmNoKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGEgYEpvYmAgYnkgaXRzIHNpZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNpZCBUaGUgc2VhcmNoIElEIGZvciBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgY3JlYXRlZCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0Sm9iOiBmdW5jdGlvbihzaWQsIG5hbWVzcGFjZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBqb2IgPSBuZXcgcm9vdC5Kb2IodGhpcywgc2lkLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGpvYi5mZXRjaCh7fSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBvbmVzaG90IHNlYXJjaCBmcm9tIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2Uub25lc2hvdFNlYXJjaChcInNlYXJjaCBFUlJPUlwiLCB7aWQ6IFwibXlqb2JfMTIzXCJ9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJSRVNVTFQgRklFTERTXCI6IHJlc3VsdHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBzZWFyY2g6XG4gICAgICAgICAqICAgIC0gYG91dHB1dF9tb2RlYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIHJlc3VsdHMgKFhNTCwgSlNPTiwgb3IgQ1NWKS5cbiAgICAgICAgICogICAgLSBgZWFybGllc3RfdGltZWAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIHRoZSBlYXJsaWVzdCB0aW1lIGluIHRoZSB0aW1lIHJhbmdlIHRvIHNlYXJjaC4gVGhlIHRpbWUgc3RyaW5nIGNhbiBiZSBhIFVUQyB0aW1lICh3aXRoIGZyYWN0aW9uYWwgc2Vjb25kcyksIGEgcmVsYXRpdmUgdGltZSBzcGVjaWZpZXIgKHRvIG5vdyksIG9yIGEgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgICAgICAgKiAgICAtIGBsYXRlc3RfdGltZWAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIHRoZSBsYXRlc3QgdGltZSBpbiB0aGUgdGltZSByYW5nZSB0byBzZWFyY2guIFRoZSB0aW1lIHN0cmluZyBjYW4gYmUgYSBVVEMgdGltZSAod2l0aCBmcmFjdGlvbmFsIHNlY29uZHMpLCBhIHJlbGF0aXZlIHRpbWUgc3BlY2lmaWVyICh0byBub3cpLCBvciBhIGZvcm1hdHRlZCB0aW1lIHN0cmluZy5cbiAgICAgICAgICogICAgLSBgcmZgIChfc3RyaW5nXyk6IFNwZWNpZmllcyBvbmUgb3IgbW9yZSBmaWVsZHMgdG8gYWRkIHRvIHRoZSBzZWFyY2guXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoOiBgKGVyciwgcmVzdWx0cylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBvbmVzaG90U2VhcmNoOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBuYW1lc3BhY2UsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIHV0aWxzLmlzRnVuY3Rpb24obmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmFtZXNwYWNlO1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBqb2JzID0gbmV3IHJvb3QuSm9icyh0aGlzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGpvYnMub25lc2hvdFNlYXJjaChxdWVyeSwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdXNlciB0aGF0IGlzIGN1cnJlbnRseSBsb2dnZWQgaW4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5jdXJyZW50VXNlcihmdW5jdGlvbihlcnIsIHVzZXIpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJSZWFsIG5hbWU6IFwiLCB1c2VyLnByb3BlcnRpZXMoKS5yZWFsbmFtZSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSB1c2VyIGluc3RhbmNlOiBgKGVyciwgdXNlcilgLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLmN1cnJlbnRVc2VyfSBUaGUgYFVzZXJgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgYXV0aG9yaXphdGlvbi9jdXJyZW50LWNvbnRleHRcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBjdXJyZW50VXNlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMuZ2V0KFBhdGhzLmN1cnJlbnRVc2VyLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcm5hbWUgPSByZXNwb25zZS5kYXRhLmVudHJ5WzBdLmNvbnRlbnQudXNlcm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c2VyID0gbmV3IHJvb3QuVXNlcih0aGF0LCB1c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHVzZXIuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxLndhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5zZXJ2ZXJJbmZvKGZ1bmN0aW9uKGVyciwgaW5mbykge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNwbHVuayBWZXJzaW9uOiBcIiwgaW5mby5wcm9wZXJ0aWVzKCkudmVyc2lvbik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZXJ2ZXIgaW5mbzogYChlcnIsIGluZm8pYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlcnZlci9pbmZvXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZVxuICAgICAgICAgKi9cbiAgICAgICAgc2VydmVySW5mbzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHNlcnZlckluZm8gPSBuZXcgcm9vdC5TZXJ2ZXJJbmZvKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHNlcnZlckluZm8uZmV0Y2goY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBhIHNlYXJjaCBxdWVyeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLnBhcnNlKFwic2VhcmNoIGluZGV4PV9pbnRlcm5hbCB8IGhlYWQgMVwiLCBmdW5jdGlvbihlcnIsIHBhcnNlKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ29tbWFuZHM6IFwiLCBwYXJzZS5jb21tYW5kcyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5IHRvIHBhcnNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEFuIG9iamVjdCBvZiBvcHRpb25zIGZvciB0aGUgcGFyc2VyOlxuICAgICAgICAgKiAgICAtIGBlbmFibGVfbG9va3Vwc2AgKF9ib29sZWFuXyk6IElmIGB0cnVlYCwgcGVyZm9ybXMgcmV2ZXJzZSBsb29rdXBzIHRvIGV4cGFuZCB0aGUgc2VhcmNoIGV4cHJlc3Npb24uXG4gICAgICAgICAqICAgIC0gYG91dHB1dF9tb2RlYCAoX3N0cmluZ18pOiBUaGUgb3V0cHV0IGZvcm1hdCAoWE1MIG9yIEpTT04pLlxuICAgICAgICAgKiAgICAtIGBwYXJzZV9vbmx5YCAoX2Jvb2xlYW5fKTogSWYgYHRydWVgLCBkaXNhYmxlcyB0aGUgZXhwYW5zaW9uIG9mIHNlYXJjaCBkdWUgdG8gZXZhbHVhdGlvbiBvZiBzdWJzZWFyY2hlcywgdGltZSB0ZXJtIGV4cGFuc2lvbiwgbG9va3VwcywgdGFncywgZXZlbnR0eXBlcywgYW5kIHNvdXJjZXR5cGUgYWxpYXMuXG4gICAgICAgICAqICAgIC0gYHJlbG9hZF9tYWNyb3NgIChfYm9vbGVhbl8pOiBJZiBgdHJ1ZWAsIHJlbG9hZHMgbWFjcm8gZGVmaW5pdGlvbnMgZnJvbSBtYWNyb3MuY29uZi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHBhcnNlIGluZm86IGAoZXJyLCBwYXJzZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL3BhcnNlclxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXJhbXMucSA9IHF1ZXJ5O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoUGF0aHMucGFyc2VyLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm92aWRlcyBhdXRvLWNvbXBsZXRlIHN1Z2dlc3Rpb25zIGZvciBzZWFyY2ggcXVlcmllcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLnR5cGVhaGVhZChcImluZGV4PVwiLCAxMCwgZnVuY3Rpb24oZXJyLCBvcHRpb25zKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQXV0b2NvbXBsZXRpb24gb3B0aW9uczogXCIsIG9wdGlvbnMpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4IFRoZSBxdWVyeSBmcmFnbWVudCB0byBhdXRvY29tcGxldGUuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIG9wdGlvbnMgdG8gcmV0dXJuIChvcHRpb25hbCkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBhdXRvY29tcGxldGlvbiBpbmZvOiBgKGVyciwgb3B0aW9ucylgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL3R5cGVhaGVhZFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIHR5cGVhaGVhZDogZnVuY3Rpb24ocHJlZml4LCBjb3VudCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihjb3VudCkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNvdW50O1xuICAgICAgICAgICAgICAgIGNvdW50ID0gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgY291bnQ6IGNvdW50IHx8IDEwLFxuICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoUGF0aHMudHlwZWFoZWFkLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0cyA9IChyZXNwb25zZS5kYXRhIHx8IHt9KS5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzIHx8IFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2dzIGFuIGV2ZW50IHRvIFNwbHVuay5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICBzZXJ2aWNlLmxvZyhcIkEgbmV3IGV2ZW50XCIsIHtpbmRleDogXCJfaW50ZXJuYWxcIiwgc291cmNldHlwZTogXCJteXNvdXJjZXR5cGVcIn0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3VibWl0dGVkIGV2ZW50OiBcIiwgcmVzdWx0KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBldmVudCBUaGUgdGV4dCBmb3IgdGhpcyBldmVudCwgb3IgYSBKU09OIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcGFyYW1ldGVycyBmb3IgaW5kZXhpbmc6IFxuICAgICAgICAgKiAgICAtIGBpbmRleGAgKF9zdHJpbmdfKTogVGhlIGluZGV4IHRvIHNlbmQgZXZlbnRzIGZyb20gdGhpcyBpbnB1dCB0by5cbiAgICAgICAgICogICAgLSBgaG9zdGAgKF9zdHJpbmdfKTogVGhlIHZhbHVlIHRvIHBvcHVsYXRlIGluIHRoZSBIb3N0IGZpZWxkIGZvciBldmVudHMgZnJvbSB0aGlzIGRhdGEgaW5wdXQuIFxuICAgICAgICAgKiAgICAtIGBob3N0X3JlZ2V4YCAoX3N0cmluZ18pOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGV4dHJhY3QgdGhlIGhvc3QgdmFsdWUgZnJvbSBlYWNoIGV2ZW50LiBcbiAgICAgICAgICogICAgLSBgc291cmNlYCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIFNvdXJjZSBmaWVsZCBmb3IgZXZlbnRzIGZyb20gdGhpcyBkYXRhIGlucHV0LlxuICAgICAgICAgKiAgICAtIGBzb3VyY2V0eXBlYCAoX3N0cmluZ18pOiBUaGUgdmFsdWUgdG8gcG9wdWxhdGUgaW4gdGhlIFNvdXJjZXR5cGUgZmllbGQgZm9yIGV2ZW50cyBmcm9tIHRoaXMgZGF0YSBpbnB1dC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHN1Ym1pdHRlZDogYChlcnIsIHJlc3VsdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgcmVjZWl2ZXJzL3NpbXBsZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2VcbiAgICAgICAgICovXG4gICAgICAgIGxvZzogZnVuY3Rpb24oZXZlbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIGEgSlNPTiBvYmplY3QsIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcuXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy5wYXRocy5zdWJtaXRFdmVudDtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgIHZhciBoZWFkZXJzID0ge1wiQ29udGVudC1UeXBlXCI6IFwidGV4dC9wbGFpblwifTtcbiAgICAgICAgICAgIHZhciBib2R5ID0gZXZlbnQ7XG4gICAgICAgICAgICB2YXIgZ2V0ID0gcGFyYW1zO1xuICAgICAgICAgICAgdmFyIHBvc3QgPSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucmVxdWVzdChcbiAgICAgICAgICAgICAgICBwYXRoLCBcbiAgICAgICAgICAgICAgICBtZXRob2QsIFxuICAgICAgICAgICAgICAgIGdldCwgXG4gICAgICAgICAgICAgICAgcG9zdCwgXG4gICAgICAgICAgICAgICAgYm9keSwgXG4gICAgICAgICAgICAgICAgaGVhZGVycywgXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSBiYXNlIGRlZmluaXRpb24gZm9yIGEgU3BsdW5rIGVuZHBvaW50LCB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mXG4gICAgICogYSBzcGVjaWZpYyBzZXJ2aWNlIGFuZCBwYXRoLiBQcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBHRVQsIFBPU1QsIGFuZFxuICAgICAqIERFTEVURSBvcGVyYXRpb25zIHVzZWQgaW4gc3BsdW5ranMsIGF1dG9tYXRpY2FsbHkgcHJlcGFyaW5nIHRoZSBwYXRoIGNvcnJlY3RseVxuICAgICAqIGFuZCBhbGxvd2luZyBmb3IgcmVsYXRpdmUgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAqL1xuICAgIHJvb3QuRW5kcG9pbnQgPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1YWxpZmllZFBhdGggQSBmdWxseS1xdWFsaWZpZWQgcmVsYXRpdmUgZW5kcG9pbnQgcGF0aCAoZm9yIGV4YW1wbGUsIFwiL3NlcnZpY2VzL3NlYXJjaC9qb2JzXCIpLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgcXVhbGlmaWVkUGF0aCkge1xuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFzc2VkIGluIGEgbnVsbCBTZXJ2aWNlLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFxdWFsaWZpZWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFzc2VkIGluIGFuIGVtcHR5IHBhdGguXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICAgICAgdGhpcy5xdWFsaWZpZWRQYXRoID0gcXVhbGlmaWVkUGF0aDtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLmdldCAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5nZXQpO1xuICAgICAgICAgICAgdGhpcy5nZXRfdjIgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZ2V0X3YyKTtcbiAgICAgICAgICAgIHRoaXMucG9zdCAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnBvc3QpO1xuICAgICAgICAgICAgdGhpcy5kZWwgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGVsKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGVyZm9ybXMgYSByZWxhdGl2ZSBHRVQgcmVxdWVzdCBvbiBhbiBlbmRwb2ludCdzIHBhdGgsXG4gICAgICAgICAqIGNvbWJpbmVkIHdpdGggdGhlIHBhcmFtZXRlcnMgYW5kIGEgcmVsYXRpdmUgcGF0aCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gV2lsbCBtYWtlIGEgcmVxdWVzdCB0byB7c2VydmljZS5wcmVmaXh9L3NlYXJjaC9qb2JzLzEyMzQ1Ni9yZXN1bHRzP29mZnNldD0xXG4gICAgICAgICAqICAgICAgdmFyIGVuZHBvaW50ID0gbmV3IHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnQoc2VydmljZSwgXCJzZWFyY2gvam9icy8xMjM0NVwiKTtcbiAgICAgICAgICogICAgICBlbmRwb2ludC5nZXQoXCJyZXN1bHRzXCIsIHtvZmZzZXQ6IDF9LCBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coXCJET05FXCIpKX0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVscGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gYXBwZW5kIHRvIHRoZSBlbmRwb2ludCBwYXRoLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBlbnRpdHktc3BlY2lmaWMgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGU6IGAoZXJyLCByZXNwb25zZSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnRcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24ocmVscGF0aCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMucXVhbGlmaWVkUGF0aDtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGgsIHdlIHdpbGwgYXBwZW5kIGl0IHdpdGggYSBwcmVjZWRpbmdcbiAgICAgICAgICAgIC8vIHNsYXNoLlxuICAgICAgICAgICAgaWYgKHJlbHBhdGgpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBcIi9cIiArIHJlbHBhdGg7ICAgIFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldF92MjogZnVuY3Rpb24ocmVscGF0aCwgcGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0X3YyKFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIHJlbGF0aXZlIFBPU1QgcmVxdWVzdCBvbiBhbiBlbmRwb2ludCdzIHBhdGgsXG4gICAgICAgICAqIGNvbWJpbmVkIHdpdGggdGhlIHBhcmFtZXRlcnMgYW5kIGEgcmVsYXRpdmUgcGF0aCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgLy8gV2lsbCBtYWtlIGEgcmVxdWVzdCB0byB7c2VydmljZS5wcmVmaXh9L3NlYXJjaC9qb2JzLzEyMzQ1Ni9jb250cm9sXG4gICAgICAgICAqICAgICAgdmFyIGVuZHBvaW50ID0gbmV3IHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnQoc2VydmljZSwgXCJzZWFyY2gvam9icy8xMjM0NVwiKTtcbiAgICAgICAgICogICAgICBlbmRwb2ludC5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImNhbmNlbFwifSwgZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKFwiQ0FOQ0VMTEVEXCIpKX0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVscGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gYXBwZW5kIHRvIHRoZSBlbmRwb2ludCBwYXRoLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBlbnRpdHktc3BlY2lmaWMgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIGJvZHkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlOiBgKGVyciwgcmVzcG9uc2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBwb3N0OiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UucG9zdChcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIHJlbGF0aXZlIERFTEVURSByZXF1ZXN0IG9uIGFuIGVuZHBvaW50J3MgcGF0aCxcbiAgICAgICAgICogY29tYmluZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhbmQgYSByZWxhdGl2ZSBwYXRoIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAvLyBXaWxsIG1ha2UgYSByZXF1ZXN0IHRvIHtzZXJ2aWNlLnByZWZpeH0vc2VhcmNoL2pvYnMvMTIzNDU2XG4gICAgICAgICAqICAgICAgdmFyIGVuZHBvaW50ID0gbmV3IHNwbHVua2pzLlNlcnZpY2UuRW5kcG9pbnQoc2VydmljZSwgXCJzZWFyY2gvam9icy8xMjM0NVwiKTtcbiAgICAgICAgICogICAgICBlbmRwb2ludC5kZWxldGUoXCJcIiwge30sIGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhcIkRFTEVURURcIikpfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWxwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGVuZHBvaW50IHBhdGguXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIGVudGl0eS1zcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZTogYChlcnIsIHJlc3BvbnNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbmRwb2ludFxuICAgICAgICAgKi9cbiAgICAgICAgZGVsOiBmdW5jdGlvbihyZWxwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgd2Ugd2lsbCBhcHBlbmQgaXQgd2l0aCBhIHByZWNlZGluZ1xuICAgICAgICAgICAgLy8gc2xhc2guXG4gICAgICAgICAgICBpZiAocmVscGF0aCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybCArIFwiL1wiICsgcmVscGF0aDsgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsKFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGJhc2UgZGVmaW5pdGlvbiBmb3IgYSBTcGx1bmsgcmVzb3VyY2UgKGZvciBleGFtcGxlLCBhbiBlbnRpdHkgXG4gICAgICogc3VjaCBhcyBhbiBpbmRleCBvciBzZWFyY2ggam9iLCBvciBhIGNvbGxlY3Rpb24gb2YgZW50aXRpZXMpLiBQcm92aWRlcyBcbiAgICAgKiBiYXNpYyBtZXRob2RzIGZvciBoYW5kbGluZyBTcGx1bmsgcmVzb3VyY2VzLCBzdWNoIGFzIHZhbGlkYXRpb24gYW5kIFxuICAgICAqIGFjY2Vzc2luZyBwcm9wZXJ0aWVzLiBcbiAgICAgKlxuICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJlY2F1c2UgbW9zdCBtZXRob2RzIGFyZSBtZWFudCB0byBiZSBvdmVycmlkZGVuLlxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVuZHBvaW50XG4gICAgICovXG4gICAgcm9vdC5SZXNvdXJjZSA9IHJvb3QuRW5kcG9pbnQuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEEgcmVsYXRpdmUgZW5kcG9pbnQgcGF0aCAoZm9yIGV4YW1wbGUsIFwic2VhcmNoL2pvYnNcIikuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgcGF0aCwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB2YXIgZnVsbHBhdGggPSBzZXJ2aWNlLmZ1bGxwYXRoKHBhdGgsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIGZ1bGxwYXRoKTtcbiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLl9sb2FkICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLl9sb2FkKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2ggICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmV0Y2gpO1xuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wYXRoICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUmVzb3VyY2VcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTVVTVCBCRSBPVkVSUklEREVOXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSByZXNvdXJjZSBhbmQgc3RvcmVzIHRoZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIF9sb2FkOiBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gcHJvcGVydGllcyB8fCB7fTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWZyZXNoZXMgdGhlIHJlc291cmNlIGJ5IGZldGNoaW5nIHRoZSBvYmplY3QgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAqIGFuZCBsb2FkaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJldHJpZXZlZDogYChlcnIsIHJlc291cmNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1VU1QgQkUgT1ZFUlJJRERFTlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgcHJvcGVydGllcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgcHJvcGVydGllcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBwcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBmdWxsIHN0YXRlIChwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSkgb2YgdGhpcyByZXNvdXJjZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY3VycmVudCBmdWxsIHN0YXRlIG9mIHRoaXMgcmVzb3VyY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGEgU3BsdW5rIGVudGl0eSwgd2hpY2ggaXMgYSB3ZWxsLWRlZmluZWQgY29uc3RydWN0XG4gICAgICogd2l0aCBjZXJ0YWluIG9wZXJhdGlvbnMgKHN1Y2ggYXMgXCJwcm9wZXJ0aWVzXCIsIFwidXBkYXRlXCIsIGFuZCBcImRlbGV0ZVwiKS4gXG4gICAgICogRW50aXRpZXMgaW5jbHVkZSBzZWFyY2ggam9icywgaW5kZXhlcywgaW5wdXRzLCBhcHBzLCBhbmQgbW9yZS4gXG4gICAgICpcbiAgICAgKiBQcm92aWRlcyBiYXNpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggU3BsdW5rIGVudGl0aWVzLCBzdWNoIGFzIGZldGNoaW5nIGFuZFxuICAgICAqIHVwZGF0aW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLlJlc291cmNlXG4gICAgICovXG4gICAgcm9vdC5FbnRpdHkgPSByb290LlJlc291cmNlLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHN0YXRpYyBwcm9wZXJ0eSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBcbiAgICAgICAgICogdXBkYXRlIHRvIGdldCB0aGUgdXBkYXRlZCBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IFxuICAgICAgICAgKiBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnMgKGVjaG9lcykgdGhlIHVwZGF0ZWQgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBmZXRjaE9uVXBkYXRlOiBmYWxzZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRW50aXR5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggQSByZWxhdGl2ZSBlbmRwb2ludCBwYXRoIChmb3IgZXhhbXBsZSwgXCJzZWFyY2gvam9ic1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRW50aXR5fSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5FbnRpdHlgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBwYXRoLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFdlIHBlcmZvcm0gdGhlIGJpbmRpbmdzIHNvIHRoYXQgZXZlcnkgZnVuY3Rpb24gd29ya3MgXG4gICAgICAgICAgICAvLyBwcm9wZXJseSB3aGVuIGl0IGlzIHBhc3NlZCBhcyBhIGNhbGxiYWNrLlxuICAgICAgICAgICAgdGhpcy5fbG9hZCAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuX2xvYWQpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaCAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZmV0Y2gpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnVwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkcyAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5maWVsZHMpO1xuICAgICAgICAgICAgdGhpcy5saW5rcyAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMubGlua3MpO1xuICAgICAgICAgICAgdGhpcy5hY2wgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuYWNsKTtcbiAgICAgICAgICAgIHRoaXMuYXV0aG9yICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmF1dGhvcik7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZWQgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGVkKTtcbiAgICAgICAgICAgIHRoaXMucHVibGlzaGVkID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnB1Ymxpc2hlZCk7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZSAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5lbmFibGUpO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZGlzYWJsZSk7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZCAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5yZWxvYWQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fZmllbGRzICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fYWNsICAgICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICA9IHt9O1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBlbnRpdHkgYW5kIHN0b3JlcyB0aGUgcHJvcGVydGllcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIF9sb2FkOiBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gdXRpbHMuaXNBcnJheShwcm9wZXJ0aWVzKSA/IHByb3BlcnRpZXNbMF0gOiBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIHRvXG4gICAgICAgICAgICAvLyBlbXB0eSB2YWx1ZXNcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB7fSxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICAgICAgICAgIGFjbDoge30sXG4gICAgICAgICAgICAgICAgbGlua3M6IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9zdXBlcihwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGFrZSBvdXQgdGhlIGVudGl0eS1zcGVjaWZpYyBjb250ZW50XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcy5jb250ZW50ICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl9maWVsZHMgICAgID0gcHJvcGVydGllcy5maWVsZHMgICAgfHwgdGhpcy5fZmllbGRzIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fYWNsICAgICAgICA9IHByb3BlcnRpZXMuYWNsICAgICAgIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fbGlua3MgICAgICA9IHByb3BlcnRpZXMubGlua3MgICAgIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fYXV0aG9yICAgICA9IHByb3BlcnRpZXMuYXV0aG9yICAgIHx8IG51bGw7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVkICAgID0gcHJvcGVydGllcy51cGRhdGVkICAgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2hlZCAgPSBwcm9wZXJ0aWVzLnB1Ymxpc2hlZCB8fCBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGRzIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eSwgaW5kaWNhdGluZyB3aGljaCBcbiAgICAgICAgICogZmllbGRzIGFyZSB3aWxkY2FyZHMsIHJlcXVpcmVkLCBhbmQgb3B0aW9uYWwuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZpZWxkcyBpbmZvcm1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgZmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IChBQ0wpIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eSxcbiAgICAgICAgICogd2hpY2ggY29udGFpbnMgdGhlIHBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgdGhlIGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgQUNMLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBhY2w6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjbDtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpbmtzIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGl0eSwgd2hpY2ggaXMgdGhlIFVSSSBvZlxuICAgICAgICAgKiB0aGUgZW50aXR5IHJlbGF0aXZlIHRvIHRoZSBtYW5hZ2VtZW50IHBvcnQgb2YgYSBTcGx1bmsgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGxpbmtzIGluZm9ybWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGlua3M7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBhdXRob3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBhdXRob3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGF1dGhvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgdXBkYXRlZCB0aW1lIGZvciB0aGlzIGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgdXBkYXRlZCB0aW1lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgcHVibGlzaGVkIHRpbWUgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBwdWJsaXNoZWQgdGltZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgcHVibGlzaGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVmcmVzaGVzIHRoZSBlbnRpdHkgYnkgZmV0Y2hpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIFxuICAgICAgICAgKiBsb2FkaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvcHRpb25hbCBkaWN0aW9uYXJ5IG9mIGNvbGxlY3Rpb24gZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uIG9wdGlvbnM6XG4gICAgICAgICAqICAgIC0gYGNvdW50YCAoX2ludGVnZXJfKTogVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAgICAgICAgICogICAgLSBgb2Zmc2V0YCAoX2ludGVnZXJfKTogVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgaXRlbSB0byByZXR1cm4uXG4gICAgICAgICAqICAgIC0gYHNlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBxdWVyeSB0byBmaWx0ZXIgcmVzcG9uc2VzLlxuICAgICAgICAgKiAgICAtIGBzb3J0X2RpcmAgKF9zdHJpbmdfKTogVGhlIGRpcmVjdGlvbiB0byBzb3J0IHJldHVybmVkIGl0ZW1zOiDigJxhc2PigJ0gb3Ig4oCcZGVzY+KAnS5cbiAgICAgICAgICogICAgLSBgc29ydF9rZXlgIChfc3RyaW5nXyk6IFRoZSBmaWVsZCB0byB1c2UgZm9yIHNvcnRpbmcgKG9wdGlvbmFsKS5cbiAgICAgICAgICogICAgLSBgc29ydF9tb2RlYCAoX3N0cmluZ18pOiBUaGUgY29sbGF0aW5nIHNlcXVlbmNlIGZvciBzb3J0aW5nIHJldHVybmVkIGl0ZW1zOiDigJxhdXRv4oCdLCDigJxhbHBoYeKAnSwg4oCcYWxwaGFfY2FzZeKAnSwgb3Ig4oCcbnVt4oCdLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJldHJpZXZlZDogYChlcnIsIHJlc291cmNlKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcIlwiLCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuZGF0YSA/IHJlc3BvbnNlLmRhdGEuZW50cnkgOiBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogRGVsZXRlcyB0aGUgZW50aXR5IGZyb20gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkOiBgKGVycilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsKFwiXCIsIHt9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgZW50aXR5IG9uIHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyB0byB1cGRhdGUgdGhlIG9iamVjdCB3aXRoLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQ6IGAoZXJyLCBlbnRpdHkpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb3BzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCAnbmFtZScgZmllbGQgaW4gJ3VwZGF0ZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJcIiwgcHJvcHMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVyciAmJiAhdGhhdC5mZXRjaE9uVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2xvYWQocmVzcG9uc2UuZGF0YS5lbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFlcnIgJiYgdGhhdC5mZXRjaE9uVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZmV0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxLndhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERpc2FibGVzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBkaXNhYmxlZDogYChlcnIsIGVudGl0eSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMucG9zdChcImRpc2FibGVcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBlbmFibGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnBvc3QoXCJlbmFibGVcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxvYWRzIHRoZSBlbnRpdHkgb24gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyByZWxvYWRlZDogYChlcnIsIGVudGl0eSlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHJlbG9hZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5wb3N0KFwiX3JlbG9hZFwiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgYmFzZSBjbGFzcyBmb3IgYSBTcGx1bmsgY29sbGVjdGlvbiwgd2hpY2ggaXMgYSB3ZWxsLWRlZmluZWQgY29uc3RydWN0XG4gICAgICogdGhhdCBwcm92aWRlcyBiYXNpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggY29sbGVjdGlvbnMgb2YgZW50aXRpZXMsIHN1Y2ggYXMgXG4gICAgICogY3JlYXRpbmcgYW5kIGxpc3RpbmcgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5SZXNvdXJjZVxuICAgICAqL1xuICAgIHJvb3QuQ29sbGVjdGlvbiA9IHJvb3QuUmVzb3VyY2UuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc3RhdGljIHByb3BlcnR5IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIFxuICAgICAgICAgKiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgZmV0Y2hlZCBcbiAgICAgICAgICogYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJucyAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cblxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiBmYWxzZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEEgcmVsYXRpdmUgZW5kcG9pbnQgcGF0aCAoZm9yIGV4YW1wbGUsIFwic2VhcmNoL2pvYnNcIikuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb259IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25gIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi8gICAgIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBwYXRoLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHBhdGgsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFdlIHBlcmZvcm0gdGhlIGJpbmRpbmdzIHNvIHRoYXQgZXZlcnkgZnVuY3Rpb24gd29ya3MgXG4gICAgICAgICAgICAvLyBwcm9wZXJseSB3aGVuIGl0IGlzIHBhc3NlZCBhcyBhIGNhbGxiYWNrLlxuICAgICAgICAgICAgdGhpcy5fbG9hZCAgICAgICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5fbG9hZCk7XG4gICAgICAgICAgICB0aGlzLmZldGNoICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZldGNoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY3JlYXRlKTtcbiAgICAgICAgICAgIHRoaXMubGlzdCAgICAgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMubGlzdCk7XG4gICAgICAgICAgICB0aGlzLml0ZW0gICAgICAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLml0ZW0pO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5pbnN0YW50aWF0ZUVudGl0eSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG4gICAgICAgICAgICB0aGlzLl9lbnRpdGllcyAgICAgICA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZW50aXRpZXNCeU5hbWUgPSB7fTsgICAgXG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzICAgICA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5nICAgICAgICAgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2xpbmtzICAgICAgICAgID0ge307IFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBlbnRpdHkuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgZW50aXR5LlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eX0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRW50aXR5YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTVVTVCBCRSBPVkVSUklEREVOXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBjb2xsZWN0aW9uIGFuZCBwcm9wZXJ0aWVzLCBhbmQgY3JlYXRlcyBhIG1hcCBvZiBlbnRpdHlcbiAgICAgICAgICogbmFtZXMgdG8gZW50aXR5IElEcyAoZm9yIHJldHJpZXZhbCBwdXJwb3NlcykuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfbG9hZDogZnVuY3Rpb24ocHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIocHJvcGVydGllcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGVudGl0aWVzQnlOYW1lID0ge307XG4gICAgICAgICAgICB2YXIgZW50aXR5UHJvcGVydHlMaXN0ID0gcHJvcGVydGllcy5lbnRyeSB8fCBbXTtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbnRpdHlQcm9wZXJ0eUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBlbnRpdHlQcm9wZXJ0eUxpc3RbaV07XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IHRoaXMuaW5zdGFudGlhdGVFbnRpdHkocHJvcHMpO1xuICAgICAgICAgICAgICAgIGVudGl0eS5fbG9hZChwcm9wcyk7XG4gICAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChlbnRpdGllc0J5TmFtZS5oYXNPd25Qcm9wZXJ0eShlbnRpdHkubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNCeU5hbWVbZW50aXR5Lm5hbWVdLnB1c2goZW50aXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzQnlOYW1lW2VudGl0eS5uYW1lXSA9IFtlbnRpdHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzICAgICAgID0gZW50aXRpZXM7XG4gICAgICAgICAgICB0aGlzLl9lbnRpdGllc0J5TmFtZSA9IGVudGl0aWVzQnlOYW1lO1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5nICAgICAgICAgPSBwcm9wZXJ0aWVzLnBhZ2luZyAgICB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX2xpbmtzICAgICAgICAgID0gcHJvcGVydGllcy5saW5rcyAgICAgfHwge307XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVkICAgICAgICA9IHByb3BlcnRpZXMudXBkYXRlZCAgIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBsaW5rcyBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb2xsZWN0aW9uLCB3aGljaCBpcyB0aGUgVVJJIG9mXG4gICAgICAgICAqIHRoZSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgbWFuYWdlbWVudCBwb3J0IG9mIGEgU3BsdW5rIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBsaW5rcyBpbmZvcm1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5rcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGF1dGhvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBhdXRob3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwYWdpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHVwZGF0ZWQgdGltZSBmb3IgdGhpcyBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1cGRhdGVkIHRpbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlZnJlc2hlcyB0aGUgcmVzb3VyY2UgYnkgZmV0Y2hpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIFxuICAgICAgICAgKiBsb2FkaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgY291bnRgIChfaW50ZWdlcl8pOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLlxuICAgICAgICAgKiAgICAtIGBvZmZzZXRgIChfaW50ZWdlcl8pOiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtIHRvIHJldHVybi5cbiAgICAgICAgICogICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHRvIGZpbHRlciByZXNwb25zZXMuXG4gICAgICAgICAqICAgIC0gYHNvcnRfZGlyYCAoX3N0cmluZ18pOiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgcmV0dXJuZWQgaXRlbXM6IOKAnGFzY+KAnSBvciDigJxkZXNj4oCdLlxuICAgICAgICAgKiAgICAtIGBzb3J0X2tleWAgKF9zdHJpbmdfKTogVGhlIGZpZWxkIHRvIHVzZSBmb3Igc29ydGluZyAob3B0aW9uYWwpLlxuICAgICAgICAgKiAgICAtIGBzb3J0X21vZGVgIChfc3RyaW5nXyk6IFRoZSBjb2xsYXRpbmcgc2VxdWVuY2UgZm9yIHNvcnRpbmcgcmV0dXJuZWQgaXRlbXM6IOKAnGF1dG/igJ0sIOKAnGFscGhh4oCdLCDigJxhbHBoYV9jYXNl4oCdLCBvciDigJxudW3igJ0uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmV0cmlldmVkOiBgKGVyciwgcmVzb3VyY2UpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGZldGNoOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoYXQuZ2V0KFwiXCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9sb2FkKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcblxuICAgICAgICBmZXRjaF92MjogYXN5bmMgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgdGhhdC5nZXRfdjIoXCJcIiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAvLyByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB0aGF0Ll9sb2FkKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHNwZWNpZmljIGVudGl0eSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHBzID0gc2VydmljZS5hcHBzKCk7XG4gICAgICAgICAqICAgICAgYXBwcy5mZXRjaChmdW5jdGlvbihlcnIsIGFwcHMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIGFwcCA9IGFwcHMuaXRlbShcInNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTZWFyY2ggQXBwIEZvdW5kOiBcIiArICEhYXBwKTtcbiAgICAgICAgICogICAgICAgICAgLy8gYGFwcGAgaXMgYW4gQXBwbGljYXRpb24gb2JqZWN0LlxuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0byByZXRyaWV2ZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSB3aWxkY2FyZCB2YWx1ZSBcIi1cIiwgaXMgbm90IGFjY2VwdGFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGVudGl0eS5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSB3aWxkY2FyZCB2YWx1ZSBcIi1cIiBpcyB1bmFjY2VwdGFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGVudGl0eS5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybnMge3NwbHVua2pzLlNlcnZpY2UuRW50aXR5fSBUaGUgZW50aXR5LCBvciBgbnVsbGAgaWYgb25lIGlzIG5vdCBmb3VuZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW06IGZ1bmN0aW9uKGlkLCBuYW1lc3BhY2UpIHsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNFbXB0eShuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gbnVsbDtcbiAgICAgICAgICAgIH0gICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHN1cGx5IGEgbm9uLWVtcHR5IG5hbWUuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmFtZXNwYWNlICYmIChuYW1lc3BhY2UuYXBwID09PSAnLScgfHwgbmFtZXNwYWNlLm93bmVyID09PSAnLScpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2hlbiBzZWFyY2hpbmcgZm9yIGFuIGVudGl0eSwgd2lsZGNhcmRzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgbmFtZXNwYWNlLiBQbGVhc2UgcmVmaW5lIHlvdXIgc2VhcmNoLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGZ1bGxQYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnRpdGllc0J5TmFtZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXRpZXMgPSB0aGlzLl9lbnRpdGllc0J5TmFtZVtpZF07ICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAxICYmICFuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgZW50aXR5IHdpdGggdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBuYW1lIGFuZCB0aGUgdXNlciBkaWQgbm90XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZnkgYSBuYW1lc3BhY2UsIHRoZW4gd2UganVzdFxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0aWVzWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDEgJiYgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHNwZWNpZmllZCBhIG5hbWVzcGFjZSwgdGhlbiB3ZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSByZXR1cm4gdGhlIGVudGl0eSBpZiBpdCBtYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdWxsIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZnVsbFBhdGggPSB0aGlzLnNlcnZpY2UuZnVsbHBhdGgoZW50aXRpZXNbMF0ucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXRpZXNbMF0ucXVhbGlmaWVkUGF0aCA9PT0gZnVsbFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdGllc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudGl0aWVzLmxlbmd0aCA+IDEgJiYgIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGVudGl0eSBhbmQgd2UgZGlkbid0XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZnkgYSBuYW1lc3BhY2UsIHRoZW4gd2UgcmV0dXJuIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHNheWluZyB0aGUgbWF0Y2ggaXMgYW1iaWd1b3VzXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFtYmlndW91cyBtYXRjaCBmb3IgbmFtZSAnXCIgKyBpZCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZW50aXR5LCBhbmQgd2UgZG8gaGF2ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIG5hbWVzcGFjZSwgc28gd2UgdHJ5IGFuZCBmaW5kIGl0XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbnRpdGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFBhdGggPSB0aGlzLnNlcnZpY2UuZnVsbHBhdGgoZW50aXRpZXNbaV0ucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5xdWFsaWZpZWRQYXRoID09PSBmdWxsUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gZW50aXR5IG9uIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgY29sbGVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWRcbiAgICAgICAgICogcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgYXBwcyA9IHNlcnZpY2UuYXBwcygpO1xuICAgICAgICAgKiAgICAgIGFwcHMuY3JlYXRlKHtuYW1lOiBcIk5ld1NlYXJjaEFwcFwifSwgZnVuY3Rpb24oZXJyLCBuZXdBcHApIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBlbnRpdHktc3BlY2lmaWMgcHJvcGVydGllcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZTogYChlcnIsIHJlc3BvbnNlKWAuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgYHNwbHVua2pzLlNlcnZpY2UuRW50aXR5YCBvYmplY3RzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiXCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHJlc3BvbnNlLmRhdGEuZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlscy5pc0FycmF5KHByb3BzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBwcm9wc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IHRoYXQuaW5zdGFudGlhdGVFbnRpdHkocHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHkuX2xvYWQocHJvcHMpOyBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LmZldGNoT25FbnRpdHlDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LmZldGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgZW50aXRpZXMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGFwcHMgPSBzZXJ2aWNlLmFwcHMoKTtcbiAgICAgICAgICogICAgICBhcHBzLmZldGNoKGZ1bmN0aW9uKGVyciwgYXBwcykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgYXBwTGlzdCA9IGFwcHMubGlzdCgpO1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhhcHBMaXN0Lmxlbmd0aCk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBsaXN0IG9mIGVudGl0aWVzOiBgKGVyciwgbGlzdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbGlzdDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmNsb25lKHRoaXMuX2VudGl0aWVzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBzYXZlZCBzZWFyY2gsIHdoaWNoIHlvdSBjYW4gdGhlbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzYXZlZC9zZWFyY2hlcy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5TYXZlZFNlYXJjaCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnNhdmVkU2VhcmNoZXMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IHNhdmVkIHNlYXJjaC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2h9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmFja25vd2xlZGdlICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5hY2tub3dsZWRnZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5kaXNwYXRjaCk7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5oaXN0b3J5KTtcbiAgICAgICAgICAgIHRoaXMuc3VwcHJlc3NJbmZvID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnN1cHByZXNzSW5mbyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGNvdW50IG9mIHRyaWdnZXJlZCBhbGVydHMgZm9yIHRoaXMgc2F2ZWRTZWFyY2gsXG4gICAgICAgICAqIGRlZmF1bHRpbmcgdG8gMCB3aGVuIHVuZGVmaW5lZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICB2YXIgYWxlcnRDb3VudCA9IHNhdmVkU2VhcmNoLmFsZXJ0Q291bnQoKTtcbiAgICAgICAgICogXG4gICAgICAgICAqIEByZXR1cm4ge051bWJlcn0gVGhlIGNvdW50IG9mIHRyaWdnZXJlZCBhbGVydHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgYWxlcnRDb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5wcm9wZXJ0aWVzKCkudHJpZ2dlcmVkX2FsZXJ0X2NvdW50LCAxMCkgfHwgMDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWNrbm93bGVkZ2VzIHRoZSBzdXBwcmVzc2lvbiBvZiB0aGUgYWxlcnRzIGZyb20gYSBzYXZlZCBzZWFyY2ggYW5kXG4gICAgICAgICAqIHJlc3VtZXMgYWxlcnRpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIHNhdmVkU2VhcmNoID0gc2VydmljZS5zYXZlZFNlYXJjaGVzKCkuaXRlbShcIk15U2F2ZWRTZWFyY2hcIik7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2guYWNrbm93bGVkZ2UoZnVuY3Rpb24oZXJyLCBzZWFyY2gpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJBQ0tOT1dMRURHRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzYXZlZCBzZWFyY2ggaXMgYWNrbm93bGVkZ2VkOiBgKGVyciwgc2F2ZWRTZWFyY2gpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfS9hY2tub3dsZWRnZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIGFja25vd2xlZGdlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiYWNrbm93bGVkZ2VcIiwge30sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNwYXRjaGVzIGEgc2F2ZWQgc2VhcmNoLCB3aGljaCBjcmVhdGVzIGEgc2VhcmNoIGpvYiBhbmQgcmV0dXJucyBhIFxuICAgICAgICAgKiBgc3BsdW5ranMuU2VydmljZS5Kb2JgIGluc3RhbmNlIGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgc2F2ZWRTZWFyY2ggPSBzZXJ2aWNlLnNhdmVkU2VhcmNoZXMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICogICAgICBzYXZlZFNlYXJjaC5kaXNwYXRjaCh7Zm9yY2VfZGlzcGF0Y2g6IGZhbHNlfSwgZnVuY3Rpb24oZXJyLCBqb2IsIHNhdmVkU2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSm9iIFNJRDogXCIsIGpvYi5zaWQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgZGlzcGF0Y2hpbmcgdGhpcyBzYXZlZCBzZWFyY2g6XG4gICAgICAgICAqICAgIC0gYGRpc3BhdGNoLm5vd2AgKF9zdHJpbmdfKTogVGhlIHRpbWUgdGhhdCBpcyB1c2VkIHRvIGRpc3BhdGNoIHRoZSBzZWFyY2ggYXMgdGhvdWdoIHRoZSBzcGVjaWZpZWQgdGltZSB3ZXJlIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICAgICAqICAgIC0gYGRpc3BhdGNoLipgIChfc3RyaW5nXyk6IE92ZXJ3cml0ZXMgdGhlIHZhbHVlIG9mIHRoZSBzZWFyY2ggZmllbGQgc3BlY2lmaWVkIGluICouXG4gICAgICAgICAqICAgIC0gYHRyaWdnZXJfYWN0aW9uc2AgKF9ib29sZWFuXyk6IEluZGljYXRlcyB3aGV0aGVyIHRvIHRyaWdnZXIgYWxlcnQgYWN0aW9ucy5cbiAgICAgICAgICogICAgLSBgZm9yY2VfZGlzcGF0Y2hgIChfYm9vbGVhbl8pOiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdGFydCBhIG5ldyBzZWFyY2ggaWYgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGlzIHNlYXJjaCBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzYXZlZCBzZWFyY2ggaXMgZGlzcGF0Y2hlZDogYChlcnIsIGpvYiwgc2F2ZWRTZWFyY2gpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfS9kaXNwYXRjaFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hcbiAgICAgICAgICovXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJkaXNwYXRjaFwiLCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBzaWQgPSByZXNwb25zZS5kYXRhLnNpZDtcbiAgICAgICAgICAgICAgICB2YXIgam9iID0gbmV3IHJvb3QuSm9iKHRoYXQuc2VydmljZSwgc2lkLCB0aGF0Lm5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgam9iLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogR2V0cyB0aGUgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwYCBmb3IgZmlyZWRBbGVydHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2F2ZWQgc2VhcmNoLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhbGVydHMgPSBzZXJ2aWNlLmZpcmVkQWxlcnRHcm91cHMoKS5pdGVtKFwiTXlTYXZlZFNlYXJjaFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXB9IEFuIEFsZXJ0R3JvdXAgb2JqZWN0IHdpdGggdGhlXG4gICAgICAgICAqIHNhbWUgbmFtZSBhcyB0aGlzIFNhdmVkU2VhcmNoIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoXG4gICAgICAgICAqL1xuICAgICAgICBmaXJlZEFsZXJ0R3JvdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkZpcmVkQWxlcnRHcm91cCh0aGlzLnNlcnZpY2UsIHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgam9iIGhpc3RvcnkgZm9yIGEgc2F2ZWQgc2VhcmNoLCB3aGljaCBpcyBhIGxpc3Qgb2YgXG4gICAgICAgICAqIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBzYXZlZFNlYXJjaCA9IHNlcnZpY2Uuc2F2ZWRTZWFyY2hlcygpLml0ZW0oXCJNeVNhdmVkU2VhcmNoXCIpO1xuICAgICAgICAgKiAgICAgIHNhdmVkU2VhcmNoLmhpc3Rvcnkoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgam9icywgc2VhcmNoKSB7XG4gICAgICAgICAqICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkpvYlwiLCBpLCBcIjpcIiwgam9ic1tpXS5zaWQpO1xuICAgICAgICAgKiAgICAgICAgICB9XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZm9yIHJldHJpZXZpbmcgaGlzdG9yeS4gRm9yIGEgZnVsbCBsaXN0LCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay84LjAuMi9SRVNUUkVGL1JFU1Rwcm9sb2cjUGFnaW5hdGlvbl9hbmRfZmlsdGVyaW5nX3BhcmFtZXRlcnNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5QYWdpbmF0aW9uIGFuZCBGaWx0ZXJpbmcgb3B0aW9uczwvYT4gaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBoaXN0b3J5IGlzIHJldHJpZXZlZDogYChlcnIsIGpvYiwgc2F2ZWRTZWFyY2gpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNhdmVkL3NlYXJjaGVzL3tuYW1lfS9oaXN0b3J5XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgaGlzdG9yeTogZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJoaXN0b3J5XCIsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIGpvYnMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnkgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpvYkRhdGEgPSByZXNwb25zZS5kYXRhLmVudHJ5W2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMoam9iRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqb2IgPSBuZXcgcm9vdC5Kb2IodGhhdC5zZXJ2aWNlLCBqb2JEYXRhLm5hbWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBqb2IuX2xvYWQoam9iRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBqb2JzLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgYSBzYXZlZCBzZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIHNhdmVkU2VhcmNoID0gc2VydmljZS5zYXZlZFNlYXJjaGVzKCkuaXRlbShcIk15U2F2ZWRTZWFyY2hcIik7XG4gICAgICAgICAqICAgICAgc2F2ZWRTZWFyY2guaGlzdG9yeShmdW5jdGlvbihlcnIsIHN1cHByZXNzaW9uU3RhdGUsIHNlYXJjaCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNUQVRFOiBcIiwgc3VwcHJlc3Npb25TdGF0ZSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBpcyByZXRyaWV2ZWQ6IGAoZXJyLCBzdXBwcmVzc2lvblN0YXRlLCBzYXZlZFNlYXJjaClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXMve25hbWV9L3N1cHByZXNzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgc3VwcHJlc3NJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJzdXBwcmVzc1wiLCB7fSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UuZGF0YS5lbnRyeS5jb250ZW50LCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIHNhdmVkIHNlYXJjaCBvbiB0aGUgc2VydmVyLiBcbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoZSBzZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQsIGV2ZW4gd2hlbiBpdCBpc24ndCBiZWluZyBtb2RpZmllZC5cbiAgICAgICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgaXQsIHRoaXMgbWV0aG9kIHdpbGwgZmV0Y2ggdGhlIHNlYXJjaCBzdHJpbmcgZnJvbVxuICAgICAgICAgKiB0aGUgc2VydmVyIG9yIGZyb20gdGhlIGxvY2FsIGNhY2hlLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB0aGUgc2F2ZWQgc2VhcmNoIHdpdGguIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzYXZlZHNlYXJjaHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNhdmVkIHNlYXJjaCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyB1cGRhdGVkOiBgKGVyciwgZW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaFxuICAgICAgICAgKi9cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGUgPSB0aGlzLl9zdXBlcjtcbiAgICAgICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5mZXRjaChmdW5jdGlvbihlcnIsIHNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IHNlYXJjaC5wcm9wZXJ0aWVzKCkuc2VhcmNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLmNhbGwoc2VhcmNoLCBwYXJhbXMsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0ZWQsIHNvIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBzYXZlZCBzZWFyY2hlcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgc2F2ZWQgXG4gICAgICogc2VhcmNoZXMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgc2F2ZWQgc2VhcmNoLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgc2F2ZWQvc2VhcmNoZXNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovXG4gICAgcm9vdC5TYXZlZFNlYXJjaGVzID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuc2F2ZWRTZWFyY2hlcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgYSBzYXZlZCBzZWFyY2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBzYXZlZCBzZWFyY2guIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzYXZlZHNlYXJjaHBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNhdmVkIHNlYXJjaCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlNhdmVkU2VhcmNoKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuU2F2ZWRTZWFyY2hlc2AuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaGVzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlNhdmVkU2VhcmNoZXNcbiAgICAgICAgICovICAgICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIHN0b3JhZ2UgcGFzc3dvcmQsIHdoaWNoIHlvdSBjYW4gdGhlbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzdG9yYWdlL3Bhc3N3b3Jkcy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuU3RvcmFnZVBhc3N3b3JkID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5zdG9yYWdlUGFzc3dvcmRzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IHN0b3JhZ2UgcGFzc3dvcmQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBzdG9yYWdlIHBhc3N3b3Jkcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgc3RvcmFnZSBcbiAgICAgKiBwYXNzd29yZHMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgc3RvcmFnZSBwYXNzd29yZC5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzdG9yYWdlL3Bhc3N3b3Jkc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICByb290LlN0b3JhZ2VQYXNzd29yZHMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC4gQnkgXG4gICAgICAgICAqIGRlZmF1bHQsIHRoZSBlbnRpdHkgaXMgbm90IGZldGNoZWQgYmVjYXVzZSB0aGUgZW5kcG9pbnQgcmV0dXJuc1xuICAgICAgICAgKiAoZWNob2VzKSB0aGUgbmV3IGVudGl0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25FbnRpdHlDcmVhdGlvbjogdHJ1ZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnN0b3JhZ2VQYXNzd29yZHM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgc3RvcmFnZSBwYXNzd29yZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHN0b3JhZ2UgcGFzc3dvcmQuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsXG4gICAgICAgICAqIHNlZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUYWNjZXNzI1BPU1Rfc3RvcmFnZS4yRnBhc3N3b3Jkc1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgKiBQT1NUIHN0b3JhZ2UvcGFzc3dvcmRzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5TYXZlZFNlYXJjaH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3JkYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5TdG9yYWdlUGFzc3dvcmQodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5TdG9yYWdlUGFzc3dvcmRzYC4gXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlN0b3JhZ2VQYXNzd29yZHNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU3RvcmFnZVBhc3N3b3Jkc1xuICAgICAgICAgKi8gICAgIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZmlyZWQgYWxlcnQuIFxuICAgICAqIFlvdSBjYW4gcmV0cmlldmUgc2V2ZXJhbCBvZiB0aGUgZmlyZWQgYWxlcnQncyBwcm9wZXJ0aWVzIGJ5XG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gbmFtZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhbGVydHMvZmlyZWRfYWxlcnRzL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuRmlyZWRBbGVydCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuZmlyZWRBbGVydHMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyBhY3Rpb25zIChzdWNoIGFzIG5vdGlmeWluZyBieSBlbWFpbCwgcnVubmluZyBhIFxuICAgICAgICAgKiBzY3JpcHQsIGFkZGluZyB0byBSU1MsIHRyYWNraW5nIGluIEFsZXJ0IE1hbmFnZXIsIGFuZCBlbmFibGluZyBcbiAgICAgICAgICogc3VtbWFyeSBpbmRleGluZykuIFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gb2YgYWN0aW9ucywgYW4gZW1wdHkge0FycmF5fSBpZiBubyBhY3Rpb25zXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBhY3Rpb25zOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS5hY3Rpb25zIHx8IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyB0eXBlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBhbGVydCdzIHR5cGUuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBhbGVydFR5cGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLmFsZXJ0X3R5cGUgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBhIHNldCBvZiBldmVudHMgKGRpZ2VzdCkgb3IgYSBzaW5nbGVcbiAgICAgICAgICogZXZlbnQgKHBlciByZXN1bHQpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gU3BsdW5rIDQuMyBhbmQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIHJlc3VsdCBpcyBhIGRpZ2VzdCwgZmFsc2UgaWYgcGVyIHJlc3VsdFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgaXNEaWdlc3RNb2RlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdGhpcyBwcm9wZXJ0eSB0byBhIEJvb2xlYW5cbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMucHJvcGVydGllcygpLmRpZ2VzdF9tb2RlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlZCBleHBpcmF0aW9uIHRpbWUgZm9yIHRoaXMgYWxlcnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBTcGx1bmsgNC4zIGFuZCBsYXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydFxuICAgICAgICAgKi9cbiAgICAgICAgZXhwaXJhdGlvblRpbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLmV4cGlyYXRpb25fdGltZV9yZW5kZXJlZCB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBzYXZlZCBzZWFyY2ggZm9yIHRoaXMgYWxlcnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHNhdmVkIHNlYXJjaCBuYW1lLCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHNhdmVkU2VhcmNoTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzKCkuc2F2ZWRzZWFyY2hfbmFtZSB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyBzZXZlcml0eSBvbiBhIHNjYWxlIG9mIDEgdG8gMTAsIHdpdGggMSBiZWluZyB0aGVcbiAgICAgICAgICogaGlnaGVzdCBzZXZlcml0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSB0aGlzIGFsZXJ0J3Mgc2V2ZXJpdHksIC0xIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHNldmVyaXR5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnByb3BlcnRpZXMoKS5zZXZlcml0eSwgMTApIHx8IC0xO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgYWxlcnQncyBzZWFyY2ggSUQgKFNJRCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhpcyBhbGVydCdzIFNJRCwgb3Ige251bGx9IGlmIG5vdCBhdmFpbGFibGUuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICBzaWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcygpLnNpZCB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRoaXMgYWxlcnQgd2FzIHRyaWdnZXJlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSBUaGlzIGFsZXJ0J3MgdHJpZ2dlciB0aW1lLCBvciB7bnVsbH0gaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHRyaWdnZXJUaW1lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyX3RpbWUgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGlzIGFsZXJ0J3MgcmVuZGVyZWQgdHJpZ2dlciB0aW1lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gU3BsdW5rIDQuMyBhbmQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhpcyBhbGVydCdzIHJlbmRlcmVkIHRyaWdnZXIgdGltZSwgb3Ige251bGx9IGlmIG5vdCBhdmFpbGFibGUuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqL1xuICAgICAgICB0cmlnZ2VyVGltZVJlbmRlcmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMoKS50cmlnZ2VyX3RpbWVfcmVuZGVyZWQgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGluIFNwbHVuayA0LjMgYW5kIGxhdGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgdHJpZ2dlcmVkIGFsZXJ0cywgb3IgLTEgaWYgbm90IHNwZWNpZmllZC5cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRcbiAgICAgICAgICovXG4gICAgICAgIHRyaWdnZXJlZEFsZXJ0Q291bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMucHJvcGVydGllcygpLnRyaWdnZXJlZF9hbGVydHMsIDEwKSB8fCAtMTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBmb3IgdGhlIG5ldyBhbGVydCBncm91cC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0XG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBhbGVydCBncm91cCwgd2hpY2ggeW91IGNhbiB0aGVuIHZpZXcgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFsZXJ0cy9maXJlZF9hbGVydHMve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkZpcmVkQWxlcnRHcm91cCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5maXJlZEFsZXJ0cyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGB0cmlnZ2VyZWRfYWxlcnRfY291bnRgIHByb3BlcnR5LCB0aGUgY291bnRcbiAgICAgICAgICogb2YgdHJpZ2dlcmVkIGFsZXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7TnVtYmVyfSB0aGUgY291bnQgb2YgdHJpZ2dlcmVkIGFsZXJ0c1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwXG4gICAgICAgICAqL1xuICAgICAgICBjb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5wcm9wZXJ0aWVzKCkudHJpZ2dlcmVkX2FsZXJ0X2NvdW50LCAxMCkgfHwgMDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBmaXJlZCBpbnN0YW5jZXMgb2YgdGhpcyBhbGVydCwgd2hpY2ggaXNcbiAgICAgICAgICogYSBsaXN0IG9mIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRgIGluc3RhbmNlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgYWxlcnRHcm91cCA9IHNlcnZpY2UuZmlyZWRBbGVydEdyb3VwcygpLml0ZW0oXCJNeUFsZXJ0XCIpO1xuICAgICAgICAgKiAgICAgIGFsZXJ0R3JvdXAubGlzdChmdW5jdGlvbihlcnIsIGZpcmVkQWxlcnRzLCBhbGVydCkge1xuICAgICAgICAgKiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZmlyZWRBbGVydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlyZWQgYWxlcnRcIiwgaSwgXCI6XCIsIGZpcmVkQWxlcnRzW2ldLnNpZCk7XG4gICAgICAgICAqICAgICAgICAgIH1cbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGZpcmVkIGFsZXJ0cyBhcmUgcmV0cmlldmVkOiBgKGVyciwgZmlyZWRBbGVydHMsIGFsZXJ0R3JvdXApYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cFxuICAgICAgICAgKi9cbiAgICAgICAgbGlzdDogZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJcIiwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgZmlyZWRBbGVydHMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnkgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXJlZEFsZXJ0RGF0YSA9IHJlc3BvbnNlLmRhdGEuZW50cnlbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhmaXJlZEFsZXJ0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXJlZEFsZXJ0ID0gbmV3IHJvb3QuRmlyZWRBbGVydCh0aGF0LnNlcnZpY2UsIGZpcmVkQWxlcnREYXRhLm5hbWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGZpcmVkQWxlcnQuX2xvYWQoZmlyZWRBbGVydERhdGEpO1xuICAgICAgICAgICAgICAgICAgICBmaXJlZEFsZXJ0cy5wdXNoKGZpcmVkQWxlcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaXJlZEFsZXJ0cywgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IGFsZXJ0IGdyb3VwLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXB9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3QgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMubGlzdCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGZpcmVkIGFsZXJ0cyBmb3IgYSBzYXZlZCBzZWFyY2guIFlvdSBjYW5cbiAgICAgKiBjcmVhdGUgYW5kIGxpc3Qgc2F2ZWQgc2VhcmNoZXMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3JcbiAgICAgKiBnZXQgYSBzcGVjaWZpYyBhbGVydCBncm91cC4gXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhbGVydHMvZmlyZWRfYWxlcnRzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqL1xuICAgIHJvb3QuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbiA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmZpcmVkQWxlcnRzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBhbGVydCBncm91cC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgYWxlcnQgZ3JvdXAuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkZpcmVkQWxlcnRHcm91cCh0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1cHByZXNzIHJlbW92aW5nIGFsZXJ0cyB2aWEgdGhlIGZpcmVkIGFsZXJ0cyBlbmRwb2ludC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUbyByZW1vdmUgYW4gYWxlcnQsIHJlbW92ZSB0aGUgc2F2ZWQgc2VhcmNoIHdpdGggdGhlIHNhbWUgbmFtZS5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkZpcmVkQWxlcnRHcm91cENvbGxlY3Rpb25gLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuRmlyZWRBbGVydEdyb3VwQ29sbGVjdGlvbmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5GaXJlZEFsZXJ0R3JvdXBDb2xsZWN0aW9uXG4gICAgICAgICAqLyAgICAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdGVFbnRpdHkgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuaW5zdGFudGlhdGVFbnRpdHkpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBTcGx1bmsgYXBwIHRoYXQgeW91IGNhbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsL3tuYW1lfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkFwcGxpY2F0aW9uID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGNhbGwgYGZldGNoYCBhZnRlciBhbiB1cGRhdGUgdG8gZ2V0IHRoZSB1cGRhdGVkIFxuICAgICAgICAgKiBpdGVtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25VcGRhdGU6IHRydWUsXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5hcHBzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgU3BsdW5rIGFwcC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25gIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIHt9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zZXR1cEluZm8gID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnNldHVwSW5mbyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluZm8gPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudXBkYXRlSW5mbyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgYSBTcGx1bmsgYXBwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHAgPSBzZXJ2aWNlLmFwcHMoKS5pdGVtKFwiYXBwXCIpO1xuICAgICAgICAgKiAgICAgIGFwcC5zZXR1cChmdW5jdGlvbihlcnIsIGluZm8sIHNlYXJjaCkge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNFVFVQIElORk86IFwiLCBpbmZvKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gc2V0dXAgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkOiBgKGVyciwgaW5mbywgYXBwKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsL3tuYW1lfS9zZXR1cFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHNldHVwSW5mbzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwic2V0dXBcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YS5lbnRyeS5jb250ZW50LCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYW55IGluZm9ybWF0aW9uIGZvciBhbiB1cGRhdGUgdG8gYSBsb2NhbGx5LWluc3RhbGxlZCBTcGx1bmsgYXBwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBhcHAgPSBzZXJ2aWNlLmFwcHMoKS5pdGVtKFwiTXlBcHBcIik7XG4gICAgICAgICAqICAgICAgYXBwLnVwZGF0ZUluZm8oZnVuY3Rpb24oZXJyLCBpbmZvLCBhcHApIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJVUERBVEUgSU5GTzogXCIsIGluZm8pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB1cGRhdGUgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkOiBgKGVyciwgaW5mbywgYXBwKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBhcHBzL2xvY2FsL3tuYW1lfS91cGRhdGVcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVJbmZvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJ1cGRhdGVcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YS5lbnRyeS5jb250ZW50LCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIFNwbHVuayBhcHBzLiBZb3UgY2FuIGNyZWF0ZSBhbmQgbGlzdCBhcHBsaWNhdGlvbnMgXG4gICAgICogdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgYXBwLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGFwcHMvbG9jYWxcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuQXBwbGljYXRpb25zID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gZW50aXR5IGhhcyBiZWVuIGNyZWF0ZWQuIEJ5IFxuICAgICAgICAgKiBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnNcbiAgICAgICAgICogKGVjaG9lcykgdGhlIG5ldyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25FbnRpdHlDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5hcHBzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBhcHAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBhcHAuIEZvciBkZXRhaWxzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RhcHBzI1BPU1RfYXBwcy4yRmxvY2FsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UE9TVCBhcHBzL2xvY2FsPC9hPiBlbmRwb2ludCBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25gIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5BcHBsaWNhdGlvbih0aGlzLnNlcnZpY2UsIHByb3BzLm5hbWUsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5BcHBsaWNhdGlvbnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuQXBwbGljYXRpb25zYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkFwcGxpY2F0aW9uc1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzZXJ2ZXIvaW5mb1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlNlcnZlckluZm9cbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuU2VydmVySW5mbyA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuaW5mbztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuU2VydmVySW5mb2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5TZXJ2ZXJJbmZvXG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gXCJzZXJ2ZXItaW5mb1wiO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIHt9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBTcGx1bmsgdXNlciwgd2hpY2ggeW91IGNhbiB2aWV3LCBtb2RpZnksIGFuZFxuICAgICAqIHJlbW92ZS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhdXRoZW50aWNhdGlvbi91c2Vycy97bmFtZX1cbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Vc2VyXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LlVzZXIgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnVzZXJzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuVXNlcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBTcGx1bmsgdXNlcm5hbWUuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVXNlcn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVXNlcmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2VyXG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCB7fSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiB1c2Vycy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3QgdXNlcnMgdXNpbmcgXG4gICAgICogdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgdXNlci5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBhdXRoZW50aWNhdGlvbi91c2Vyc1xuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LlVzZXJzID0gcm9vdC5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjYWxsIGBmZXRjaGAgYWZ0ZXIgYW4gZW50aXR5IGhhcyBiZWVuIGNyZWF0ZWQuIEJ5IFxuICAgICAgICAgKiBkZWZhdWx0LCB0aGUgZW50aXR5IGlzIG5vdCBmZXRjaGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50IHJldHVybnNcbiAgICAgICAgICogKGVjaG9lcykgdGhlIG5ldyBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgZmV0Y2hPbkVudGl0eUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMudXNlcnM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgdXNlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIG5ldyB1c2VyLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjgjdXNlcmF1dGhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Vc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlVzZXJ9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuVXNlcnNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlVzZXIodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCB7fSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzYC4gXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlVzZXJzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Vc2Vyc2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwge30pO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgdXNlci4gXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIGEgc3BlY2lhbCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUo4I3VzZXJhdXRocGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+VXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBlbnRpdHk6IGAoZXJyLCBjcmVhdGVkRW50aXR5KWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Vc2Vyc1xuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBlbmRwb2ludCByZXF1aXJlcyB1cyB0byB1c2UgdGhlIHBhc3NlZC1pbiBuYW1lXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtuYW1lOiBwYXJhbXMubmFtZX07XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhhdC5pbnN0YW50aWF0ZUVudGl0eShwcm9wcyk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5LmZldGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS53YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydGVkLCBzbyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHNwZWNpZmljIFNwbHVuayB2aWV3LCB3aGljaCB5b3UgY2FuIHZpZXcsIG1vZGlmeSwgYW5kXG4gICAgICogcmVtb3ZlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGEvdWkvdmlld3Mve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuVmlld1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5WaWV3ID0gcm9vdC5FbnRpdHkuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3XG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy52aWV3cyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLlZpZXdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlldy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVmlld2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3XG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiB2aWV3cy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3Qgdmlld3MgdXNpbmcgXG4gICAgICogdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3IgZ2V0IGEgc3BlY2lmaWMgdmlldy5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhL3VpL3ZpZXdzXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuVmlld3NcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuVmlld3MgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMudmlld3M7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgdmlldy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IHZpZXcuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNQT1NUX3NjaGVkdWxlZC4yRnZpZXdzLjJGLjdCbmFtZS43RFwiIHRhcmdldD1cIl9ibGFua1wiPlBPU1Qgc2NoZWR1bGVkL3ZpZXdzL3tuYW1lfTwvYT4gZW5kcG9pbnQgaW4gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuVmlld30gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuVmlld2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LlZpZXcodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5WaWV3c2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlZpZXdzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5WaWV3c2AgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5WaWV3c1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBpbmRleCwgd2hpY2ggeW91IGNhbiB1cGRhdGUgYW5kIHN1Ym1pdCBldmVudHMgdG8uXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgZGF0YS9pbmRleGVzL25hbWVcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5JbmRleFxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5JbmRleCA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmluZGV4ZXMgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5JbmRleGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbmRleC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuSW5kZXh9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4YCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4XG4gICAgICAgICAqLyBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc3VibWl0RXZlbnQgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3VibWl0RXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1Ym1pdHMgYW4gZXZlbnQgdG8gdGhpcyBpbmRleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgaW5kZXggPSBzZXJ2aWNlLmluZGV4ZXMoKS5pdGVtKFwiX2ludGVybmFsXCIpO1xuICAgICAgICAgKiAgICAgIGluZGV4LnN1Ym1pdEV2ZW50KFwiQSBuZXcgZXZlbnRcIiwge3NvdXJjZXR5cGU6IFwibXlzb3VyY2V0eXBlXCJ9LCBmdW5jdGlvbihlcnIsIHJlc3VsdCwgaW5kZXgpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJTdWJtaXR0ZWQgZXZlbnQ6IFwiLCByZXN1bHQpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgVGhlIHRleHQgZm9yIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHBhcmFtZXRlcnMgZm9yIGluZGV4aW5nOiBcbiAgICAgICAgICogICAgLSBgaG9zdGAgKF9zdHJpbmdfKTogVGhlIHZhbHVlIHRvIHBvcHVsYXRlIGluIHRoZSBob3N0IGZpZWxkIGZvciBldmVudHMgZnJvbSB0aGlzIGRhdGEgaW5wdXQuIFxuICAgICAgICAgKiAgICAtIGBob3N0X3JlZ2V4YCAoX3N0cmluZ18pOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGV4dHJhY3QgdGhlIGhvc3QgdmFsdWUgZnJvbSBlYWNoIGV2ZW50LiBcbiAgICAgICAgICogICAgLSBgc291cmNlYCAoX3N0cmluZ18pOiBUaGUgc291cmNlIHZhbHVlIHRvIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGZvciB0aGlzIGlucHV0J3MgZXZlbnRzLlxuICAgICAgICAgKiAgICAtIGBzb3VyY2V0eXBlYCAoX3N0cmluZ18pOiBUaGUgc291cmNldHlwZSB0byBhcHBseSB0byBldmVudHMgZnJvbSB0aGlzIGlucHV0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgc3VibWl0dGVkOiBgKGVyciwgcmVzdWx0LCBpbmRleClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgcmVjZWl2ZXJzL3NpbXBsZT9pbmRleD17bmFtZX1cbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBzdWJtaXRFdmVudDogZnVuY3Rpb24oZXZlbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2sgJiYgdXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIHRoZSBpbmRleCBuYW1lXG4gICAgICAgICAgICBwYXJhbXNbXCJpbmRleFwiXSA9IHRoaXMubmFtZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5sb2coZXZlbnQsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCwgdGhhdCk7IFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlLnZlcnNpb25Db21wYXJlKFwiNS4wXCIpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluZGV4ZXMgY2Fubm90IGJlIHJlbW92ZWQgaW4gU3BsdW5rIDQueFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAgICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgaW5kZXhlcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3QgaW5kZXhlcyB1c2luZyBcbiAgICAgKiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBpbmRleC5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhL2luZGV4ZXNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LkluZGV4ZXMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5pbmRleGVzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhbiBpbmRleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbmV3IGluZGV4LiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjMjaW5kZXhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5JbmRleCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5JbmRleH0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5TmFtZXNwYWNlID0gdXRpbHMubmFtZXNwYWNlRnJvbVByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkluZGV4KHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkluZGV4ZXNgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSW5kZXhlc1xuICAgICAgICAgKi8gIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKHNlcnZpY2UsIHRoaXMucGF0aCgpLCBuYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gaW5kZXggd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgaW5kZXhlcyA9IHNlcnZpY2UuaW5kZXhlcygpO1xuICAgICAgICAgKiAgICAgIGluZGV4ZXMuY3JlYXRlKFwiTmV3SW5kZXhcIiwge2Fzc3VyZVVURjg6IHRydWV9LCBmdW5jdGlvbihlcnIsIG5ld0luZGV4KSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQSBuYW1lIGZvciB0aGlzIGluZGV4LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFSjMjaW5kZXhwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5JbmRleCBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIG5ldyBpbmRleDogYChlcnIsIGNyZWF0ZWRJbmRleClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgZGF0YS9pbmRleGVzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5JbmRleGVzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKG5hbWUsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbGVkIHVzIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUgb2YgKHBhcmFtcywgY2FsbGJhY2spLFxuICAgICAgICAgICAgLy8gbGV0cyBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc09iamVjdChuYW1lKSAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gbmFtZTtcbiAgICAgICAgICAgICAgICBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtc1tcIm5hbWVcIl0gPSBuYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgc3RhbnphLCB3aGljaCB5b3UgY2FuIHVwZGF0ZSBhbmQgcmVtb3ZlLCBmcm9tIGEgXG4gICAgICogY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGNvbmZpZ3MvY29uZi17ZmlsZX0ve25hbWV9YFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkVudGl0eVxuICAgICAqL1xuICAgIHJvb3QuQ29uZmlndXJhdGlvblN0YW56YSA9IHJvb3QuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YVxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZSA9PT0gXCJkZWZhdWx0XCIgPyBcIl9uZXdcIiA6IHRoaXMubmFtZTtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5jb25maWd1cmF0aW9ucyArIFwiL2NvbmYtXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5maWxlKSArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uU3RhbnphYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGUgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIG5ldyBzdGFuemEuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemF9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvblN0YW56YVxuICAgICAgICAgKi8gXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIGZpbGUsIG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHN0YW56YXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkgZmlsZS4gWW91IGNhblxuICAgICAqIGNyZWF0ZSBhbmQgbGlzdCBzdGFuemFzIHVzaW5nIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIFxuICAgICAqIHN0YW56YS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBjb25maWdzL2NvbmYte2ZpbGV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi8gIFxuICAgIHJvb3QuQ29uZmlndXJhdGlvbkZpbGUgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHsgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmNvbmZpZ3VyYXRpb25zICsgXCIvY29uZi1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbG9jYWwgaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgc3RhbnphIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKiBZb3UgY2Fubm90IGRpcmVjdGx5IHVwZGF0ZSB0aGUgYENvbmZpZ3VyYXRpb25TdGFuemFgIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB2aWV3aW5nIGBjb25maWdzL2NvbmYte2ZpbGV9L19uZXdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemF9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgICAgICovXG4gICAgICAgIGdldERlZmF1bHRTdGFuemE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290LkNvbmZpZ3VyYXRpb25TdGFuemEodGhpcy5zZXJ2aWNlLCB0aGlzLm5hbWUsIFwiZGVmYXVsdFwiLCB0aGlzLm5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhIHN0YW56YSBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBrZXktdmFsdWUgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBzdGFuemEuIFxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemF9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25TdGFuemFgIGluc3RhbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbkZpbGVcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Db25maWd1cmF0aW9uU3RhbnphKHRoaXMuc2VydmljZSwgdGhpcy5uYW1lLCBwcm9wcy5uYW1lLCBlbnRpdHlOYW1lc3BhY2UpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHN0YW56YSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgZmlsZSA9IHNlcnZpY2UuY29uZmlndXJhdGlvbnMoKS5pdGVtKFwicHJvcHNcIik7XG4gICAgICAgICAqICAgICAgZmlsZS5jcmVhdGUoXCJteV9zdGFuemFcIiwgZnVuY3Rpb24oZXJyLCBuZXdTdGFuemEpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJDUkVBVEVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhbnphTmFtZSBBIG5hbWUgZm9yIHRoaXMgc3RhbnphLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIEEgZGljdGlvbmFyeSBvZiBrZXktdmFsdWUgcGFpcnMgdG8gcHV0IGluIHRoaXMgc3RhbnphLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgY3JlYXRlZCBzdGFuemE6IGAoZXJyLCBjcmVhdGVkU3RhbnphKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBjb25maWdzL2NvbmYte2ZpbGV9XG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihzdGFuemFOYW1lLCB2YWx1ZXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3Qoc3RhbnphTmFtZSkgJiYgdXRpbHMuaXNGdW5jdGlvbih2YWx1ZXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IHN0YW56YU5hbWU7XG4gICAgICAgICAgICAgICAgc3RhbnphTmFtZSA9IHZhbHVlcy5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbih2YWx1ZXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMgfHwge307XG4gICAgICAgICAgICB2YWx1ZXNbXCJuYW1lXCJdID0gc3RhbnphTmFtZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHZhbHVlcywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgY29uZmlndXJhdGlvbiBmaWxlcy4gWW91IGNhbiBjcmVhdGUgYW5kIGxpc3QgXG4gICAgICogY29uZmlndXJhdGlvbiBmaWxlcyB1c2luZyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbmVyLCBvciBnZXQgYSBzcGVjaWZpYyBmaWxlLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IHByb3BlcnRpZXNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuQ29sbGVjdGlvblxuICAgICAqLyAgXG4gICAgcm9vdC5Db25maWd1cmF0aW9ucyA9IHJvb3QuQ29sbGVjdGlvbi5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY2FsbCBgZmV0Y2hgIGFmdGVyIGFuIGVudGl0eSBoYXMgYmVlbiBjcmVhdGVkLiBCeSBcbiAgICAgICAgICogZGVmYXVsdCwgdGhlIGVudGl0eSBpcyBub3QgZmV0Y2hlZCBiZWNhdXNlIHRoZSBlbmRwb2ludCByZXR1cm5zXG4gICAgICAgICAqIChlY2hvZXMpIHRoZSBuZXcgZW50aXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZldGNoT25FbnRpdHlDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhzLnByb3BlcnRpZXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGxvY2FsIGluc3RhbmNlIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25GaWxlfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uRmlsZWAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Db25maWd1cmF0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGFudGlhdGVFbnRpdHk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuQ29uZmlndXJhdGlvbkZpbGUodGhpcy5zZXJ2aWNlLCBwcm9wcy5uYW1lLCB0aGlzLm5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuQ29uZmlndXJhdGlvbnN9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqLyAgXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlLm93bmVyID09PSBcIi1cIiB8fCBuYW1lc3BhY2UuYXBwID09PSBcIi1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb25zIHJlcXVpcmVzIGEgbm9uLXdpbGRjYXJkIG93bmVyL2FwcFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGNvbmZpZ3VyYXRpb25zID0gc2VydmljZS5jb25maWd1cmF0aW9ucygpO1xuICAgICAgICAgKiAgICAgIGNvbmZpZ3VyYXRpb25zLmNyZWF0ZShcIm15cHJvcHNcIiwgZnVuY3Rpb24oZXJyLCBuZXdGaWxlKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIEEgbmFtZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlOiBgKGVyciwgY3JlYXRlZEZpbGUpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHByb3BlcnRpZXNcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkNvbmZpZ3VyYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKGZpbGVuYW1lLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsZWQgdXMgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZSBvZiAocGFyYW1zLCBjYWxsYmFjayksXG4gICAgICAgICAgICAvLyBsZXRzIG1ha2UgaXQgd29ya1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbXCJfX2NvbmZcIl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcIlwiLCB7X19jb25mOiBmaWxlbmFtZX0sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gbmV3IHJvb3QuQ29uZmlndXJhdGlvbkZpbGUodGhhdC5zZXJ2aWNlLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eS5mZXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEud2FzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnRlZCwgc28gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIGRvZXNGaWxlRXhpc3Q6IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgICAgIC8vIDEuIEZldGNoIGZpbGVzIGxpc3RcbiAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldF92MihcIlwiLCAge19fY29uZjogZmlsZW5hbWV9KTtcblxuICAgICAgICAgICAgICAgIC8vIDIuIEZpbHRlciB0aGUgZmlsZXNcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMgPSByZXNwb25zZT8uYm9keT8uZW50cnk/LmZpbHRlcihmID0+IGYubmFtZSA9PT0gZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNvZGU6XCJGSUxFX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgRmlsZSB3aXRoIHRoZSBuYW1lICcke2ZpbGVuYW1lfScgZG9lcyBub3QgZXhpc3QuYH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gMy4gQ3JlYXRlIGEgbG9jYWwgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlndXJhdGlvbkZpbGUgPSBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSh0aGF0LnNlcnZpY2UsIGZpbGVuYW1lKTtcblxuICAgICAgICAgICAgICAgIC8vIDQuIExvYWQgdGhlIGZpbGUgY29udGVudFxuICAgICAgICAgICAgICAgIHZhciBmZXRjaGVkRmlsZSA9IGF3YWl0IGNvbmZpZ3VyYXRpb25GaWxlLmZldGNoX3YyKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge2ZpbGU6IGZldGNoZWRGaWxlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3JDb2RlOlwiU1lTVEVNX0VSUk9SXCIsIGVycm9yTWVzc2FnZTogZXJyb3J9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGRvZXNTdGFuemFFeGlzdDogYXN5bmMgZnVuY3Rpb24oZmlsZSwgc3RhbnphKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDEuIGNoZWNrIGlmIHRoZSBzdGFuemEgZXhpc3RzXG4gICAgICAgICAgICAgICAgdmFyIGZldGNoZWRTdGFuemEgPSBmaWxlLml0ZW0oc3RhbnphKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZighZmV0Y2hlZFN0YW56YSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjb2RlOlwiU1RBTlpBX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgU3RhbnphIHdpdGggdGhlIG5hbWUgJyR7c3RhbnphfScgZG9lcyBub3QgZXhpc3QuYH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3N0YW56YTogZmV0Y2hlZFN0YW56YX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvckNvZGU6XCJTWVNURU1fRVJST1JcIiwgZXJyb3JNZXNzYWdlOiBlcnJvcn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlX3YyOiBhc3luYyBmdW5jdGlvbiAoY29uZmlncywgc3ZjLCBmaWxlbmFtZSwgc3RhbnphLCBrZXlWYWx1ZU1hcCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzXG4gICAgICAgICAgICB2YXIgZG9lc0ZpbGVFeGlzdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5kb2VzRmlsZUV4aXN0KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIHZhciBjb25maWdGaWxlID0gZG9lc0ZpbGVFeGlzdFJlc3BvbnNlLmZpbGU7XG5cbiAgICAgICAgICAgIC8vIDIuIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBmaWxlXG4gICAgICAgICAgICBpZighY29uZmlnRmlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRvZXNGaWxlRXhpc3RSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuLi5cIik7XG5cbiAgICAgICAgICAgICAgICB0aGF0LmNyZWF0ZSggeyBfX2NvbmY6IGZpbGVuYW1lIH0sIFxuICAgICAgICAgICAgICAgICAgICAoZXJyLCBuZXdGaWxlKSA9PiBjb25zb2xlLmxvZyhgQ29uZmlndXJhdGlvbiBGaWxlIGNyZWF0ZWQ6ICR7ZmlsZW5hbWV9YCkgKTtcblxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBuZXcgcm9vdC5Db25maWd1cmF0aW9uRmlsZSggdGhhdC5zZXJ2aWNlLCBmaWxlbmFtZSApO1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBhd2FpdCBjb25maWdGaWxlLmZldGNoX3YyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBzdGFuemEgZXhpc3RzXG4gICAgICAgICAgICB2YXIgZG9lc1N0YW56YUV4aXN0UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRvZXNTdGFuemFFeGlzdChjb25maWdGaWxlLCBzdGFuemEpO1xuICAgICAgICAgICAgdmFyIGNvbmZpZ1N0YW56YSA9IGRvZXNTdGFuemFFeGlzdFJlc3BvbnNlLnN0YW56YTtcblxuICAgICAgICAgICAgLy8gMy4gSWYgdGhlIHN0YW56YSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBuZXcgc3RhbnphIHdpdGggZ2l2ZW4ga2V5VmFsdWVNYXBcbiAgICAgICAgICAgIGlmKCFjb25maWdTdGFuemEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkb2VzU3RhbnphRXhpc3RSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIHN0YW56YS4uLlwiKTtcblxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUuY3JlYXRlKHN0YW56YSwga2V5VmFsdWVNYXAsIGZ1bmN0aW9uIChlcnIsIG5ld1N0YW56YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlndXJhdGlvbiBTdGFuemEgY3JlYXRlZDogJHtzdGFuemF9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA0LiBJZiB0aGUgc3RhbnphIGV4aXN0cywgdXBkYXRlIGl0IHdpdGggdGhlIGtleVZhbHVlTWFwXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25maWdTdGFuemEudXBkYXRlKGtleVZhbHVlTWFwLCAoZXJyLCB1cGRhdGVkU3RhbnphKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIFN0YW56YSB1cGRhdGVkOiAke3N0YW56YX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzcGVjaWZpYyBzZWFyY2ggam9iLiBZb3UgY2FuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnNcbiAgICAgKiBvbiB0aGlzIGpvYiwgc3VjaCBhcyByZWFkaW5nIGl0cyBzdGF0dXMsIGNhbmNlbGluZyBpdCwgYW5kIGdldHRpbmcgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfVxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAqIEBleHRlbmRzIHNwbHVua2pzLlNlcnZpY2UuRW50aXR5XG4gICAgICovXG4gICAgcm9vdC5Kb2IgPSByb290LkVudGl0eS5leHRlbmQoe1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIHRoZSBSRVNUIGVuZHBvaW50IHBhdGggZm9yIHRoaXMgcmVzb3VyY2UgKHdpdGggbm8gbmFtZXNwYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUGF0aHMuam9icyArIFwiL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzaWQgVGhlIHNlYXJjaCBJRCBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Kb2J9IEEgbmV3IGBzcGx1bmtqcy5TZXJ2aWNlLkpvYmAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovIFxuICAgICAgICBpbml0OiBmdW5jdGlvbihzZXJ2aWNlLCBzaWQsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gc2lkO1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB0aGlzLnNpZCA9IHNpZDtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLmNhbmNlbCAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmNhbmNlbCk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQcmV2aWV3ID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmRpc2FibGVQcmV2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUHJldmlldyAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuZW5hYmxlUHJldmlldyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cyAgICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmV2ZW50cyk7XG4gICAgICAgICAgICB0aGlzLmZpbmFsaXplICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLmZpbmFsaXplKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2UgICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucGF1c2UpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3ICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5wcmV2aWV3KTtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cyAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucmVzdWx0cyk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaGxvZyAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnNlYXJjaGxvZyk7XG4gICAgICAgICAgICB0aGlzLnNldFByaW9yaXR5ICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnNldFByaW9yaXR5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0VFRMICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc2V0VFRMKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeSAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuc3VtbWFyeSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lICAgICAgID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnRpbWVsaW5lKTtcbiAgICAgICAgICAgIHRoaXMudG91Y2ggICAgICAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMudG91Y2gpO1xuICAgICAgICAgICAgdGhpcy51bnBhdXNlICAgICAgICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51bnBhdXNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FuY2VscyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IuY2FuY2VsKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNBTkNFTExFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNlYXJjaCBpcyBkb25lOiBgKGVycilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImNhbmNlbFwifSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyBwcmV2aWV3IGdlbmVyYXRpb24gZm9yIGEgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5kaXNhYmxlUHJldmlldyhmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBSRVZJRVcgRElTQUJMRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoaXMgc2VhcmNoIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBkaXNhYmxlUHJldmlldzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJkaXNhYmxlcHJldmlld1wifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHByZXZpZXcgZ2VuZXJhdGlvbiBmb3IgYSBzZWFyY2ggam9iLiBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5kaXNhYmxlUHJldmlldyhmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBSRVZJRVcgRU5BQkxFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhpcyBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGVuYWJsZVByZXZpZXc6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwiZW5hYmxlcHJldmlld1wifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBldmVudHMgb2YgYSBzZWFyY2ggam9iIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5ldmVudHMoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgZXZlbnRzLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZHM6IFwiLCBldmVudHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBldmVudHMuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRmV2ZW50c1wiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9ldmVudHM8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnRzIGFyZSByZXRyaWV2ZWQ6IGAoZXJyLCBldmVudHMsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vZXZlbnRzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGV2ZW50czogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zLm91dHB1dF9tb2RlID0gcGFyYW1zLm91dHB1dF9tb2RlIHx8IFwianNvbl9yb3dzXCI7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJldmVudHNcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbmFsaXplcyBhIHNlYXJjaCBqb2IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IuZmluYWxpemUoZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgY29uc29sZS5sb2coXCJKT0IgRklOQUxJWkVEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcImZpbmFsaXplXCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoaXMgc2VhcmNoIGpvYidzIGV2ZW50cyBvciByZXN1bHRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBPbmUgb2Yge1wiZXZlbnRzXCIsIFwicHJldmlld1wiLCBcInJlc3VsdHNcIn0uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbmFsIHBhcmFtZXRlcnM6XG4gICAgICAgICAqICAgIC0gYHBhZ2VzaXplYCAoX2ludGVnZXJfKTogVGhlIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4gb24gZWFjaCByZXF1ZXN0LiBEZWZhdWx0cyB0byBhcyBtYW55IGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhdG9yIG9iamVjdCB3aXRoIGEgYG5leHQoY2FsbGJhY2spYCBtZXRob2QsIHdoZXJlIGBjYWxsYmFja2AgaXMgb2YgdGhlIGZvcm0gYChlcnIsIHJlc3VsdHMsIGhhc01vcmVSZXN1bHRzKWAuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vcmVzdWx0c1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBpdGVyYXRvcjogZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuUGFnaW5hdGVkRW5kcG9pbnRJdGVyYXRvcih0aGlzW3R5cGVdLCBwYXJhbXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXVzZXMgYSBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnBhdXNlKGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFBBVVNFRFwiKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBwYXVzZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJwYXVzZVwifSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB0aGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEdldHMgdGhlIHByZXZpZXcgcmVzdWx0cyBmb3IgYSBzZWFyY2ggam9iIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5wcmV2aWV3KHtjb3VudDogMTB9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkczogXCIsIHJlc3VsdHMuZmllbGRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBwcmV2aWV3IHJlc3VsdHMuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSB0aGUgPGEgaHJlZj1cImh0dHA6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvbGF0ZXN0L1JFU1RBUEkvUkVTVHNlYXJjaCNHRVRfc2VhcmNoLjJGam9icy4yRi43QnNlYXJjaF9pZC43RC4yRnJlc3VsdHNfcHJldmlld1wiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzX3ByZXZpZXc8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcHJldmlldyByZXN1bHRzIGFyZSByZXRyaWV2ZWQgOiBgKGVyciwgcmVzdWx0cywgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzX3ByZXZpZXdcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgcHJldmlldzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgcGFyYW1zLm91dHB1dF9tb2RlID0gcGFyYW1zLm91dHB1dF9tb2RlIHx8IFwianNvbl9yb3dzXCI7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJyZXN1bHRzX3ByZXZpZXdcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZGF0YSwgdGhhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHJlc3VsdHMgZm9yIGEgc2VhcmNoIGpvYiB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBUaGUgY2FsbGJhY2sgY2FuIGdldCBgdW5kZWZpbmVkYCBmb3IgaXRzIGByZXN1bHRzYCBwYXJhbWV0ZXIgaWYgdGhlXG4gICAgICAgICAqIGpvYiBpcyBub3QgeWV0IGRvbmUuIFRvIGF2b2lkIHRoaXMsIHVzZSB0aGUgYEpvYi50cmFjaygpYCBtZXRob2QgdG9cbiAgICAgICAgICogd2FpdCB1bnRpbCB0aGUgam9iIGlzIGNvbXBsZXRlIHByaW9yIHRvIGZldGNoaW5nIHRoZSByZXN1bHRzIHdpdGhcbiAgICAgICAgICogdGhpcyBtZXRob2QuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnJlc3VsdHMoe2NvdW50OiAxMH0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cywgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmllbGRzOiBcIiwgcmVzdWx0cy5yZXN1bHRzKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBzZWFyY2ggcmVzdWx0cy4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIHRoZSA8YSBocmVmPVwiaHR0cDovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay9sYXRlc3QvUkVTVEFQSS9SRVNUc2VhcmNoI0dFVF9zZWFyY2guMkZqb2JzLjJGLjdCc2VhcmNoX2lkLjdELjJGcmVzdWx0c1wiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9yZXN1bHRzPC9hPiBlbmRwb2ludCBpbiB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlc3VsdHMgYXJlIHJldHJpZXZlZDogYChlcnIsIHJlc3VsdHMsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vcmVzdWx0c1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICByZXN1bHRzOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0X21vZGUgPSBwYXJhbXMub3V0cHV0X21vZGUgfHwgXCJqc29uX3Jvd3NcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFwicmVzdWx0c1wiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgc2VhcmNoIGxvZyBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnNlYXJjaGxvZyhmdW5jdGlvbihlcnIsIHNlYXJjaGxvZywgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKHNlYXJjaGxvZyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggbG9nIGFuZCBqb2I6IGAoZXJyLCBzZWFyY2hsb2csIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vc2VhcmNoLmxvZ1xuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICBzZWFyY2hsb2c6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChcInNlYXJjaC5sb2dcIiwge30sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgcHJpb3JpdHkgZm9yIHRoaXMgc2VhcmNoIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9iID0gc2VydmljZS5qb2JzKCkuaXRlbShcIm15c2lkXCIpO1xuICAgICAgICAgKiAgICAgIGpvYi5zZXRQcmlvcml0eSg2LCBmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkpPQiBQUklPUklUWSBTRVRcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgcHJpb3JpdHkgKGFuIGludGVnZXIgYmV0d2VlbiAxLTEwKS4gQSBoaWdoZXIgdmFsdWUgbWVhbnMgYSBoaWdoZXIgcHJpb3JpdHkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHNldFByaW9yaXR5OiBmdW5jdGlvbih2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHJlcSA9IHRoaXMucG9zdChcImNvbnRyb2xcIiwge2FjdGlvbjogXCJzZXRwcmlvcml0eVwiLCBwcmlvcml0eTogdmFsdWV9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHRpbWUgdG8gbGl2ZSAoVFRMKSBmb3IgdGhlIHNlYXJjaCBqb2IsIHdoaWNoIGlzIHRoZSB0aW1lIGJlZm9yZVxuICAgICAgICAgKiB0aGUgc2VhcmNoIGpvYiBleHBpcmVzIGFmdGVyIGl0IGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgYXZhaWxhYmxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnNldFRUTCgxMDAwLCBmdW5jdGlvbihlcnIsIGpvYikge1xuICAgICAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZyhcIkpPQiBUVEwgU0VUXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgVGhlIHRpbWUgdG8gbGl2ZSwgaW4gc2Vjb25kcy4gXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHNldFRUTDogZnVuY3Rpb24odmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnBvc3QoXCJjb250cm9sXCIsIHthY3Rpb246IFwic2V0dHRsXCIsIHR0bDogdmFsdWV9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHN1bW1hcnkgZm9yIHRoaXMgc2VhcmNoIGpvYiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnN1bW1hcnkoe3RvcF9jb3VudDogNX0sIGZ1bmN0aW9uKGVyciwgc3VtbWFyeSwgam9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3VtbWFyeTogXCIsIHN1bW1hcnkpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSBzdW1tYXJ5LiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RzZWFyY2gjR0VUX3NlYXJjaC4yRmpvYnMuMkYuN0JzZWFyY2hfaWQuN0QuMkZzdW1tYXJ5XCIgdGFyZ2V0PVwiX2JsYW5rXCI+R0VUIHNlYXJjaC9qb2JzL3tzZWFyY2hfaWR9L3N1bW1hcnk8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgc3VtbWFyeSBhbmQgc2VhcmNoIGpvYjogYChlcnIsIHN1bW1hcnksIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vc3VtbW1hcnlcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYlxuICAgICAgICAgKi9cbiAgICAgICAgc3VtbWFyeTogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJzdW1tYXJ5XCIsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB0aW1lbGluZSBmb3IgdGhpcyBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnRpbWVsaW5lKHt0aW1lX2Zvcm1hdDogXCIlY1wifSwgZnVuY3Rpb24oZXJyLCBqb2IsIHRpbWVsaW5lKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGltZWxpbmU6IFwiLCB0aW1lbGluZSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIHRpbWVsaW5lLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIDxhIGhyZWY9XCJodHRwOi8vZG9jcy5zcGx1bmsuY29tL0RvY3VtZW50YXRpb24vU3BsdW5rL2xhdGVzdC9SRVNUQVBJL1JFU1RzZWFyY2gjR0VUX3NlYXJjaC4yRmpvYnMuMkYuN0JzZWFyY2hfaWQuN0QuMkZ0aW1lbGluZVwiIHRhcmdldD1cIl9ibGFua1wiPkdFVCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS90aW1lbGluZSA8L2E+IGVuZHBvaW50IGluIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgdGltZWxpbmUgYW5kIHNlYXJjaCBqb2I6IGAoZXJyLCB0aW1lbGluZSwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS90aW1lbGluZVxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICB0aW1lbGluZTogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXCJ0aW1lbGluZVwiLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5kYXRhLCB0aGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVG91Y2hlcyBhIHNlYXJjaCBqb2IsIHdoaWNoIG1lYW5zIGV4dGVuZGluZyB0aGUgZXhwaXJhdGlvbiB0aW1lIG9mIFxuICAgICAgICAgKiB0aGUgc2VhcmNoIHRvIG5vdyBwbHVzIHRoZSB0aW1lIHRvIGxpdmUgKFRUTCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYiA9IHNlcnZpY2Uuam9icygpLml0ZW0oXCJteXNpZFwiKTtcbiAgICAgICAgICogICAgICBqb2IudG91Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFRPVUNIRURcIik7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBlbmRwb2ludCBzZWFyY2gvam9icy97c2VhcmNoX2lkfS9jb250cm9sXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHRvdWNoOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInRvdWNoXCJ9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnRzIHBvbGxpbmcgdGhlIHN0YXR1cyBvZiB0aGlzIHNlYXJjaCBqb2IsIGFuZCBmaXJlcyBjYWxsYmFja3NcbiAgICAgICAgICogdXBvbiBlYWNoIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVyczpcbiAgICAgICAgICogICAgLSBgcGVyaW9kYCAoX2ludGVnZXJfKTogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggcG9sbC4gRGVmYXVsdHMgdG8gNTAwLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2FsbGJhY2tzIEEgZGljdGlvbmFyeSBvZiBvcHRpb25hbCBjYWxsYmFja3M6XG4gICAgICAgICAqICAgIC0gYHJlYWR5YDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgd2hlbiB0aGUgam9iJ3MgcHJvcGVydGllcyBmaXJzdCBiZWNvbWUgYXZhaWxhYmxlLlxuICAgICAgICAgKiAgICAtIGBwcm9ncmVzc2A6IEEgZnVuY3Rpb24gYChqb2IpYCBpbnZva2VkIHdoZW5ldmVyIG5ldyBqb2IgcHJvcGVydGllcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiAgICAtIGBkb25lYDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgaWYgdGhlIGpvYiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LiBObyBmdXJ0aGVyIHBvbGxpbmcgaXMgZG9uZS5cbiAgICAgICAgICogICAgLSBgZmFpbGVkYDogQSBmdW5jdGlvbiBgKGpvYilgIGludm9rZWQgaWYgdGhlIGpvYiBmYWlscyBleGVjdXRpbmcgb24gdGhlIHNlcnZlci4gTm8gZnVydGhlciBwb2xsaW5nIGlzIGRvbmUuXG4gICAgICAgICAqICAgIC0gYGVycm9yYDogQSBmdW5jdGlvbiBgKGVycilgIGludm9rZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBvbGxpbmcuIE5vIGZ1cnRoZXIgcG9sbGluZyBpcyBkb25lLlxuICAgICAgICAgKiBPciwgaWYgYSBmdW5jdGlvbiBgKGpvYilgLCBlcXVpdmFsZW50IHRvIHBhc3NpbmcgaXQgYXMgYSBgZG9uZWAgY2FsbGJhY2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JcbiAgICAgICAgICovXG4gICAgICAgIHRyYWNrOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHZhciBwZXJpb2QgPSBvcHRpb25zLnBlcmlvZCB8fCA1MDA7IC8vIG1zXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKGNhbGxiYWNrcykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmU6IGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBub0NhbGxiYWNrc0FmdGVyUmVhZHkgPSAoXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5wcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICFjYWxsYmFja3MuZG9uZSAmJlxuICAgICAgICAgICAgICAgICFjYWxsYmFja3MuZmFpbGVkICYmXG4gICAgICAgICAgICAgICAgIWNhbGxiYWNrcy5lcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FsbGJhY2tzLnJlYWR5ID0gY2FsbGJhY2tzLnJlYWR5IHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBjYWxsYmFja3MucHJvZ3Jlc3MgPSBjYWxsYmFja3MucHJvZ3Jlc3MgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5kb25lID0gY2FsbGJhY2tzLmRvbmUgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5mYWlsZWQgPSBjYWxsYmFja3MuZmFpbGVkIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBjYWxsYmFja3MuZXJyb3IgPSBjYWxsYmFja3MuZXJyb3IgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9yIHVzZSBieSB0ZXN0cyBvbmx5XG4gICAgICAgICAgICBjYWxsYmFja3MuX3ByZXJlYWR5ID0gY2FsbGJhY2tzLl9wcmVyZWFkeSB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgY2FsbGJhY2tzLl9zdG9wcGVkQWZ0ZXJSZWFkeSA9IGNhbGxiYWNrcy5fc3RvcHBlZEFmdGVyUmVhZHkgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGVtaXR0ZWRSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGRvbmVMb29waW5nID0gZmFsc2U7XG4gICAgICAgICAgICBBc3luYy53aGlsc3QoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiAhZG9uZUxvb3Bpbmc7IH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24obmV4dEl0ZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmZldGNoKGZ1bmN0aW9uKGVyciwgam9iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZXJhdGlvbihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BhdGNoU3RhdGUgPSBqb2IucHJvcGVydGllcygpLmRpc3BhdGNoU3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm90UmVhZHkgPSBkaXNwYXRjaFN0YXRlID09PSBcIlFVRVVFRFwiIHx8IGRpc3BhdGNoU3RhdGUgPT09IFwiUEFSU0lOR1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLl9wcmVyZWFkeShqb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbWl0dGVkUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnJlYWR5KGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWRSZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IERvbid0IGtlZXAgcG9sbGluZyB0aGUgam9iIGlmIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZXIgb25seSBjYXJlcyBhYm91dCB0aGUgYHJlYWR5YCBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vQ2FsbGJhY2tzQWZ0ZXJSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLl9zdG9wcGVkQWZ0ZXJSZWFkeShqb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTG9vcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnByb2dyZXNzKGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0gam9iLnByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hTdGF0ZSA9PT0gXCJET05FXCIgJiYgcHJvcHMuaXNEb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5kb25lKGpvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTG9vcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwYXRjaFN0YXRlID09PSBcIkZBSUxFRFwiICYmIHByb3BzLmlzRmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mYWlsZWQoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZXJhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBBc3luYy5zbGVlcChwZXJpb2QsIG5leHRJdGVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlc3VtZXMgYSBzZWFyY2ggam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHZhciBqb2IgPSBzZXJ2aWNlLmpvYnMoKS5pdGVtKFwibXlzaWRcIik7XG4gICAgICAgICAqICAgICAgam9iLnVucGF1c2UoZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiSk9CIFVOUEFVU0VEXCIpO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCB0aGUgc2VhcmNoIGpvYjogYChlcnIsIGpvYilgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnMve3NlYXJjaF9pZH0vY29udHJvbFxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuSm9iXG4gICAgICAgICAqL1xuICAgICAgICB1bnBhdXNlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgcmVxID0gdGhpcy5wb3N0KFwiY29udHJvbFwiLCB7YWN0aW9uOiBcInVucGF1c2VcIn0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2Ygc2VhcmNoIGpvYnMuIFlvdSBjYW4gY3JlYXRlIGFuZCBsaXN0IHNlYXJjaCBcbiAgICAgKiBqb2JzIHVzaW5nIHRoaXMgY29sbGVjdGlvbiBjb250YWluZXIsIG9yIGdldCBhIHNwZWNpZmljIHNlYXJjaCBqb2IuXG4gICAgICpcbiAgICAgKiBAZW5kcG9pbnQgc2VhcmNoL2pvYnNcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5Db2xsZWN0aW9uXG4gICAgICovICBcbiAgICByb290LkpvYnMgPSByb290LkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5qb2JzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsb2NhbCBpbnN0YW5jZSBvZiBhIGpvYi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIG5ldyBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkpvYn0gQSBuZXcgYHNwbHVua2pzLlNlcnZpY2UuSm9iYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovXG4gICAgICAgIGluc3RhbnRpYXRlRW50aXR5OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgdmFyIHNpZCA9IHByb3BzLmNvbnRlbnQuc2lkO1xuICAgICAgICAgICAgdmFyIGVudGl0eU5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5Kb2IodGhpcy5zZXJ2aWNlLCBzaWQsIGVudGl0eU5hbWVzcGFjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbjpcbiAgICAgICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBTcGx1bmsgdXNlcm5hbWUsIHN1Y2ggYXMgXCJhZG1pblwiLiBBIHZhbHVlIG9mIFwibm9ib2R5XCIgbWVhbnMgbm8gc3BlY2lmaWMgdXNlci4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCB1c2Vycy5cbiAgICAgICAgICogICAgLSBgYXBwYCAoX3N0cmluZ18pOiBUaGUgYXBwIGNvbnRleHQgZm9yIHRoaXMgcmVzb3VyY2UgKHN1Y2ggYXMgXCJzZWFyY2hcIikuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgYXBwcy5cbiAgICAgICAgICogICAgLSBgc2hhcmluZ2AgKF9zdHJpbmdfKTogQSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLiBUaGUgc2hhcmluZyBtb2RlIGNhbiBiZSBcInVzZXJcIiwgXCJhcHBcIiwgXCJnbG9iYWxcIiwgb3IgXCJzeXN0ZW1cIi5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5Kb2JzfSBBIG5ldyBgc3BsdW5ranMuU2VydmljZS5Kb2JzYCBpbnN0YW5jZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkpvYnNcbiAgICAgICAgICovICBcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oc2VydmljZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYmluZGluZ3Mgc28gdGhhdCBldmVyeSBmdW5jdGlvbiB3b3JrcyBcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHdoZW4gaXQgaXMgcGFzc2VkIGFzIGEgY2FsbGJhY2suXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSAgICAgPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMuY3JlYXRlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNlYXJjaCBqb2Igd2l0aCBhIGdpdmVuIHNlYXJjaCBxdWVyeSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycywgaW5jbHVkaW5nIGBleGVjX21vZGVgIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygc2VhcmNoOlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPW5vcm1hbGAgdG8gcmV0dXJuIGEgc2VhcmNoIGpvYiBJRCBpbW1lZGlhdGVseSAoZGVmYXVsdCkuXG4gICAgICAgICAqICAgICAgUG9sbCBmb3IgY29tcGxldGlvbiB0byBmaW5kIG91dCB3aGVuIHlvdSBjYW4gcmV0cmlldmUgc2VhcmNoIHJlc3VsdHMuIFxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAtIFVzZSBgZXhlY19tb2RlPWJsb2NraW5nYCB0byByZXR1cm4gdGhlIHNlYXJjaCBqb2IgSUQgd2hlbiB0aGUgc2VhcmNoIGhhcyBmaW5pc2hlZC5cbiAgICAgICAgICogXG4gICAgICAgICAqIFRvIHJ1biBhIG9uZXNob3Qgc2VhcmNoLCB3aGljaCBkb2VzIG5vdCBjcmVhdGUgYSBqb2IgYnV0IHJhdGhlciByZXR1cm5zIHRoZSBzZWFyY2ggcmVzdWx0cywgdXNlIGBTZXJ2aWNlLkpvYnMub25lc2hvdFNlYXJjaGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc2VhcmNoIGpvYi4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBjcmVhdGVkIGpvYjogYChlcnIsIGNyZWF0ZWRKb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21lb25lIGNhbGxlZCB1cyB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlIG9mIChwYXJhbXMsIGNhbGxiYWNrKSxcbiAgICAgICAgICAgIC8vIGxldHMgbWFrZSBpdCB3b3JrXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNPYmplY3QocXVlcnkpICYmIHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHBhcmFtcy5zZWFyY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSBxdWVyeTsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgocGFyYW1zLmV4ZWNfbW9kZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpID09PSBcIm9uZXNob3RcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSB1c2Ugc3BsdW5ranMuU2VydmljZS5Kb2JzLm9uZXNob3RTZWFyY2ggZm9yIGV4ZWNfbW9kZT1vbmVzaG90XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhcIk11c3QgcHJvdmlkZSBhIHF1ZXJ5IHRvIGNyZWF0ZSBhIHNlYXJjaCBqb2JcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3QoXCJcIiwgcGFyYW1zLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpvYiA9IG5ldyByb290LkpvYih0aGF0LnNlcnZpY2UsIHJlc3BvbnNlLmRhdGEuc2lkLCB0aGF0Lm5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGpvYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2VhcmNoIGpvYiB3aXRoIGEgZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYGV4ZWNfbW9kZWAgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBzZWFyY2g6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9bm9ybWFsYCB0byByZXR1cm4gYSBzZWFyY2ggam9iIElEIGltbWVkaWF0ZWx5IChkZWZhdWx0KS5cbiAgICAgICAgICogICAgICBQb2xsIGZvciBjb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4geW91IGNhbiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0cy4gXG4gICAgICAgICAqXG4gICAgICAgICAqICAgIC0gVXNlIGBleGVjX21vZGU9YmxvY2tpbmdgIHRvIHJldHVybiB0aGUgc2VhcmNoIGpvYiBJRCB3aGVuIHRoZSBzZWFyY2ggaGFzIGZpbmlzaGVkLlxuICAgICAgICAgKiBcbiAgICAgICAgICogVG8gcnVuIGEgb25lc2hvdCBzZWFyY2gsIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBidXQgcmF0aGVyIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHRzLCB1c2UgYFNlcnZpY2UuSm9icy5vbmVzaG90U2VhcmNoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICB2YXIgam9icyA9IHNlcnZpY2Uuam9icygpO1xuICAgICAgICAgKiAgICAgIGpvYnMuc2VhcmNoKFwic2VhcmNoIEVSUk9SXCIsIHtpZDogXCJteWpvYl8xMjNcIn0sIGZ1bmN0aW9uKGVyciwgbmV3Sm9iKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ1JFQVRFRFwiOiBuZXdKb2Iuc2lkKTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgZm9yIHRoZSBzZWFyY2ggam9iLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXYuc3BsdW5rLmNvbS92aWV3L1NQLUNBQUFFRkEjc2VhcmNoam9icGFyYW1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2VhcmNoIGpvYiBwYXJhbWV0ZXJzPC9hPiBvbiBTcGx1bmsgRGV2ZWxvcGVyIFBvcnRhbC5cbiAgICAgICAgICogICAgICAgICoqTm90ZToqKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBleGVjX21vZGU9b25lc2hvdGAgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBwcm9wZXJ0aWVzIGRpY3Rpb25hcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBuZXcgc2VhcmNoIGpvYjogYChlcnIsIGNyZWF0ZWRKb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUocXVlcnksIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG9uZXNob3Qgc2VhcmNoIGZyb20gYSBnaXZlbiBzZWFyY2ggcXVlcnkgYW5kIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgdmFyIGpvYnMgPSBzZXJ2aWNlLmpvYnMoKTtcbiAgICAgICAgICogICAgICBqb2JzLm9uZXNob3RTZWFyY2goXCJzZWFyY2ggRVJST1JcIiwge2lkOiBcIm15am9iXzEyM1wifSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKFwiUkVTVUxUIEZJRUxEU1wiOiByZXN1bHRzLmZpZWxkcyk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LiBcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaDpcbiAgICAgICAgICogICAgLSBgb3V0cHV0X21vZGVgIChfc3RyaW5nXyk6IFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgcmVzdWx0cyAoWE1MLCBKU09OLCBvciBDU1YpLlxuICAgICAgICAgKiAgICAtIGBlYXJsaWVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGVhcmxpZXN0IHRpbWUgaW4gdGhlIHRpbWUgcmFuZ2UgdG8gc2VhcmNoLiBUaGUgdGltZSBzdHJpbmcgY2FuIGJlIGEgVVRDIHRpbWUgKHdpdGggZnJhY3Rpb25hbCBzZWNvbmRzKSwgYSByZWxhdGl2ZSB0aW1lIHNwZWNpZmllciAodG8gbm93KSwgb3IgYSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXG4gICAgICAgICAqICAgIC0gYGxhdGVzdF90aW1lYCAoX3N0cmluZ18pOiBTcGVjaWZpZXMgdGhlIGxhdGVzdCB0aW1lIGluIHRoZSB0aW1lIHJhbmdlIHRvIHNlYXJjaC4gVGhlIHRpbWUgc3RyaW5nIGNhbiBiZSBhIFVUQyB0aW1lICh3aXRoIGZyYWN0aW9uYWwgc2Vjb25kcyksIGEgcmVsYXRpdmUgdGltZSBzcGVjaWZpZXIgKHRvIG5vdyksIG9yIGEgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgICAgICAgKiAgICAtIGByZmAgKF9zdHJpbmdfKTogU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpZWxkcyB0byBhZGQgdG8gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaDogYChlcnIsIHJlc3VsdHMpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGVuZHBvaW50IHNlYXJjaC9qb2JzXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5Kb2JzXG4gICAgICAgICAqL1xuICAgICAgICBvbmVzaG90U2VhcmNoOiBmdW5jdGlvbihxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsZWQgdXMgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZSBvZiAocGFyYW1zLCBjYWxsYmFjayksXG4gICAgICAgICAgICAvLyBsZXRzIG1ha2UgaXQgd29ya1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KHF1ZXJ5KSAmJiB1dGlscy5pc0Z1bmN0aW9uKHBhcmFtcykgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcXVlcnk7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBwYXJhbXMuc2VhcmNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gcXVlcnk7IFxuICAgICAgICAgICAgcGFyYW1zLmV4ZWNfbW9kZSA9IFwib25lc2hvdFwiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhcIk11c3QgcHJvdmlkZSBhIHF1ZXJ5IHRvIGNyZWF0ZSBhIHNlYXJjaCBqb2JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvdXRwdXRNb2RlID0gcGFyYW1zLm91dHB1dF9tb2RlIHx8IFwianNvbl9yb3dzXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy5xdWFsaWZpZWRQYXRoO1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIHZhciBwb3N0ID0gcGFyYW1zO1xuICAgICAgICAgICAgdmFyIGdldCA9IHtvdXRwdXRfbW9kZTogb3V0cHV0TW9kZX07XG4gICAgICAgICAgICB2YXIgYm9keSA9IG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciByZXEgPSB0aGlzLnNlcnZpY2UucmVxdWVzdChcbiAgICAgICAgICAgICAgICBwYXRoLCBcbiAgICAgICAgICAgICAgICBtZXRob2QsIFxuICAgICAgICAgICAgICAgIGdldCwgXG4gICAgICAgICAgICAgICAgcG9zdCwgXG4gICAgICAgICAgICAgICAgYm9keSwgXG4gICAgICAgICAgICAgICAgaGVhZGVycywgXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZmllbGQgb2YgYSBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIGZvciBgRGF0YU1vZGVsQ2FsY3VsYXRpb25gXG4gICAgICogYW5kIGBEYXRhTW9kZWxPYmplY3RgLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgZmllbGROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiAgQSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkLlxuICAgICAqICAgIC0gYHR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgZmllbGQuXG4gICAgICogICAgLSBgbXVsdGl2YWx1ZWRgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgbXVsdGl2YWx1ZWQuXG4gICAgICogICAgLSBgcmVxdWlyZWRgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuXG4gICAgICogICAgLSBgaGlkZGVuYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBkYXRhIG1vZGVsIFVJLlxuICAgICAqICAgIC0gYGVkaXRhYmxlYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQuXG4gICAgICogICAgLSBgY29tbWVudGAgKF9zdHJpbmdfKTogQSBjb21tZW50IGZvciB0aGlzIGZpZWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAqICAgIC0gYGZpZWxkU2VhcmNoYCAoX3N0cmluZ18pOiBBIHNlYXJjaCBxdWVyeSBmcmFnbWVudCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIHN0cmluZ3Mgb2YgdGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWxcbiAgICAgKiAgICAgICAgICBvbiB3aGljaCB0aGlzIGZpZWxkIGlzIGRlZmluZWQuXG4gICAgICogICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBvbiB3aGljaCB0aGlzIGZpZWxkIGlzIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB0eXBlcyBmb3IgYSBkYXRhIG1vZGVsIGZpZWxkOlxuICAgICAqICAgIC0gYHN0cmluZ2BcbiAgICAgKiAgICAtIGBib29sZWFuYFxuICAgICAqICAgIC0gYG51bWJlcmBcbiAgICAgKiAgICAtIGB0aW1lc3RhbXBgXG4gICAgICogICAgLSBgb2JqZWN0Q291bnRgXG4gICAgICogICAgLSBgY2hpbGRDb3VudGBcbiAgICAgKiAgICAtIGBpcHY0YFxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbEZpZWxkID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgX3R5cGVzOiBbIFwic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwidGltZXN0YW1wXCIsIFwib2JqZWN0Q291bnRcIiwgXCJjaGlsZENvdW50XCIsIFwiaXB2NFwiLCBcImJvb2xlYW5cIl0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGRhdGEgbW9kZWwgZmllbGQuXG4gICAgICAgICAqIFNESyB1c2VycyBhcmUgbm90IGV4cGVjdGVkIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHRvIHNldDpcbiAgICAgICAgICogICAgIC0gYGZpZWxkTmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgICAgICogICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQuXG4gICAgICAgICAqICAgICAtIGB0eXBlYCAoX3N0cmluZ18pOiBUaGUgdHlwZSBvZiB0aGlzIGZpZWxkLCBzZWUgdmFsaWQgdHlwZXMgaW4gY2xhc3MgZG9jcy5cbiAgICAgICAgICogICAgIC0gYG11bHRpdmFsdWVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgbXVsdGl2YWx1ZWQuXG4gICAgICAgICAqICAgICAtIGByZXF1aXJlZGAgKF9ib29sZWFuXyk6IFdoZXRoZXIgdGhpcyBmaWVsZCBpcyByZXF1aXJlZCBvbiBldmVudHMgaW4gdGhlIG9iamVjdFxuICAgICAgICAgKiAgICAgLSBgaGlkZGVuYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGZpZWxkIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBkYXRhIG1vZGVsIFVJLlxuICAgICAgICAgKiAgICAgLSBgZWRpdGFibGVgIChfYm9vbGVhbl8pOiBXaGV0aGVyIHRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZC5cbiAgICAgICAgICogICAgIC0gYGNvbW1lbnRgIChfc3RyaW5nXyk6IEEgY29tbWVudCBmb3IgdGhpcyBmaWVsZCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzbid0IG9uZS5cbiAgICAgICAgICogICAgIC0gYGZpZWxkU2VhcmNoYCAoX3N0cmluZ18pOiBBIHNlYXJjaCBxdWVyeSBmcmFnbWVudCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgICAgICogICAgIC0gYGxpbmVhZ2VgIChfc3RyaW5nXyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBvbiB3aGljaCB0aGlzIGZpZWxkXG4gICAgICAgICAqICAgICAgICAgIGlzIGRlZmluZWQsIGl0ZW1zIGFyZSBkZWxpbWl0ZWQgYnkgYSBkb3QuIFRoaXMgaXMgY29udmVydGVkIGludG8gYW4gYXJyYXkgb2ZcbiAgICAgICAgICogICAgICAgICAgc3RyaW5ncyB1cG9uIGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIHByb3BzLm93bmVyID0gcHJvcHMub3duZXIgfHwgXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5uYW1lICAgICAgICAgICA9IHByb3BzLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgICAgPSBwcm9wcy5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHRoaXMudHlwZSAgICAgICAgICAgPSBwcm9wcy50eXBlO1xuICAgICAgICAgICAgdGhpcy5tdWx0aXZhbHVlZCAgICA9IHByb3BzLm11bHRpdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVkICAgICAgID0gcHJvcHMucmVxdWlyZWQ7XG4gICAgICAgICAgICB0aGlzLmhpZGRlbiAgICAgICAgID0gcHJvcHMuaGlkZGVuO1xuICAgICAgICAgICAgdGhpcy5lZGl0YWJsZSAgICAgICA9IHByb3BzLmVkaXRhYmxlO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50ICAgICAgICA9IHByb3BzLmNvbW1lbnQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmllbGRTZWFyY2ggICAgPSBwcm9wcy5maWVsZFNlYXJjaDtcbiAgICAgICAgICAgIHRoaXMubGluZWFnZSAgICAgICAgPSBwcm9wcy5vd25lci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB0aGlzLm93bmVyICAgICAgICAgID0gdGhpcy5saW5lYWdlW3RoaXMubGluZWFnZS5sZW5ndGggLSAxXTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgc3RyaW5nP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIHN0cmluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBudW1iZXI/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgbnVtYmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsRmllbGRcbiAgICAgICAgICovXG4gICAgICAgIGlzTnVtYmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm51bWJlclwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBvZiB0eXBlIHRpbWVzdGFtcD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgZmllbGQgaXMgb2YgdHlwZSB0aW1lc3RhbXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNUaW1lc3RhbXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwidGltZXN0YW1wXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgb2JqZWN0IGNvdW50P1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIG9iamVjdCBjb3VudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpc09iamVjdGNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm9iamVjdENvdW50XCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIG9mIHR5cGUgY2hpbGQgY291bnQ/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGZpZWxkIGlzIG9mIHR5cGUgY2hpbGQgY291bnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNDaGlsZGNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcImNoaWxkQ291bnRcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBpcHY0P1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIGlwdjQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNJUHY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcImlwdjRcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgZmllbGQgb2YgdHlwZSBib29sZWFuP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBmaWVsZCBpcyBvZiB0eXBlIGJvb2xlYW4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgKi9cbiAgICAgICAgaXNCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcImJvb2xlYW5cIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbnN0cmFpbnQgb24gYSBgRGF0YU1vZGVsT2JqZWN0YCBvciBhIGBEYXRhTW9kZWxGaWVsZGAuXG4gICAgICpcbiAgICAgKiBIYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKiAgICAtIGBxdWVyeWAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBxdWVyeSBkZWZpbmluZyB0aGlzIGRhdGEgbW9kZWwgY29uc3RyYWludC5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IFRoZSBsaW5lYWdlIG9mIHRoaXMgZGF0YSBtb2RlbCBjb25zdHJhaW50LlxuICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCBvYmplY3QgdGhhdCBvd25zXG4gICAgICogICAgICAgICAgdGhpcyBkYXRhIG1vZGVsIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDb25zdHJhaW50XG4gICAgICovXG4gICAgcm9vdC5EYXRhTW9kZWxDb25zdHJhaW50ID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGRhdGEgbW9kZWwgY29uc3RyYWludC5cbiAgICAgICAgICogU0RLIHVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHNlYXJjaCBxdWVyeSB0aGlzIGNvbnN0cmFpbnQgc3BlY2lmaWVzLlxuICAgICAgICAgKiAgICAgLSBgb3duZXJgIChfc3RyaW5nXyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCB0aGF0IG93bnMgdGhpc1xuICAgICAgICAgKiAgICAgICAgICBjb25zdHJhaW50LCBpdGVtcyBhcmUgZGVsaW1pdGVkIGJ5IGEgZG90LiBUaGlzIGlzIGNvbnZlcnRlZCBpbnRvXG4gICAgICAgICAqICAgICAgICAgIGFuIGFycmF5IG9mIHN0cmluZ3MgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDb25zdHJhaW50XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIHByb3BzLm93bmVyID0gcHJvcHMub3duZXIgfHwgXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5xdWVyeSAgID0gcHJvcHMuc2VhcmNoO1xuICAgICAgICAgICAgdGhpcy5saW5lYWdlID0gcHJvcHMub3duZXIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgdGhpcy5vd25lciAgID0gdGhpcy5saW5lYWdlW3RoaXMubGluZWFnZS5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHNwZWNpZnlpbmcgYSBjYWxjdWxhdGlvbiBvbiBhIGBEYXRhTW9kZWxPYmplY3RgLlxuICAgICAqXG4gICAgICogSGFzIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgICogICAgLSBgaWRgIChfc3RyaW5nXyk6IFRoZSBJRCBmb3IgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uLlxuICAgICAqICAgIC0gYHR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbi5cbiAgICAgKiAgICAtIGBjb21tZW50YCAoX3N0cmluZ198X251bGxfKTogVGhlIGNvbW1lbnQgZm9yIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiwgb3IgYG51bGxgLlxuICAgICAqICAgIC0gYGVkaXRhYmxlYCAoX2Jvb2xlYW5fKTogVHJ1ZSBpZiB0aGlzIGNhbGN1bGF0aW9uIGNhbiBiZSBlZGl0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBvbiB3aGljaCB0aGlzIGNhbGN1bGF0aW9uXG4gICAgICogICAgICAgICAgaXMgZGVmaW5lZCBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgZGF0YSBtb2RlbCB0aGF0IHRoaXMgY2FsY3VsYXRpb24gYmVsb25ncyB0by5cbiAgICAgKiAgICAtIGBvdXRwdXRGaWVsZHNgIChfYXJyYXlfKTogVGhlIGZpZWxkcyBvdXRwdXQgYnkgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBSZXggYW5kIEV2YWwgdHlwZXMgaGF2ZSBhbiBhZGRpdGlvbmFsIHByb3BlcnR5OlxuICAgICAqICAgIC0gYGV4cHJlc3Npb25gIChfc3RyaW5nXyk6IFRoZSBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBSZXggYW5kIEdlb0lQIHR5cGVzIGhhdmUgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eTpcbiAgICAgKiAgICAtIGBpbnB1dEZpZWxkYCAoX3N0cmluZ18pOiBUaGUgZmllbGQgdG8gdXNlIGZvciBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBMb29rdXAgdHlwZSBoYXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGxvb2t1cE5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoZSBsb29rdXAgdG8gcGVyZm9ybS5cbiAgICAgKiAgICAtIGBpbnB1dEZpZWxkTWFwcGluZ3NgIChfb2JqZWN0Xyk6IFRoZSBtYXBwaW5ncyBmcm9tIGZpZWxkcyBpbiB0aGUgZXZlbnRzIHRvIGZpZWxkcyBpbiB0aGUgbG9va3VwLlxuICAgICAqXG4gICAgICogVmFsaWQgdHlwZXMgb2YgY2FsY3VsYXRpb25zIGFyZTpcbiAgICAgKiAgICAtIGBMb29rdXBgXG4gICAgICogICAgLSBgRXZhbGBcbiAgICAgKiAgICAtIGBHZW9JUGBcbiAgICAgKiAgICAtIGBSZXhgXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsQ2FsY3VsYXRpb24gPSBDbGFzcy5leHRlbmQoe1xuICAgICAgICBfdHlwZXM6IFtcIkxvb2t1cFwiLCBcIkV2YWxcIiwgXCJHZW9JUFwiLCBcIlJleFwiXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbi5cbiAgICAgICAgICogU0RLIHVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gc2V0OlxuICAgICAgICAgKiAgICAgLSBgY2FsY3VsYXRpb25JRGAgKF9zdHJpbmdfKTogVGhlIElEIG9mIHRoaXMgY2FsY3VsYXRpb24uXG4gICAgICAgICAqICAgICAtIGBjYWxjdWxhdGlvblR5cGVgIChfc3RyaW5nXyk6IFRoZSB0eXBlIG9mIHRoaXMgY2FsY3VsYXRpb24sIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogICAgIC0gYGVkaXRhYmxlYCAoX2Jvb2xlYW5fKTogV2hldGhlciB0aGlzIGNhbGN1bGF0aW9uIGNhbiBiZSBlZGl0ZWQuXG4gICAgICAgICAqICAgICAtIGBjb21tZW50YCAoX3N0cmluZ18pOiBBIGNvbW1lbnQgZm9yIHRoaXMgY2FsY3VsYXRpb24sIG9yIGBudWxsYCBpZiB0aGVyZSBpc24ndCBvbmUuXG4gICAgICAgICAqICAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IG9uIHdoaWNoIHRoaXMgY2FsY3VsYXRpb25cbiAgICAgICAgICogICAgICAgICAgaXMgZGVmaW5lZCwgaXRlbXMgYXJlIGRlbGltaXRlZCBieSBhIGRvdC4gVGhpcyBpcyBjb252ZXJ0ZWQgaW50byBhbiBhcnJheSBvZlxuICAgICAgICAgKiAgICAgICAgICBzdHJpbmdzIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgICAgKiAgICAgLSBgb3V0cHV0RmllbGRzYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIHRoZSBmaWVsZHMgdGhpcyBjYWxjdWxhdGlvbiBnZW5lcmF0ZXMuXG4gICAgICAgICAqICAgICAtIGBleHByZXNzaW9uYCAoX3N0cmluZ18pOiBUaGUgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoaXMgY2FsY3VsYXRpb247IGV4Y2x1c2l2ZSB0byBgRXZhbGAgYW5kIGBSZXhgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBpbnB1dEZpZWxkYCAoX3N0cmluZ18pOiBUaGUgZmllbGQgdG8gdXNlIGZvciBjYWxjdWxhdGlvbjsgZXhjbHVzaXZlIHRvIGBHZW9JUGAgYW5kIGBSZXhgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqICAgICAtIGBsb29rdXBOYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgbG9va3VwIHRvIHBlcmZvcm07IGV4Y2x1c2l2ZSB0byBgTG9va3VwYCBjYWxjdWxhdGlvbnMgKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgaW5wdXRGaWVsZE1hcHBpbmdzYCAoX2FycmF5Xyk6IE9uZSBlbGVtZW50IGFycmF5IGNvbnRhaW5pbmcgYW4gb2JqZWN0IHdpdGggdGhlIG1hcHBpbmdzIGZyb20gZmllbGRzIGluIHRoZSBldmVudHMgdG8gZmllbGRzXG4gICAgICAgICAqICAgICAgICAgaW4gdGhlIGxvb2t1cDsgZXhjbHVzaXZlIHRvIGBMb29rdXBgIGNhbGN1bGF0aW9ucyAob3B0aW9uYWwpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdDogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgfHwge307XG4gICAgICAgICAgICBwcm9wcy5vd25lciA9IHByb3BzLm93bmVyIHx8IFwiXCI7XG5cbiAgICAgICAgICAgIHRoaXMuaWQgICAgICAgICAgICAgPSBwcm9wcy5jYWxjdWxhdGlvbklEO1xuICAgICAgICAgICAgdGhpcy50eXBlICAgICAgICAgICA9IHByb3BzLmNhbGN1bGF0aW9uVHlwZTtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCAgICAgICAgPSBwcm9wcy5jb21tZW50IHx8IG51bGw7XG4gICAgICAgICAgICB0aGlzLmVkaXRhYmxlICAgICAgID0gcHJvcHMuZWRpdGFibGU7XG4gICAgICAgICAgICB0aGlzLmxpbmVhZ2UgICAgICAgID0gcHJvcHMub3duZXIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgdGhpcy5vd25lciAgICAgICAgICA9IHRoaXMubGluZWFnZVt0aGlzLmxpbmVhZ2UubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgIHRoaXMub3V0cHV0RmllbGRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLm91dHB1dEZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0RmllbGRzW3Byb3BzLm91dHB1dEZpZWxkc1tpXS5maWVsZE5hbWVdID0gbmV3IHJvb3QuRGF0YU1vZGVsRmllbGQocHJvcHMub3V0cHV0RmllbGRzW2ldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFwiRXZhbFwiID09PSB0aGlzLnR5cGUgfHwgXCJSZXhcIiA9PT0gdGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gcHJvcHMuZXhwcmVzc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcIkdlb0lQXCIgPT09IHRoaXMudHlwZSB8fCBcIlJleFwiID09PSB0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RmllbGQgPSBwcm9wcy5pbnB1dEZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiTG9va3VwXCIgPT09IHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9va3VwTmFtZSA9IHByb3BzLmxvb2t1cE5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEZpZWxkTWFwcGluZ3MgPSBwcm9wcy5sb29rdXBJbnB1dHNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiBvdXRwdXQgZmllbGQgbmFtZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIG9mIG91dHB1dCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRGaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm91dHB1dEZpZWxkcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBlZGl0YWJsZT9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgZWRpdGFibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxDYWxjdWxhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgaXNFZGl0YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmVkaXRhYmxlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gb2YgdHlwZSBsb29rdXA/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGlzIG9mIHR5cGUgbG9va3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsQ2FsY3VsYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGlzTG9va3VwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkxvb2t1cFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBvZiB0eXBlIGV2YWw/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIGlzIG9mIHR5cGUgZXZhbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc0V2YWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiRXZhbFwiID09PSB0aGlzLnR5cGU7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIGNhbGN1bGF0aW9uIG9mIHR5cGUgUmV4P1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBjYWxjdWxhdGlvbiBpcyBvZiB0eXBlIFJleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc1JleDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJSZXhcIiA9PT0gdGhpcy50eXBlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gb2YgdHlwZSBHZW9JUD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY2FsY3VsYXRpb24gaXMgb2YgdHlwZSBHZW9JUC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbENhbGN1bGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpc0dlb0lQOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkdlb0lQXCIgPT09IHRoaXMudHlwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFBpdm90IHJlcHJlc2VudHMgZGF0YSBhYm91dCBhIHBpdm90IHJlcG9ydCByZXR1cm5lZCBieSB0aGUgU3BsdW5rIFNlcnZlci5cbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYHNlcnZpY2VgIChfc3BsdW5ranMuU2VydmljZV8pOiBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgKiAgICAtIGBzZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggc3RyaW5nIGZvciBydW5uaW5nIHRoZSBwaXZvdCByZXBvcnQuXG4gICAgICogICAgLSBgZHJpbGxkb3duU2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIGZvciBydW5uaW5nIHRoaXMgcGl2b3QgcmVwb3J0IHVzaW5nIGRyaWxsZG93bi5cbiAgICAgKiAgICAtIGBvcGVuSW5TZWFyY2hgIChfc3RyaW5nXyk6IEVxdWl2YWxlbnQgdG8gc2VhcmNoIHBhcmFtZXRlciwgYnV0IGxpc3RlZCBtb3JlIHNpbXBseS5cbiAgICAgKiAgICAtIGBwcmV0dHlRdWVyeWAgKF9zdHJpbmdfKTogRXF1aXZhbGVudCB0byBgb3BlbkluU2VhcmNoYC5cbiAgICAgKiAgICAtIGBwaXZvdFNlYXJjaGAgKF9zdHJpbmdfKTogQSBwaXZvdCBzZWFyY2ggY29tbWFuZCBiYXNlZCBvbiB0aGUgbmFtZWQgZGF0YSBtb2RlbC5cbiAgICAgKiAgICAtIGB0c3RhdHNTZWFyY2hgIChfc3RyaW5nXyk6IFRoZSBzZWFyY2ggZm9yIHJ1bm5pbmcgdGhpcyBwaXZvdCByZXBvcnQgdXNpbmcgdHN0YXRzLlxuICAgICAqXG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RcbiAgICAgKi9cbiAgICByb290LlBpdm90ID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIHBpdm90LlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3BsdW5ranMuU2VydmljZX0gc2VydmljZSBBIGBTZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHRvIHNldDpcbiAgICAgICAgICogICAgLSBgc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHN0cmluZyBmb3IgcnVubmluZyB0aGUgcGl2b3QgcmVwb3J0LlxuICAgICAgICAgKiAgICAtIGBkcmlsbGRvd25fc2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIGZvciBydW5uaW5nIHRoaXMgcGl2b3QgcmVwb3J0IHVzaW5nIGRyaWxsZG93bi5cbiAgICAgICAgICogICAgLSBgb3Blbl9pbl9zZWFyY2hgIChfc3RyaW5nXyk6IEVxdWl2YWxlbnQgdG8gc2VhcmNoIHBhcmFtZXRlciwgYnV0IGxpc3RlZCBtb3JlIHNpbXBseS5cbiAgICAgICAgICogICAgLSBgcGl2b3Rfc2VhcmNoYCAoX3N0cmluZ18pOiBBIHBpdm90IHNlYXJjaCBjb21tYW5kIGJhc2VkIG9uIHRoZSBuYW1lZCBkYXRhIG1vZGVsLlxuICAgICAgICAgKiAgICAtIGB0c3RhdHNfc2VhcmNoYCAoX3N0cmluZ198X251bGxfKTogVGhlIHNlYXJjaCBmb3IgcnVubmluZyB0aGlzIHBpdm90IHJlcG9ydCB1c2luZyB0c3RhdHMsIG51bGwgaWYgYWNjZWxlcmF0aW9uIGlzIGRpc2FibGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIHByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2ggPSBwcm9wcy5zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLmRyaWxsZG93blNlYXJjaCA9IHByb3BzLmRyaWxsZG93bl9zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLnByZXR0eVF1ZXJ5ID0gdGhpcy5vcGVuSW5TZWFyY2ggPSBwcm9wcy5vcGVuX2luX3NlYXJjaDtcbiAgICAgICAgICAgIHRoaXMucGl2b3RTZWFyY2ggPSBwcm9wcy5waXZvdF9zZWFyY2g7XG4gICAgICAgICAgICB0aGlzLnRzdGF0c1NlYXJjaCA9IHByb3BzLnRzdGF0c19zZWFyY2ggfHwgbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5ydW4gPSB1dGlscy5iaW5kKHRoaXMsIHRoaXMucnVuKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnRzIGEgc2VhcmNoIGpvYiBydW5uaW5nIHRoaXMgcGl2b3QsIGFjY2VsZXJhdGVkIGlmIHBvc3NpYmxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJncyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IgKG9wdGlvbmFsKS4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqICAgICAgICAqKk5vdGU6KiogVGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBgZXhlY19tb2RlPW9uZXNob3RgIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcHJvcGVydGllcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBkb25lIGNyZWF0aW5nIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgam9iKWAuXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFxuICAgICAgICAgKi9cbiAgICAgICAgcnVuOiBmdW5jdGlvbihhcmdzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYXJncztcbiAgICAgICAgICAgICAgICBhcmdzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFyZ3MgfHwgT2JqZWN0LmtleXMoYXJncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0c3RhdHMgaXMgdW5kZWZpbmVkLCB1c2UgcGl2b3RTZWFyY2ggKHRyeSB0byBydW4gYW4gYWNjZWxlcmF0ZWQgc2VhcmNoIGlmIHBvc3NpYmxlKVxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNlYXJjaCh0aGlzLnRzdGF0c1NlYXJjaCB8fCB0aGlzLnBpdm90U2VhcmNoLCBhcmdzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFBpdm90U3BlY2lmaWNhdGlvbiByZXByZXNlbnRzIGEgcGl2b3QgdG8gYmUgZG9uZSBvbiBhIHBhcnRpY3VsYXIgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICogVGhlIHVzZXIgY3JlYXRlcyBhIFBpdm90U3BlY2lmaWNhdGlvbiBvbiBzb21lIGRhdGEgbW9kZWwgb2JqZWN0LCBhZGRzIGZpbHRlcnMsIHJvdyBzcGxpdHMsXG4gICAgICogY29sdW1uIHNwbGl0cywgYW5kIGNlbGwgdmFsdWVzLCB0aGVuIGNhbGxzIHRoZSBwaXZvdCBtZXRob2QgdG8gcXVlcnkgc3BsdW5rZCBhbmRcbiAgICAgKiBnZXQgYSBzZXQgb2YgU1BMIHF1ZXJpZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHNwZWNpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBDYWxsIHRoZSBgcGl2b3RgIG1ldGhvZCB0byBxdWVyeSBTcGx1bmsgZm9yIFNQTCBxdWVyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwaXZvdC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYSBmbHVlbnQgQVBJLCBlYWNoIGZ1bmN0aW9uIGV4Y2VwdCBgaW5pdGAsIGB0b0pzb25PYmplY3RgICYgYHBpdm90YFxuICAgICAqIHJldHVybiB0aGUgbW9kaWZpZWQgYHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICAgIHNlcnZpY2UuZGF0YU1vZGVscygpLmZldGNoKGZ1bmN0aW9uKGVyciwgZGF0YU1vZGVscykge1xuICAgICAqICAgICAgICAgdmFyIHNlYXJjaGVzID0gZGF0YU1vZGVscy5pdGVtKFwiaW50ZXJuYWxfYXVkaXRfbG9nc1wiKS5vYmplY3RCeU5hbWUoXCJzZWFyY2hlc1wiKTtcbiAgICAgKiAgICAgICAgIHZhciBwaXZvdFNwZWNpZmljYXRpb24gPSBzZWFyY2hlcy5jcmVhdGVQaXZvdFNwZWNpZmljYXRpb24oKTtcbiAgICAgKiAgICAgICAgIHBpdm90U3BlY2lmaWNhdGlvblxuICAgICAqICAgICAgICAgICAgIC5hZGRSb3dTcGxpdChcInVzZXJcIiwgXCJFeGVjdXRpbmcgdXNlclwiKVxuICAgICAqICAgICAgICAgICAgIC5hZGRSYW5nZUNvbHVtblNwbGl0KFwiZXhlY190aW1lXCIsIHtsaW1pdDogNH0pXG4gICAgICogICAgICAgICAgICAgLmFkZENlbGxWYWx1ZShcInNlYXJjaFwiLCBcIlNlYXJjaCBRdWVyeVwiLCBcInZhbHVlc1wiKVxuICAgICAqICAgICAgICAgICAgIC5waXZvdChmdW5jdGlvbihlcnIsIHBpdm90KSB7XG4gICAgICogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR290IGEgUGl2b3Qgb2JqZWN0IGZyb20gdGhlIFNwbHVuayBzZXJ2ZXIhXCIpO1xuICAgICAqICAgICAgICAgICAgIH0pO1xuICAgICAqICAgICB9KTtcbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGRhdGFNb2RlbE9iamVjdGAgKF9zcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdF8pOiBUaGUgYERhdGFNb2RlbE9iamVjdGAgZnJvbSB3aGljaFxuICAgICAqICAgICAgICB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gIHdhcyBjcmVhdGVkLlxuICAgICAqICAgIC0gYGNvbHVtbnNgIChfYXJyYXlfKTogVGhlIGNvbHVtbiBzcGxpdHMgb24gdGhpcyBgUGl2b3RTcGVjaWZpY2F0aW9uYC5cbiAgICAgKiAgICAtIGByb3dzYCAoX2FycmF5Xyk6IFRoZSByb3cgc3BsaXRzIG9uIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAuXG4gICAgICogICAgLSBgZmlsdGVyc2AgKF9hcnJheV8pOiBUaGUgZmlsdGVycyBvbiB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAqICAgIC0gYGNlbGxzYCAoX2FycmF5Xyk6IFRoZSBjZWxsIGFnZ3JlZ2F0aW9ucyBmb3IgdGhpc2BQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAqICAgIC0gYGFjY2VsZXJhdGlvbk5hbWVzcGFjZWAgKF9zdHJpbmdffF9udWxsXyk6IFRoZSBuYW1lIG9mIHRoZSBgRGF0YU1vZGVsYCB0aGF0IG93bnMgdGhlIGBEYXRhTW9kZWxPYmplY3RgXG4gICAgICogICAgICAgIG9uIHdoaWNoIHRoaXMgYFBpdm90U3BlY2lmaWNhdGlvbmAgd2FzIGNyZWF0ZWQgaWYgdGhlIGBEYXRhTW9kZWxgIGlzIGFjY2VsZXJhdGVkLiBBbHRlcm5hdGl2ZWx5LFxuICAgICAqICAgICAgICB5b3UgY2FuIHNldCB0aGlzIHByb3BlcnR5IG1hbnVhbGx5IHRvIHRoZSBzaWQgb2YgYW4gYWNjZWxlcmF0aW9uIGpvYiBpbiB0aGUgZm9ybWF0IGBzaWQ9PHNpZD5gLlxuICAgICAqXG4gICAgICogVmFsaWQgY29tcGFyaXNvbiB0eXBlcyBhcmU6XG4gICAgICogICAgLSBgYm9vbGVhbmBcbiAgICAgKiAgICAtIGBzdHJpbmdgXG4gICAgICogICAgLSBgbnVtYmVyYFxuICAgICAqICAgIC0gYGlwdjRgXG4gICAgICpcbiAgICAgKiBWYWxpZCBib29sZWFuIGNvbXBhcmlzb25zIGFyZTpcbiAgICAgKiAgICAtIGA9YFxuICAgICAqICAgIC0gYGlzYFxuICAgICAqICAgIC0gYGlzTnVsbGBcbiAgICAgKiAgICAtIGBpc05vdE51bGxgXG4gICAgICpcbiAgICAgKiBWYWxpZCBzdHJpbmcgY29tcGFyaXNvbnMgYXJlOlxuICAgICAqICAgIC0gYD1gXG4gICAgICogICAgLSBgaXNgXG4gICAgICogICAgLSBgaXNOdWxsYFxuICAgICAqICAgIC0gYGlzTm90TnVsbGBcbiAgICAgKiAgICAtIGBjb250YWluc2BcbiAgICAgKiAgICAtIGBkb2VzTm90Q29udGFpbmBcbiAgICAgKiAgICAtIGBzdGFydHNXaXRoYFxuICAgICAqICAgIC0gYGVuZHNXaXRoYFxuICAgICAqICAgIC0gYHJlZ2V4YFxuICAgICAqXG4gICAgICogVmFsaWQgbnVtYmVyIGNvbXBhcmlzb25zIGFyZTpcbiAgICAgKiAgICAtIGA9YFxuICAgICAqICAgIC0gYCE9YFxuICAgICAqICAgIC0gYDxgXG4gICAgICogICAgLSBgPmBcbiAgICAgKiAgICAtIGA8PWBcbiAgICAgKiAgICAtIGA+PWBcbiAgICAgKiAgICAtIGBpc2BcbiAgICAgKiAgICAtIGBpc051bGxgXG4gICAgICogICAgLSBgaXNOb3ROdWxsYFxuICAgICAqXG4gICAgICogVmFsaWQgaXB2NCBjb21wYXJpc29ucyBhcmU6XG4gICAgICogICAgLSBgaXNgXG4gICAgICogICAgLSBgaXNOdWxsYFxuICAgICAqICAgIC0gYGlzTm90TnVsbGBcbiAgICAgKiAgICAtIGBjb250YWluc2BcbiAgICAgKiAgICAtIGBkb2VzTm90Q29udGFpbmBcbiAgICAgKiAgICAtIGBzdGFydHNXaXRoYFxuICAgICAqXG4gICAgICogVmFsaWQgYmlubmluZyB2YWx1ZXMgYXJlOlxuICAgICAqICAgIC0gYGF1dG9gXG4gICAgICogICAgLSBgeWVhcmBcbiAgICAgKiAgICAtIGBtb250aGBcbiAgICAgKiAgICAtIGBkYXlgXG4gICAgICogICAgLSBgaG91cmBcbiAgICAgKiAgICAtIGBtaW51dGVgXG4gICAgICogICAgLSBgc2Vjb25kYFxuICAgICAqXG4gICAgICogVmFsaWQgc29ydCBkaXJlY3Rpb25zIGFyZTpcbiAgICAgKiAgICAtIGBBU0NFTkRJTkdgXG4gICAgICogICAgLSBgREVDRU5ESU5HYFxuICAgICAqICAgIC0gYERFRkFVTFRgXG4gICAgICpcbiAgICAgKiBWYWxpZCBzdGF0cyBmdW5jdGlvbnMgYXJlOlxuICAgICAqICAgIC0gYGxpc3RgXG4gICAgICogICAgLSBgdmFsdWVzYFxuICAgICAqICAgIC0gYGZpcnN0YFxuICAgICAqICAgIC0gYGxhc3RgXG4gICAgICogICAgLSBgY291bnRgXG4gICAgICogICAgLSBgZGNgXG4gICAgICogICAgLSBgc3VtYFxuICAgICAqICAgIC0gYGF2ZXJhZ2VgXG4gICAgICogICAgLSBgbWF4YFxuICAgICAqICAgIC0gYG1pbmBcbiAgICAgKiAgICAtIGBzdGRldmBcbiAgICAgKiAgICAtIGBkdXJhdGlvbmBcbiAgICAgKiAgICAtIGBlYXJsaWVzdGBcbiAgICAgKiAgICAtIGBsYXRlc3RgXG4gICAgICpcbiAgICAgKiBAY2xhc3Mgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgKi9cbiAgICByb290LlBpdm90U3BlY2lmaWNhdGlvbiA9IENsYXNzLmV4dGVuZCh7XG4gICAgICAgIF9jb21wYXJpc29uczoge1xuICAgICAgICAgICAgYm9vbGVhbjogW1wiPVwiLCBcImlzXCIsIFwiaXNOdWxsXCIsIFwiaXNOb3ROdWxsXCJdLFxuICAgICAgICAgICAgc3RyaW5nOiBbXCI9XCIsIFwiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIiwgXCJjb250YWluc1wiLCBcImRvZXNOb3RDb250YWluXCIsIFwic3RhcnRzV2l0aFwiLCBcImVuZHNXaXRoXCIsIFwicmVnZXhcIl0sXG4gICAgICAgICAgICBudW1iZXI6IFtcIj1cIiwgXCIhPVwiLCBcIjxcIiwgXCI+XCIsIFwiPD1cIiwgXCI+PVwiLCBcImlzXCIsIFwiaXNOdWxsXCIsIFwiaXNOb3ROdWxsXCJdLFxuICAgICAgICAgICAgaXB2NDogW1wiaXNcIiwgXCJpc051bGxcIiwgXCJpc05vdE51bGxcIiwgXCJjb250YWluc1wiLCBcImRvZXNOb3RDb250YWluXCIsIFwic3RhcnRzV2l0aFwiXVxuICAgICAgICB9LFxuICAgICAgICBfYmlubmluZzogW1wiYXV0b1wiLCBcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIl0sXG4gICAgICAgIF9zb3J0RGlyZWN0aW9uOiBbXCJBU0NFTkRJTkdcIiwgXCJERVNDRU5ESU5HXCIsIFwiREVGQVVMVFwiXSxcbiAgICAgICAgX3N0YXRzRnVuY3Rpb25zOiBbXCJsaXN0XCIsIFwidmFsdWVzXCIsIFwiZmlyc3RcIiwgXCJsYXN0XCIsIFwiY291bnRcIiwgXCJkY1wiLCBcInN1bVwiLCBcImF2ZXJhZ2VcIiwgXCJtYXhcIiwgXCJtaW5cIiwgXCJzdGRldlwiLCBcImR1cmF0aW9uXCIsIFwiZWFybGllc3RcIiwgXCJsYXRlc3RcIl0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsfSBwYXJlbnREYXRhTW9kZWwgVGhlIGBEYXRhTW9kZWxgIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihkYXRhTW9kZWxPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsT2JqZWN0ID0gZGF0YU1vZGVsT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jZWxscyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmFjY2VsZXJhdGlvbk5hbWVzcGFjZSA9IGRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwuaXNBY2NlbGVyYXRlZCgpID8gXG4gICAgICAgICAgICAgICAgZGF0YU1vZGVsT2JqZWN0LmRhdGFNb2RlbC5uYW1lIDogbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5ydW4gICA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5ydW4pO1xuICAgICAgICAgICAgdGhpcy5waXZvdCA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5waXZvdCk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IHRoZSBhY2NlbGVyYXRpb24gY2FjaGUgZm9yIHRoaXMgcGl2b3Qgc3BlY2lmaWNhdGlvbiB0byBhIGpvYixcbiAgICAgICAgICogdXN1YWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlTG9jYWxBY2NlbGVyYXRpb25Kb2Igb24gYSBEYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICogaW5zdGFuY2UsIGFzIHRoZSBhY2NlbGVyYXRpb24gY2FjaGUgZm9yIHRoaXMgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8c3BsdW5ranMuU2VydmljZS5Kb2J9IHNpZCBUaGUgc2lkIG9mIGFuIGFjY2VsZXJhdGlvbiBqb2IsXG4gICAgICAgICAqICAgICBvciwgYSBgc3BsdW5ranMuU2VydmljZS5Kb2JgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgc2V0QWNjZWxlcmF0aW9uSm9iOiBmdW5jdGlvbihzaWQpIHtcbiAgICAgICAgICAgIC8vIElmIGEgc2VhcmNoIG9iamVjdCBpcyBwYXNzZWQgaW4sIGdldCBpdHMgc2lkXG4gICAgICAgICAgICBpZiAoc2lkICYmIHNpZCBpbnN0YW5jZW9mIFNlcnZpY2UuSm9iKSB7XG4gICAgICAgICAgICAgICAgc2lkID0gc2lkLnNpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFzaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaWQgdG8gdXNlIGZvciBhY2NlbGVyYXRpb24gbXVzdCBub3QgYmUgbnVsbC5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uTmFtZXNwYWNlID0gXCJzaWQ9XCIgKyBzaWQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgZmlsdGVyIG9uIGEgYm9vbGVhbiB2YWx1ZWQgZmllbGQuIFRoZSBmaWx0ZXIgd2lsbCBiZSBhIGNvbnN0cmFpbnQgb2YgdGhlIGZvcm1cbiAgICAgICAgICogYGZpZWxkIGBjb21wYXJpc29uYCBjb21wYXJlVG9gLCBmb3IgZXhhbXBsZTogYGlzX3JlbW90ZSA9IGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBmaWx0ZXIgb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbXBhcmlzb25UeXBlIFRoZSB0eXBlIG9mIGNvbXBhcmlzb24sIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbXBhcmlzb25PcCBUaGUgY29tcGFyaXNvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIGNvbXBhcmlzb25zLCBiYXNlZCBvbiB0eXBlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcGFyZVRvIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBmaWVsZCB0by5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZEZpbHRlcjogZnVuY3Rpb24oZmllbGROYW1lLCBjb21wYXJpc29uVHlwZSwgY29tcGFyaXNvbk9wLCBjb21wYXJlVG8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhZGQgZmlsdGVyIG9uIGEgbm9uZXhpc3RlbnQgZmllbGQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbXBhcmlzb25UeXBlICE9PSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IGFkZCBcIiArIGNvbXBhcmlzb25UeXBlICsgIFxuICAgICAgICAgICAgICAgICAgICBcIiBmaWx0ZXIgb24gXCIgKyBmaWVsZE5hbWUgKyBcbiAgICAgICAgICAgICAgICAgICAgXCIgYmVjYXVzZSBpdCBpcyBvZiB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKS50eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnModGhpcy5fY29tcGFyaXNvbnNbY29tcGFyaXNvblR5cGVdLCBjb21wYXJpc29uT3ApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCBhZGQgXCIgKyBjb21wYXJpc29uVHlwZSArIFxuICAgICAgICAgICAgICAgICAgICBcIiBmaWx0ZXIgYmVjYXVzZSBcIiArIGNvbXBhcmlzb25PcCArXG4gICAgICAgICAgICAgICAgICAgIFwiIGlzIG5vdCBhIHZhbGlkIGNvbXBhcmlzb24gb3BlcmF0b3JcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSkubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBjb21wYXJpc29uVHlwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFRoZXNlIGZpZWxkcyBhcmUgdHlwZSBkZXBlbmRlbnRcbiAgICAgICAgICAgIGlmICh1dGlscy5jb250YWlucyhbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwiaXB2NFwiLCBcIm51bWJlclwiXSwgcmV0LnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0LnJ1bGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3I6IGNvbXBhcmlzb25PcCxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyZVRvOiBjb21wYXJlVG9cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLnB1c2gocmV0KTtcbiAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSBsaW1pdCBvbiB0aGUgZXZlbnRzIHNob3duIGluIGEgcGl2b3QgYnkgc29ydGluZyB0aGVtIGFjY29yZGluZyB0byBzb21lIGZpZWxkLCB0aGVuIHRha2luZ1xuICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIG51bWJlciBmcm9tIHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvcnRBdHRyaWJ1dGUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHVzZSBmb3Igc29ydGluZy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvcnREaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBzb3J0IGV2ZW50cywgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGltaXQgVGhlIG51bWJlciBvZiB2YWx1ZXMgZnJvbSB0aGUgc29ydGVkIGxpc3QgdG8gYWxsb3cgdGhyb3VnaCB0aGlzIGZpbHRlci5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRzRnVuY3Rpb24gVGhlIHN0YXRzIGZ1bmN0aW9uIHRvIHVzZSBmb3IgYWdncmVnYXRpb24gYmVmb3JlIHNvcnRpbmcsIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZExpbWl0RmlsdGVyOiBmdW5jdGlvbihmaWVsZE5hbWUsIHNvcnRBdHRyaWJ1dGUsIHNvcnREaXJlY3Rpb24sIGxpbWl0LCBzdGF0c0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGxpbWl0IGZpbHRlciBvbiBhIG5vbmV4aXN0ZW50IGZpZWxkLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoIXV0aWxzLmNvbnRhaW5zKFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcIm9iamVjdENvdW50XCJdLCBmLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBsaW1pdCBmaWx0ZXIgb24gXCIgKyBmaWVsZE5hbWUgKyBcIiBiZWNhdXNlIGl0IGlzIG9mIHR5cGUgXCIgKyBmLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gZi50eXBlICYmICF1dGlscy5jb250YWlucyhbXCJjb3VudFwiLCBcImRjXCJdLCBzdGF0c0Z1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIGZvciBmaWVsZHMgb2YgdHlwZSBzdHJpbmcgbXVzdCBiZSBDT1VOVCBvciBESVNUSU5DVF9DT1VOVDsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT09IGYudHlwZSAmJiAhdXRpbHMuY29udGFpbnMoW1wiY291bnRcIiwgXCJkY1wiLCBcImF2ZXJhZ2VcIiwgXCJzdW1cIl0sIHN0YXRzRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gZm9yIGZpZWxkcyBvZiB0eXBlIG51bWJlciBtdXN0IGJlIG9uZSBvZiBDT1VOVCwgRElTVElOQ1RfQ09VTlQsIFNVTSwgb3IgQVZFUkFHRTsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFwib2JqZWN0Q291bnRcIiA9PT0gZi50eXBlICYmICF1dGlscy5jb250YWlucyhbXCJjb3VudFwiXSwgc3RhdHNGdW5jdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBmb3IgZmllbGRzIG9mIHR5cGUgb2JqZWN0IGNvdW50IG11c3QgYmUgQ09VTlQ7IGZvdW5kIFwiICsgc3RhdHNGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogc29ydEF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVPd25lcjogdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoc29ydEF0dHJpYnV0ZSkubGluZWFnZS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGxpbWl0QW1vdW50OiBsaW1pdCxcbiAgICAgICAgICAgICAgICBzdGF0c0ZuOiBzdGF0c0Z1bmN0aW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQXNzdW1lZCBcImhpZ2hlc3RcIiBpcyBwcmVmZXJyZWQgZm9yIHdoZW4gc29ydERpcmVjdGlvbiBpcyBcIkRFRkFVTFRcIlxuICAgICAgICAgICAgZmlsdGVyLmxpbWl0VHlwZSA9IFwiQVNDRU5ESU5HXCIgPT09IHNvcnREaXJlY3Rpb24gPyBcImxvd2VzdFwiIDogXCJoaWdoZXN0XCI7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChmaWx0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgcm93IHNwbGl0IG9uIGEgbnVtZXJpYyBvciBzdHJpbmcgdmFsdWVkIGZpZWxkLCBzcGxpdHRpbmcgb24gZWFjaCBkaXN0aW5jdCB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIHJvd3MuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRSb3dTcGxpdDogZnVuY3Rpb24oZmllbGROYW1lLCBsYWJlbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnMoW1wibnVtYmVyXCIsIFwic3RyaW5nXCJdLCBmLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgbnVtYmVyIG9yIHN0cmluZy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByb3cgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBsYWJlbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHJvdy5kaXNwbGF5ID0gXCJhbGxcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yb3dzLnB1c2gocm93KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIHJvdyBzcGxpdCBvbiBhIG51bWVyaWMgZmllbGQsIHNwbGl0dGluZyBpbnRvIG51bWVyaWMgcmFuZ2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIHNwbGl0IGdlbmVyYXRlcyBiaW5zIHdpdGggZWRnZXMgZXF1aXZhbGVudCB0byB0aGVcbiAgICAgICAgICogY2xhc3NpYyBsb29wICdmb3IgaSBpbiA8c3RhcnQ+IHRvIDxlbmQ+IGJ5IDxzdGVwPicgYnV0IHdpdGggYSBtYXhpbXVtXG4gICAgICAgICAqIG51bWJlciBvZiBiaW5zIDxsaW1pdD4uIFRoaXMgZGlzcGF0Y2hlcyB0byB0aGUgc3RhdHMgYW5kIHh5c2VyaWVzIHNlYXJjaCBjb21tYW5kcy5cbiAgICAgICAgICogU2VlIHRoZWlyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIHJvd3MuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY29sbGVjdGlvbiBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gb3B0aW9uczpcbiAgICAgICAgICogICAgLSBgc3RhcnRgIChfaW50ZWdlcl8pOiBUaGUgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByYW5nZSwgb3IgbnVsbCB0byB0YWtlIHRoZSBsb3dlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgZW5kYCAoX2ludGVnZXJfKTogVGhlIHZhbHVlIGZvciB0aGUgZW5kIG9mIHRoZSBsYXN0IHJhbmdlLCBvciBudWxsIHRvIHRha2UgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gdGhlIGV2ZW50cy5cbiAgICAgICAgICogICAgLSBgc3RlcGAgKF9pbnRlZ2VyXyk6IFRoZSB0aGUgd2lkdGggb2YgZWFjaCByYW5nZSwgb3IgbnVsbCB0byBoYXZlIFNwbHVuayBjYWxjdWxhdGUgaXQuXG4gICAgICAgICAqICAgIC0gYGxpbWl0YCAoX2ludGVnZXJfKTogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJhbmdlcyB0byBzcGxpdCBpbnRvLCBvciBudWxsIGZvciBubyBsaW1pdC5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFJhbmdlUm93U3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBsYWJlbCwgcmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCBmaWVsZCBcIiArIGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIG51bWJlci5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdXBkYXRlUmFuZ2VzID0ge307XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5zdGFydCkgJiYgcmFuZ2VzLnN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLnN0YXJ0ID0gcmFuZ2VzLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuZW5kKSAmJiByYW5nZXMuZW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLmVuZCA9IHJhbmdlcy5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5zdGVwKSAmJiByYW5nZXMuc3RlcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVJhbmdlcy5zaXplID0gcmFuZ2VzLnN0ZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKHJhbmdlcy5saW1pdCkgJiYgcmFuZ2VzLmxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VzLm1heE51bWJlck9mID0gcmFuZ2VzLmxpbWl0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwicmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgcmFuZ2VzOiB1cGRhdGVSYW5nZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgcm93IHNwbGl0IG9uIGEgYm9vbGVhbiB2YWx1ZWQgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIHJvd3MuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0cnVlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIHRydWUgdmFsdWVkIHJvdyBsYWJlbC5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZhbHNlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIGZhbHNlIHZhbHVlZCByb3cgbGFiZWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRCb29sZWFuUm93U3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBsYWJlbCwgdHJ1ZURpc3BsYXlWYWx1ZSwgZmFsc2VEaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIGJvb2xlYW4uXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHRydWVMYWJlbDogdHJ1ZURpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgICAgICBmYWxzZUxhYmVsOiBmYWxzZURpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYSByb3cgc3BsaXQgb24gYSB0aW1lc3RhbXAgdmFsdWVkIGZpZWxkLCBiaW5uZWQgYnkgdGhlIHNwZWNpZmllZCBidWNrZXQgc2l6ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBzcGxpdCBvbi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBzZXQgb2Ygcm93cy5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGJpbm5pbmcgVGhlIHNpemUgb2YgYmlucyB0byB1c2UsIHNlZSBjbGFzcyBkb2NzIGZvciB2YWxpZCB0eXBlcy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZFRpbWVzdGFtcFJvd1NwbGl0OiBmdW5jdGlvbihmaWVsZCwgbGFiZWwsIGJpbm5pbmcpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuaGFzRmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZCk7XG4gICAgICAgICAgICBpZiAoXCJ0aW1lc3RhbXBcIiAhPT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgdGltZXN0YW1wLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnModGhpcy5fYmlubmluZywgYmlubmluZykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJpbm5pbmcgXCIgKyBiaW5uaW5nICsgXCIgZm91bmQuIFZhbGlkIHZhbHVlcyBhcmU6IFwiICsgdGhpcy5fYmlubmluZy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvd25lcjogZi5vd25lcixcbiAgICAgICAgICAgICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHBlcmlvZDogYmlubmluZ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAgICAgICAgICAgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIGNvbHVtbiBzcGxpdCBvbiBhIHN0cmluZyBvciBudW1iZXIgdmFsdWVkIGZpZWxkLCBwcm9kdWNpbmcgYSBjb2x1bW4gZm9yXG4gICAgICAgICAqIGVhY2ggZGlzdGluY3QgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuY29udGFpbnMoW1wibnVtYmVyXCIsIFwic3RyaW5nXCJdLCBmLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgd2FzIG9mIHR5cGUgXCIgKyBmLnR5cGUgKyBcIiwgZXhwZWN0ZWQgbnVtYmVyIG9yIHN0cmluZy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjb2wgPSB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY29sLmRpc3BsYXkgPSBcImFsbFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2wpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgbnVtZXJpYyBmaWVsZCwgc3BsaXR0aW5nIHRoZSB2YWx1ZXMgaW50byByYW5nZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvcHRpb25hbCBkaWN0aW9uYXJ5IG9mIGNvbGxlY3Rpb24gZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uIG9wdGlvbnM6XG4gICAgICAgICAqICAgIC0gYHN0YXJ0YCAoX2ludGVnZXJfKTogVGhlIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgcmFuZ2UsIG9yIG51bGwgdG8gdGFrZSB0aGUgbG93ZXN0IHZhbHVlIGluIHRoZSBldmVudHMuXG4gICAgICAgICAqICAgIC0gYGVuZGAgKF9pbnRlZ2VyXyk6IFRoZSB2YWx1ZSBmb3IgdGhlIGVuZCBvZiB0aGUgbGFzdCByYW5nZSwgb3IgbnVsbCB0byB0YWtlIHRoZSBoaWdoZXN0IHZhbHVlIGluIHRoZSBldmVudHMuXG4gICAgICAgICAqICAgIC0gYHN0ZXBgIChfaW50ZWdlcl8pOiBUaGUgdGhlIHdpZHRoIG9mIGVhY2ggcmFuZ2UsIG9yIG51bGwgdG8gaGF2ZSBTcGx1bmsgY2FsY3VsYXRlIGl0LlxuICAgICAgICAgKiAgICAtIGBsaW1pdGAgKF9pbnRlZ2VyXyk6IFRoZSBtYXhpbXVtIG51bWJlciBvZiByYW5nZXMgdG8gc3BsaXQgaW50bywgb3IgbnVsbCBmb3Igbm8gbGltaXQuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRSYW5nZUNvbHVtblNwbGl0OiBmdW5jdGlvbihmaWVsZE5hbWUsIHJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiICE9PSBmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZCB3YXMgb2YgdHlwZSBcIiArIGYudHlwZSArIFwiLCBleHBlY3RlZCBudW1iZXIuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiBTcGx1bmsgNi4wLjEuMSwgZGF0YSBtb2RlbHMgaW5jb3JyZWN0bHkgZXhwZWN0IHN0cmluZ3MgZm9yIHRoZXNlIGZpZWxkc1xuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBudW1iZXJzLiBJbiA2LjEsIHRoaXMgaXMgZml4ZWQgYW5kIGJvdGggYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgdmFyIHVwZGF0ZWRSYW5nZXMgPSB7fTtcbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLnN0YXJ0KSAmJiByYW5nZXMuc3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLnN0YXJ0ID0gcmFuZ2VzLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuZW5kKSAmJiByYW5nZXMuZW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFJhbmdlcy5lbmQgPSByYW5nZXMuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChyYW5nZXMuc3RlcCkgJiYgcmFuZ2VzLnN0ZXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLnNpemUgPSByYW5nZXMuc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQocmFuZ2VzLmxpbWl0KSAmJiByYW5nZXMubGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkUmFuZ2VzLm1heE51bWJlck9mID0gcmFuZ2VzLmxpbWl0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwicmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgcmFuZ2VzOiB1cGRhdGVkUmFuZ2VzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIGEgY29sdW1uIHNwbGl0IG9uIGEgYm9vbGVhbiB2YWx1ZWQgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgZmllbGQgdG8gc3BsaXQgb24uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0cnVlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIHRydWUgdmFsdWVkIGNvbHVtbiBsYWJlbC5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZhbHNlRGlzcGxheVZhbHVlIEEgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIGZhbHNlIHZhbHVlZCBjb2x1bW4gbGFiZWwuXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBUaGUgdXBkYXRlZCBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBhZGRCb29sZWFuQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkTmFtZSwgdHJ1ZURpc3BsYXlWYWx1ZSwgZmFsc2VEaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCBmaWVsZCBcIiArIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZiA9IHRoaXMuZGF0YU1vZGVsT2JqZWN0LmZpZWxkQnlOYW1lKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIGJvb2xlYW4uXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIHRydWVMYWJlbDogdHJ1ZURpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgICAgICBmYWxzZUxhYmVsOiBmYWxzZURpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhIGNvbHVtbiBzcGxpdCBvbiBhIHRpbWVzdGFtcCB2YWx1ZWQgZmllbGQsIGJpbm5lZCBieSB0aGUgc3BlY2lmaWVkIGJ1Y2tldCBzaXplLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIGZpZWxkIHRvIHNwbGl0IG9uLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmlubmluZyBUaGUgc2l6ZSBvZiBiaW5zIHRvIHVzZSwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHR5cGVzLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvbn0gVGhlIHVwZGF0ZWQgcGl2b3Qgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLlBpdm90U3BlY2lmaWNhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYWRkVGltZXN0YW1wQ29sdW1uU3BsaXQ6IGZ1bmN0aW9uKGZpZWxkLCBiaW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGVsT2JqZWN0Lmhhc0ZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCBmaWVsZCBcIiArIGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5kYXRhTW9kZWxPYmplY3QuZmllbGRCeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKFwidGltZXN0YW1wXCIgIT09IGYudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIHdhcyBvZiB0eXBlIFwiICsgZi50eXBlICsgXCIsIGV4cGVjdGVkIHRpbWVzdGFtcC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmNvbnRhaW5zKHRoaXMuX2Jpbm5pbmcsIGJpbm5pbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiaW5uaW5nIFwiICsgYmlubmluZyArIFwiIGZvdW5kLiBWYWxpZCB2YWx1ZXMgYXJlOiBcIiArIHRoaXMuX2Jpbm5pbmcuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQsXG4gICAgICAgICAgICAgICAgb3duZXI6IGYub3duZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIHBlcmlvZDogYmlubmluZ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAgICAgICAgICAgIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBhbiBhZ2dyZWdhdGUgdG8gZWFjaCBjZWxsIG9mIHRoZSBwaXZvdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkTmFtZSBUaGUgbmFtZSBvZiBmaWVsZCB0byBhZ2dyZWdhdGUuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdHNGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gdXNlIGZvciBhZ2dyZWdhdGlvbiwgc2VlIGNsYXNzIGRvY3MgZm9yIHZhbGlkIHN0YXRzIGZ1bmN0aW9ucy5cbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb259IFRoZSB1cGRhdGVkIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZENlbGxWYWx1ZTogZnVuY3Rpb24oZmllbGROYW1lLCBsYWJlbCwgc3RhdHNGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RlbE9iamVjdC5oYXNGaWVsZChmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlkIG5vdCBmaW5kIGZpZWxkIFwiICsgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5maWVsZEJ5TmFtZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKHV0aWxzLmNvbnRhaW5zKFtcInN0cmluZ1wiLCBcImlwdjRcIl0sIGYudHlwZSkgJiZcbiAgICAgICAgICAgICAgICAhdXRpbHMuY29udGFpbnMoW1xuICAgICAgICAgICAgICAgICAgICBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJmaXJzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxhc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRjXCJdLCBzdGF0c0Z1bmN0aW9uKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIG9uIHN0cmluZyBhbmQgSVB2NCBmaWVsZHMgbXVzdCBiZSBvbmUgb2Y6XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBsaXN0LCBkaXN0aW5jdF92YWx1ZXMsIGZpcnN0LCBsYXN0LCBjb3VudCwgb3IgZGlzdGluY3RfY291bnQ7IGZvdW5kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHNGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChcIm51bWJlclwiID09PSBmLnR5cGUgJiYgXG4gICAgICAgICAgICAgICAgIXV0aWxzLmNvbnRhaW5zKFtcbiAgICAgICAgICAgICAgICAgICAgXCJzdW1cIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImF2ZXJhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdGRldlwiLFxuICAgICAgICAgICAgICAgICAgICBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICBdLCBzdGF0c0Z1bmN0aW9uKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRzIGZ1bmN0aW9uIG9uIG51bWJlciBmaWVsZCBtdXN0IGJlIG11c3QgYmUgb25lIG9mOlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgc3VtLCBjb3VudCwgYXZlcmFnZSwgbWF4LCBtaW4sIHN0ZGV2LCBsaXN0LCBvciBkaXN0aW5jdF92YWx1ZXM7IGZvdW5kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHNGdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoXCJ0aW1lc3RhbXBcIiA9PT0gZi50eXBlICYmXG4gICAgICAgICAgICAgICAgIXV0aWxzLmNvbnRhaW5zKFtcbiAgICAgICAgICAgICAgICAgICAgXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImVhcmxpZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIF0sIHN0YXRzRnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHMgZnVuY3Rpb24gb24gdGltZXN0YW1wIGZpZWxkIG11c3QgYmUgb25lIG9mOlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgZHVyYXRpb24sIGVhcmxpZXN0LCBsYXRlc3QsIGxpc3QsIG9yIGRpc3RpbmN0IHZhbHVlczsgZm91bmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBzdGF0c0Z1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1dGlscy5jb250YWlucyhbXCJvYmplY3RDb3VudFwiLCBcImNoaWxkQ291bnRcIl0sIGYudHlwZSkgJiZcbiAgICAgICAgICAgICAgICBcImNvdW50XCIgIT09IHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0cyBmdW5jdGlvbiBvbiBjaGlsZGNvdW50IGFuZCBvYmplY3Rjb3VudCBmaWVsZHMgbXVzdCBiZSBjb3VudDsgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImZvdW5kIFwiICsgc3RhdHNGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChcImJvb2xlYW5cIiA9PT0gZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBib29sZWFuIHZhbHVlZCBmaWVsZHMgYXMgY2VsbCB2YWx1ZXMuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIG93bmVyOiBmLmxpbmVhZ2Uuam9pbihcIi5cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICBzcGFya2xpbmU6IGZhbHNlLCAvLyBOb3QgcHJvcGVybHkgaW1wbGVtZW50ZWQgaW4gY29yZSB5ZXQuXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXRzRnVuY3Rpb25cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZWFkeSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBKU09OIHJlYWR5IG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBpdm90IHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5QaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHRvSnNvbk9iamVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFNb2RlbDogdGhpcy5kYXRhTW9kZWxPYmplY3QuZGF0YU1vZGVsLm5hbWUsXG4gICAgICAgICAgICAgICAgYmFzZUNsYXNzOiB0aGlzLmRhdGFNb2RlbE9iamVjdC5uYW1lLFxuICAgICAgICAgICAgICAgIHJvd3M6IHRoaXMucm93cyxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgY2VsbHM6IHRoaXMuY2VsbHMsXG4gICAgICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyeSBTcGx1bmsgZm9yIFNQTCBxdWVyaWVzIGNvcnJlc3BvbmRpbmcgdG8gYSBwaXZvdCByZXBvcnRcbiAgICAgICAgICogZm9yIHRoaXMgZGF0YSBtb2RlbCwgZGVmaW5lZCBieSB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UuZGF0YU1vZGVscygpLmZldGNoKGZ1bmN0aW9uKGVyciwgZGF0YU1vZGVscykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgc2VhcmNoZXMgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAgICAgKiAgICAgICAgICB2YXIgcGl2b3RTcGVjID0gc2VhcmNoZXMuY3JlYXRlUGl2b3RTcGVjaWZpY2F0aW9uKCk7XG4gICAgICAgICAqICAgICAgICAgIC8vIFVzZSBvZiB0aGUgZmx1ZW50IEFQSVxuICAgICAgICAgKiAgICAgICAgICBwaXZvdFNwZWMuYWRkUm93U3BsaXQoXCJ1c2VyXCIsIFwiRXhlY3V0aW5nIHVzZXJcIilcbiAgICAgICAgICogICAgICAgICAgICAgIC5hZGRSYW5nZUNvbHVtblNwbGl0KFwiZXhlY190aW1lXCIsIHtzdGFydDogMCwgZW5kOiAxMiwgc3RlcDogNSwgbGltaXQ6IDR9KVxuICAgICAgICAgKiAgICAgICAgICAgICAgLmFkZENlbGxWYWx1ZShcInNlYXJjaFwiLCBcIlNlYXJjaCBRdWVyeVwiLCBcInZhbHVlc1wiKVxuICAgICAgICAgKiAgICAgICAgICAgICAgLnBpdm90KGZ1bmN0aW9uKHBpdm90RXJyLCBwaXZvdCkge1xuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGl2b3Qgc2VhcmNoIGlzOlwiLCBwaXZvdC5zZWFyY2gpO1xuICAgICAgICAgKiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAqICAgICAgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUgZ2V0dGluZyB0aGUgcGl2b3Q6IGAoZXJyLCBwaXZvdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwaXZvdDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBzdmMgPSB0aGlzLmRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwuc2VydmljZTtcblxuICAgICAgICAgICAgdmFyIGFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgcGl2b3RfanNvbjogSlNPTi5zdHJpbmdpZnkodGhpcy50b0pzb25PYmplY3QoKSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQodGhpcy5hY2NlbGVyYXRpb25OYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgYXJncy5uYW1lc3BhY2UgPSB0aGlzLmFjY2VsZXJhdGlvbk5hbWVzcGFjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHN2Yy5nZXQoUGF0aHMucGl2b3QgKyBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmRhdGFNb2RlbE9iamVjdC5kYXRhTW9kZWwubmFtZSksIGFyZ3MsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihlcnIuZGF0YS5tZXNzYWdlc1swXS50ZXh0KSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZW50cnkgJiYgcmVzcG9uc2UuZGF0YS5lbnRyeVswXSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBuZXcgcm9vdC5QaXZvdChzdmMsIHJlc3BvbnNlLmRhdGEuZW50cnlbMF0uY29udGVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiRGlkbid0IGdldCBhIFBpdm90IHJlcG9ydCBiYWNrIGZyb20gU3BsdW5rXCIpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB3cmFwIHVwIHRoZSBgUGl2b3RTcGVjaWZpY2F0aW9uLnBpdm90KClgIGFuZFxuICAgICAgICAgKiBgUGl2b3QucnVuKClgIGZ1bmN0aW9uIGNhbGxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBRdWVyeSBTcGx1bmsgZm9yIFNQTCBxdWVyaWVzIGNvcnJlc3BvbmRpbmcgdG8gYSBwaXZvdCByZXBvcnRcbiAgICAgICAgICogZm9yIHRoaXMgZGF0YSBtb2RlbCwgZGVmaW5lZCBieSB0aGlzIGBQaXZvdFNwZWNpZmljYXRpb25gOyB0aGVuLFxuICAgICAgICAgKiBzdGFydHMgYSBzZWFyY2ggam9iIHJ1bm5pbmcgdGhpcyBwaXZvdCwgYWNjZWxlcmF0ZWQgaWYgcG9zc2libGUuXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZmV0Y2hFcnIsIGRhdGFNb2RlbHMpIHtcbiAgICAgICAgICogICAgICAgICAgdmFyIHNlYXJjaGVzID0gZGF0YU1vZGVscy5pdGVtKFwiaW50ZXJuYWxfYXVkaXRfbG9nc1wiKS5vYmplY3RCeU5hbWUoXCJzZWFyY2hlc1wiKTtcbiAgICAgICAgICogICAgICAgICAgdmFyIHBpdm90U3BlYyA9IHNlYXJjaGVzLmNyZWF0ZVBpdm90U3BlY2lmaWNhdGlvbigpO1xuICAgICAgICAgKiAgICAgICAgICAvLyBVc2Ugb2YgdGhlIGZsdWVudCBBUElcbiAgICAgICAgICogICAgICAgICAgcGl2b3RTcGVjLmFkZFJvd1NwbGl0KFwidXNlclwiLCBcIkV4ZWN1dGluZyB1c2VyXCIpXG4gICAgICAgICAqICAgICAgICAgICAgICAuYWRkUmFuZ2VDb2x1bW5TcGxpdChcImV4ZWNfdGltZVwiLCB7c3RhcnQ6IDAsIGVuZDogMTIsIHN0ZXA6IDUsIGxpbWl0OiA0fSlcbiAgICAgICAgICogICAgICAgICAgICAgIC5hZGRDZWxsVmFsdWUoXCJzZWFyY2hcIiwgXCJTZWFyY2ggUXVlcnlcIiwgXCJ2YWx1ZXNcIilcbiAgICAgICAgICogICAgICAgICAgICAgIC5ydW4oZnVuY3Rpb24oZXJyLCBqb2IsIHBpdm90KSB7XG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKb2IgU0lEIGlzOlwiLCBqb2Iuc2lkKTtcbiAgICAgICAgICogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlBpdm90IHNlYXJjaCBpczpcIiwgcGl2b3Quc2VhcmNoKTtcbiAgICAgICAgICogICAgICAgICAgICAgIH0pO1xuICAgICAgICAgKiAgICAgIH0pO1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJncyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IgKG9wdGlvbmFsKS4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVycywgc2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2LnNwbHVuay5jb20vdmlldy9TUC1DQUFBRUZBI3NlYXJjaGpvYnBhcmFtc1wiIHRhcmdldD1cIl9ibGFua1wiPlNlYXJjaCBqb2IgcGFyYW1ldGVyczwvYT4gb24gU3BsdW5rIERldmVsb3BlciBQb3J0YWwuXG4gICAgICAgICAqICAgICAgICAqKk5vdGU6KiogVGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBgZXhlY19tb2RlPW9uZXNob3RgIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcHJvcGVydGllcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBkb25lIGdldHRpbmcgdGhlIHBpdm90OiBgKGVyciwgam9iLCBwaXZvdClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBydW46IGZ1bmN0aW9uKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhcmdzO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuXG4gICAgICAgICAgICB0aGlzLnBpdm90KGZ1bmN0aW9uKGVyciwgcGl2b3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwaXZvdC5ydW4oYXJncywgQXN5bmMuYXVnbWVudChjYWxsYmFjaywgcGl2b3QpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBvbmUgb2YgdGhlIHN0cnVjdHVyZWQgdmlld3MgaW4gYSBgRGF0YU1vZGVsYC5cbiAgICAgKlxuICAgICAqIEhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGRhdGFNb2RlbGAgKF9zcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbF8pOiBUaGUgYERhdGFNb2RlbGAgdG8gd2hpY2ggdGhpcyBgRGF0YU1vZGVsT2JqZWN0YCBiZWxvbmdzLlxuICAgICAqICAgIC0gYG5hbWVgIChfc3RyaW5nXyk6IFRoZSBuYW1lIG9mIHRoaXMgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICogICAgLSBgZGlzcGxheU5hbWVgIChfc3RyaW5nXyk6IFRoZSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoaXMgYERhdGFNb2RlbE9iamVjdGAuXG4gICAgICogICAgLSBgcGFyZW50TmFtZWAgKF9zdHJpbmdfKTogVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBgRGF0YU1vZGVsT2JqZWN0YCB0byB0aGlzIG9uZS5cbiAgICAgKiAgICAtIGBsaW5lYWdlYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIHN0cmluZ3Mgb2YgdGhlIGxpbmVhZ2Ugb2YgdGhlIGRhdGEgbW9kZWxcbiAgICAgKiAgICAgICAgICBvbiB3aGljaCB0aGlzIGZpZWxkIGlzIGRlZmluZWQuXG4gICAgICogICAgLSBgZmllbGRzYCAoX29iamVjdF8pOiBBIGRpY3Rpb25hcnkgb2YgYERhdGFNb2RlbEZpZWxkYCBvYmplY3RzLCBhY2Nlc3NpYmxlIGJ5IG5hbWUuXG4gICAgICogICAgLSBgY29uc3RyYWludHNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgYERhdGFNb2RlbENvbnN0cmFpbnRgIG9iamVjdHMuXG4gICAgICogICAgLSBgY2FsY3VsYXRpb25zYCAoX29iamVjdF8pOiBBIGRpY3Rpb25hcnkgb2YgYERhdGFNb2RlbENhbGN1bGF0aW9uYCBvYmplY3RzLCBhY2Nlc3NpYmxlIGJ5IElELlxuICAgICAqXG4gICAgICogQmFzZVNlYXJjaCBoYXMgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eTpcbiAgICAgKiAgICAtIGBiYXNlU2VhcmNoYCAoX3N0cmluZ18pOiBUaGUgc2VhcmNoIHF1ZXJ5IHdyYXBwZWQgYnkgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEJhc2VUcmFuc2FjdGlvbiBoYXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOlxuICAgICAqICAgIC0gYGdyb3VwQnlGaWVsZHNgIChfc3RyaW5nXyk6IFRoZSBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ3JvdXAgZXZlbnRzIGludG8gdHJhbnNhY3Rpb25zLlxuICAgICAqICAgIC0gYG9iamVjdHNUb0dyb3VwYCAoX2FycmF5Xyk6IE5hbWVzIG9mIHRoZSBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgdW5pb25lZFxuICAgICAqICAgICAgICBhbmQgc3BsaXQgaW50byB0cmFuc2FjdGlvbnMuXG4gICAgICogICAgLSBgbWF4U3BhbmAgKF9zdHJpbmdfKTogVGhlIG1heGltdW0gdGltZSBzcGFuIG9mIGEgdHJhbnNhY3Rpb24uXG4gICAgICogICAgLSBgbWF4UGF1c2VgIChfc3RyaW5nXyk6IFRoZSBtYXhpbXVtIHBhdXNlIHRpbWUgb2YgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAqL1xuICAgIHJvb3QuRGF0YU1vZGVsT2JqZWN0ID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKiBTREsgdXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyB0byBzZXQ6XG4gICAgICAgICAqICAgICAtIGBvYmplY3ROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBmb3IgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICogICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqICAgICAtIGBwYXJlbnROYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCB0aGF0IG93bnMgdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICogICAgIC0gYGxpbmVhZ2VgIChfc3RyaW5nXyk6IFRoZSBsaW5lYWdlIG9mIHRoZSBkYXRhIG1vZGVsIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LFxuICAgICAgICAgKiAgICAgICAgICBpdGVtcyBhcmUgZGVsaW1pdGVkIGJ5IGEgZG90LiBUaGlzIGlzIGNvbnZlcnRlZCBpbnRvIGFuIGFycmF5IG9mXG4gICAgICAgICAqICAgICAgICAgIHN0cmluZ3MgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAqICAgICAtIGBmaWVsZHNgIChfYXJyYXlfKTogQW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBmaWVsZHMuXG4gICAgICAgICAqICAgICAtIGBjb25zdHJhaW50c2AgKF9hcnJheV8pOiBBbiBhcnJheSBvZiBkYXRhIG1vZGVsIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiAgICAgLSBgY2FsY3VsYXRpb25zYCAoX2FycmF5Xyk6IEFuIGFycmF5IG9mIGRhdGEgbW9kZWwgY2FsY3VsYXRpb25zLlxuICAgICAgICAgKiAgICAgLSBgYmFzZVNlYXJjaGAgKF9zdHJpbmdfKTogVGhlIHNlYXJjaCBxdWVyeSB3cmFwcGVkIGJ5IHRoaXMgZGF0YSBtb2RlbCBvYmplY3Q7IGV4Y2x1c2l2ZSB0byBCYXNlU2VhcmNoIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYGdyb3VwQnlGaWVsZHNgIChfYXJyYXlfKTogVGhlIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBncm91cCBldmVudHMgaW50byB0cmFuc2FjdGlvbnM7IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKiAgICAgLSBgb2JqZWN0c1RvR3JvdXBgIChfYXJyYXlfKTogTmFtZXMgb2YgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSB1bmlvbmVkXG4gICAgICAgICAqICAgICAgICAgYW5kIHNwbGl0IGludG8gdHJhbnNhY3Rpb25zOyBleGNsdXNpdmUgdG8gQmFzZVRyYW5zYWN0aW9uIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYG1heFNwYW5gIChfc3RyaW5nXyk6IFRoZSBtYXhpbXVtIHRpbWUgc3BhbiBvZiBhIHRyYW5zYWN0aW9uOyBleGNsdXNpdmUgdG8gQmFzZVRyYW5zYWN0aW9uIChvcHRpb25hbClcbiAgICAgICAgICogICAgIC0gYG1heFBhdXNlYCAoX3N0cmluZ18pOiBUaGUgbWF4aW11bSBwYXVzZSB0aW1lIG9mIGEgdHJhbnNhY3Rpb247IGV4Y2x1c2l2ZSB0byBCYXNlVHJhbnNhY3Rpb24gKG9wdGlvbmFsKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsfSBwYXJlbnREYXRhTW9kZWwgVGhlIGBEYXRhTW9kZWxgIHRoYXQgb3ducyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpbml0OiBmdW5jdGlvbihwcm9wcywgcGFyZW50RGF0YU1vZGVsKSB7XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgICAgICAgICAgcHJvcHMub3duZXIgPSBwcm9wcy5vd25lciB8fCBcIlwiO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbCAgICAgICAgICAgICAgPSBwYXJlbnREYXRhTW9kZWw7XG4gICAgICAgICAgICB0aGlzLm5hbWUgICAgICAgICAgICAgICAgICAgPSBwcm9wcy5vYmplY3ROYW1lO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSAgICAgICAgICAgID0gcHJvcHMuZGlzcGxheU5hbWU7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5hbWUgICAgICAgICAgICAgPSBwcm9wcy5wYXJlbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5saW5lYWdlICAgICAgICAgICAgICAgID0gcHJvcHMubGluZWFnZS5zcGxpdChcIi5cIik7XG5cbiAgICAgICAgICAgIC8vIFByb3BlcnRpZXMgZXhjbHVzaXZlIHRvIEJhc2VUcmFuc2FjdGlvblxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwiZ3JvdXBCeUZpZWxkc1wiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBCeUZpZWxkcyA9IHByb3BzLmdyb3VwQnlGaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoXCJvYmplY3RzVG9Hcm91cFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0c1RvR3JvdXAgPSBwcm9wcy5vYmplY3RzVG9Hcm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShcInRyYW5zYWN0aW9uTWF4VGltZVNwYW5cIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1heFNwYW4gPSBwcm9wcy50cmFuc2FjdGlvbk1heFRpbWVTcGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwidHJhbnNhY3Rpb25NYXhQYXVzZVwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UGF1c2UgPSBwcm9wcy50cmFuc2FjdGlvbk1heFBhdXNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm9wZXJ0eSBleGNsdXNpdmUgdG8gQmFzZVNlYXJjaFxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwiYmFzZVNlYXJjaFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVNlYXJjaCA9IHByb3BzLmJhc2VTZWFyY2g7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGZpZWxkc1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZHNbcHJvcHMuZmllbGRzW2ldLmZpZWxkTmFtZV0gPSBuZXcgcm9vdC5EYXRhTW9kZWxGaWVsZChwcm9wcy5maWVsZHNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQYXJzZSBjb25zdHJhaW50c1xuICAgICAgICAgICAgdGhpcy5jb25zdHJhaW50cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5jb25zdHJhaW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uc3RyYWludHMucHVzaChuZXcgcm9vdC5EYXRhTW9kZWxDb25zdHJhaW50KHByb3BzLmNvbnN0cmFpbnRzW2pdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGNhbGN1bGF0aW9uc1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcHJvcHMuY2FsY3VsYXRpb25zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGlvbnNbcHJvcHMuY2FsY3VsYXRpb25zW2tdLmNhbGN1bGF0aW9uSURdID0gbmV3IHJvb3QuRGF0YU1vZGVsQ2FsY3VsYXRpb24ocHJvcHMuY2FsY3VsYXRpb25zW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCBhIEJhc2VTZWFyY2g/XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCBpcyB0aGUgcm9vdCB0eXBlLCBCYXNlU2VhcmNoLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpc0Jhc2VTZWFyY2g6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICF1dGlscy5pc1VuZGVmaW5lZCh0aGlzLmJhc2VTZWFyY2gpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGlzIGEgQmFzZVRyYW5zYWN0aW9uP1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QgaXMgdGhlIHJvb3QgdHlwZSwgQmFzZVRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpc0Jhc2VUcmFuc2FjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHRoaXMubWF4U3Bhbik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBmaWVsZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIGZpZWxkIG5hbWVzIG9mIHRoaXMgXG4gICAgICAgICAqIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBmaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBkYXRhIG1vZGVsIGZpZWxkIGluc3RhbmNlLCByZXByZXNlbnRpbmcgYSBmaWVsZCBvbiB0aGlzXG4gICAgICAgICAqIGRhdGEgbW9kZWwgb2JqZWN0LiBcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7c3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxGaWVsZHxudWxsfSBUaGUgZGF0YSBtb2RlbCBmaWVsZFxuICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG51bGwgaWYgaXQgdGhlIFxuICAgICAgICAgKiBmaWVsZCBieSB0aGF0IG5hbWUgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgZmllbGRCeU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRGaWVsZHMoKVtuYW1lXSB8fCB0aGlzLmZpZWxkc1tuYW1lXSB8fCBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBmaWVsZHMgZnJvbSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLCBhbmQgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzIGZpZWxkcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGBzcGx1bmsuU2VydmljZS5EYXRhTW9kZWxGaWVsZGAgb2JqZWN0c1xuICAgICAgICAgKiB3aGljaCBpbmNsdWRlcyB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3MgZmllbGRzLCBhbmQgdGhlIGZpZWxkcyBmcm9tXG4gICAgICAgICAqIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGFsbEZpZWxkczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBtZXJnZSBmaWVsZHMgYW5kIGNhbGN1bGF0ZWRGaWVsZHMoKVxuICAgICAgICAgICAgdmFyIGNvbWJpbmVkRmllbGRzID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGYgaW4gdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMuaGFzT3duUHJvcGVydHkoZikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRGaWVsZHNbZl0gPSB0aGlzLmZpZWxkc1tmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjYWxjdWxhdGVkRmllbGRzID0gdGhpcy5jYWxjdWxhdGVkRmllbGRzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBjZiBpbiBjYWxjdWxhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRGaWVsZHMuaGFzT3duUHJvcGVydHkoY2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkRmllbGRzW2NmXSA9IGNhbGN1bGF0ZWRGaWVsZHNbY2ZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVkRmllbGRzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLCBhbmQgdGhlIG5hbWVzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBmaWVsZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIGZpZWxkIG5hbWVzIG9mIHRoaXMgXG4gICAgICAgICAqIGRhdGEgbW9kZWwgb2JqZWN0J3MgY2FsY3VsYXRpb25zLCBhbmQgdGhlIG5hbWVzIG9mIGZpZWxkcyBvbiBcbiAgICAgICAgICogdGhpcyBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgYWxsRmllbGROYW1lczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hbGxGaWVsZHMoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBtb2RlbCBmaWVsZHMgZnJvbSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3NcbiAgICAgICAgICogY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgYHNwbHVuay5TZXJ2aWNlLkRhdGFNb2RlbEZpZWxkYCBvYmplY3RzXG4gICAgICAgICAqIG9mIHRoZSBmaWVsZHMgZnJvbSB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0J3MgY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBjYWxjdWxhdGVkRmllbGRzOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIGZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjYWxjdWxhdGlvbnMsIGdldCB0aGVpciBmaWVsZHNcbiAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5jYWxjdWxhdGlvbklEcygpO1xuICAgICAgICAgICAgdmFyIGNhbGN1bGF0aW9ucyA9IHRoaXMuY2FsY3VsYXRpb25zO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGN1bGF0aW9uID0gY2FsY3VsYXRpb25zW2tleXNbaV1dO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGYgPSAwOyBmIDwgY2FsY3VsYXRpb24ub3V0cHV0RmllbGROYW1lcygpLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tjYWxjdWxhdGlvbi5vdXRwdXRGaWVsZE5hbWVzKClbZl1dID0gY2FsY3VsYXRpb24ub3V0cHV0RmllbGRzW2NhbGN1bGF0aW9uLm91dHB1dEZpZWxkTmFtZXMoKVtmXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCdzXG4gICAgICAgICAqIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmllbGQgbmFtZXMgb2YgdGhpcyBcbiAgICAgICAgICogZGF0YSBtb2RlbCBvYmplY3QncyBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNhbGN1bGF0ZWRGaWVsZE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhbGN1bGF0ZWRGaWVsZHMoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGRhdGEgbW9kZWwgb2JqZWN0IGNvbnRhaW5zIHRoZSBmaWVsZCB3aXRoIHRoZVxuICAgICAgICAgKiBuYW1lIHBhc3NlZCBpbiB0aGUgYGZpZWxkTmFtZWAgcGFyYW1ldGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBsb29rIGZvci5cbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGRhdGEgbW9kZWwgY29udGFpbnMgdGhlIGZpZWxkIGJ5IG5hbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGhhc0ZpZWxkOiBmdW5jdGlvbihmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5jb250YWlucyh0aGlzLmFsbEZpZWxkTmFtZXMoKSwgZmllbGROYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB0aGUgSURzIG9mIHRoaXMgZGF0YSBtb2RlbCBvYmplY3Qnc1xuICAgICAgICAgKiBjYWxjdWxhdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIElEcyBvZiB0aGlzIGRhdGEgbW9kZWxcbiAgICAgICAgICogb2JqZWN0J3MgY2FsY3VsYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBjYWxjdWxhdGlvbklEczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jYWxjdWxhdGlvbnMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2NhbCBhY2NlbGVyYXRpb24gaXMgdHNpZHggYWNjZWxlcmF0aW9uIG9mIGEgZGF0YSBtb2RlbCBvYmplY3QgdGhhdCBpcyBoYW5kbGVkXG4gICAgICAgICAqIG1hbnVhbGx5IGJ5IGEgdXNlci4gWW91IGNyZWF0ZSBhIGpvYiB3aGljaCBnZW5lcmF0ZXMgYW4gaW5kZXgsIGFuZCB0aGVuIHVzZSB0aGF0XG4gICAgICAgICAqIGluZGV4IGluIHlvdXIgcGl2b3RzIG9uIHRoZSBkYXRhIG1vZGVsIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG5hbWVzcGFjZSBjcmVhdGVkIGJ5IHRoZSBqb2IgaXMgJ3NpZD17c2lkfScgd2hlcmUge3NpZH0gaXMgdGhlIGpvYidzIHNpZC4gWW91XG4gICAgICAgICAqIHdvdWxkIHVzZSBpdCBpbiBhbm90aGVyIGpvYiBieSBzdGFydGluZyB5b3VyIHNlYXJjaCBxdWVyeSB3aXRoIGB8IHRzdGF0cyAuLi4gZnJvbSBzaWQ9e3NpZH0gfCAuLi5gXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSB0c2lkeCBpbmRleCBjcmVhdGVkIGJ5IHRoaXMgam9iIGlzIGRlbGV0ZWQgd2hlbiB0aGUgam9iIGlzIGdhcmJhZ2UgY29sbGVjdGVkIGJ5IFNwbHVuay5cbiAgICAgICAgICpcbiAgICAgICAgICogSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBtYW5hZ2UgdGhpcyBqb2IsIGluY2x1ZGluZyBjYW5jZWxsaW5nIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIHNlcnZpY2UuZGF0YU1vZGVscygpLmZldGNoKGZ1bmN0aW9uKGVyciwgZGF0YU1vZGVscykge1xuICAgICAgICAgKiAgICAgICAgICB2YXIgb2JqZWN0ID0gZGF0YU1vZGVscy5pdGVtKFwic29tZV9kYXRhX21vZGVsXCIpLm9iamVjdEJ5TmFtZShcInNvbWVfb2JqZWN0XCIpO1xuICAgICAgICAgKiAgICAgICAgICBvYmplY3QuY3JlYXRlTG9jYWxBY2NlbGVyYXRpb25Kb2IoXCItMWRcIiwgZnVuY3Rpb24oZXJyLCBhY2NlbGVyYXRpb25Kb2IpIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIGpvYiBoYXMgbmFtZTpcIiwgYWNjZWxlcmF0aW9uSm9iLm5hbWUpO1xuICAgICAgICAgKiAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGVhcmxpZXN0VGltZSBBIHRpbWUgbW9kaWZpZXIgKGUuZy4sIFwiLTJ3XCIpIHNldHRpbmcgdGhlIGVhcmxpZXN0IHRpbWUgdG8gaW5kZXguXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBzZWFyY2ggam9iOiBgKGVyciwgYWNjZWxlcmF0aW9uSm9iKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZUxvY2FsQWNjZWxlcmF0aW9uSm9iOiBmdW5jdGlvbihlYXJsaWVzdFRpbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiBlYXJsaWVzdFRpbWUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gc2V0IGNhbGxiYWNrIHRvIGl0cyB2YWx1ZVxuICAgICAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB1dGlscy5pc0Z1bmN0aW9uKGVhcmxpZXN0VGltZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVhcmxpZXN0VGltZTtcbiAgICAgICAgICAgICAgICBlYXJsaWVzdFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBxdWVyeSA9IFwifCBkYXRhbW9kZWwgXFxcIlwiICsgdGhpcy5kYXRhTW9kZWwubmFtZSArIFwiXFxcIiBcIiArIHRoaXMubmFtZSArIFwiIHNlYXJjaCB8IHRzY29sbGVjdFwiO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBlYXJsaWVzdFRpbWUgPyB7ZWFybGllc3RfdGltZTogZWFybGllc3RUaW1lfSA6IHt9O1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5zZXJ2aWNlLnNlYXJjaChxdWVyeSwgYXJncywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydCBhIHNlYXJjaCBqb2IgdGhhdCBhcHBsaWVzIHF1ZXJ5U3VmZml4IHRvIGFsbCB0aGUgZXZlbnRzIGluIHRoaXMgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgc2VydmljZS5kYXRhTW9kZWxzKCkuZmV0Y2goZnVuY3Rpb24oZXJyLCBkYXRhTW9kZWxzKSB7XG4gICAgICAgICAqICAgICAgICAgIHZhciBvYmplY3QgPSBkYXRhTW9kZWxzLml0ZW0oXCJpbnRlcm5hbF9hdWRpdF9sb2dzXCIpLm9iamVjdEJ5TmFtZShcInNlYXJjaGVzXCIpO1xuICAgICAgICAgKiAgICAgICAgICBvYmplY3Quc3RhcnRTZWFyY2goe30sIFwifCBoZWFkIDVcIiwgZnVuY3Rpb24oZXJyLCBqb2IpIHtcbiAgICAgICAgICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIGpvYiBoYXMgbmFtZTpcIiwgam9iLm5hbWUpO1xuICAgICAgICAgKiAgICAgICAgICB9KTtcbiAgICAgICAgICogICAgICB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcyBmb3IgdGhlIHNlYXJjaCBqb2IuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMsIHNlZSA8YSBocmVmPVwiaHR0cDovL2Rldi5zcGx1bmsuY29tL3ZpZXcvU1AtQ0FBQUVGQSNzZWFyY2hqb2JwYXJhbXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5TZWFyY2ggam9iIHBhcmFtZXRlcnM8L2E+IG9uIFNwbHVuayBEZXZlbG9wZXIgUG9ydGFsLlxuICAgICAgICAgKiAgICAgICAgKipOb3RlOioqIFRoaXMgbWV0aG9kIHRocm93cyBhbiBlcnJvciBpZiB0aGUgYGV4ZWNfbW9kZT1vbmVzaG90YCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIHdpdGggdGhlIHByb3BlcnRpZXMgZGljdGlvbmFyeS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5U3VmZml4IEEgc2VhcmNoIHF1ZXJ5LCBzdGFydGluZyB3aXRoIGEgJ3wnIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCB0byBmZXRjaCB0aGUgY29udGVudHMgb2YgdGhpcyBkYXRhIG1vZGVsIG9iamVjdCAoZS5nLiwgXCJ8IGhlYWQgM1wiKS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggdGhlIHNlYXJjaCBqb2I6IGAoZXJyLCBqb2IpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbE9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgc3RhcnRTZWFyY2g6IGZ1bmN0aW9uKHBhcmFtcywgcXVlcnlTdWZmaXgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnkgPSBcInwgZGF0YW1vZGVsIFwiICsgdGhpcy5kYXRhTW9kZWwubmFtZSArIFwiIFwiICsgdGhpcy5uYW1lICsgXCIgc2VhcmNoXCI7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGEgc3BhY2UgdG8gdGhlIHF1ZXJ5U3VmZml4LCBvciBzZXQgaXQgdG8gYW4gZW1wdHkgc3RyaW5nIGlmIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBxdWVyeVN1ZmZpeCA9IChxdWVyeVN1ZmZpeCkgPyAoXCIgXCIgKyBxdWVyeVN1ZmZpeCkgOiAoXCJcIik7XG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5zZXJ2aWNlLnNlYXJjaChxdWVyeSArIHF1ZXJ5U3VmZml4LCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIG1vZGVsIG9iamVjdCB0aGlzIG9uZSBpbmhlcml0cyBmcm9tIGlmIGl0IGlzIGEgdXNlciBkZWZpbmVkLFxuICAgICAgICAgKiBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0fG51bGx9IFRoaXMgZGF0YSBtb2RlbCBvYmplY3QncyBwYXJlbnRcbiAgICAgICAgICogICAgIG9yIG51bGwgaWYgdGhpcyBpcyBub3QgYSB1c2VyIGRlZmluZWQgZGF0YSBtb2RlbCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxPYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIHBhcmVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhTW9kZWwub2JqZWN0QnlOYW1lKHRoaXMucGFyZW50TmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIG5ldyBQaXZvdCBTcGVjaWZpY2F0aW9uLCBhY2NlcHRzIG5vIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge3NwbHVua2pzLlNlcnZpY2UuUGl2b3RTcGVjaWZpY2F0aW9ufSBBIG5ldyBwaXZvdCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsT2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQaXZvdFNwZWNpZmljYXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gUGFzcyBpbiB0aGlzIERhdGFNb2RlbE9iamVjdCB0byBjcmVhdGUgYSBQaXZvdFNwZWNpZmljYXRpb25cbiAgICAgICAgICAgIHJldHVybiBuZXcgcm9vdC5QaXZvdFNwZWNpZmljYXRpb24odGhpcyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZGF0YSBtb2RlbCBvbiB0aGUgc2VydmVyLiBEYXRhIG1vZGVsc1xuICAgICAqIGNvbnRhaW4gYERhdGFNb2RlbE9iamVjdGAgaW5zdGFuY2VzLCB3aGljaCBzcGVjaWZ5IHN0cnVjdHVyZWRcbiAgICAgKiB2aWV3cyBvbiBTcGx1bmsgZGF0YS5cbiAgICAgKlxuICAgICAqIEBlbmRwb2ludCBkYXRhbW9kZWwvbW9kZWwve25hbWV9XG4gICAgICogQGNsYXNzIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICogQGV4dGVuZHMgc3BsdW5ranMuU2VydmljZS5FbnRpdHlcbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbCA9IFNlcnZpY2UuRW50aXR5LmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIFJFU1QgZW5kcG9pbnQgcGF0aCBmb3IgdGhpcyByZXNvdXJjZSAod2l0aCBubyBuYW1lc3BhY2UpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5kYXRhTW9kZWxzICsgXCIvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge3NwbHVua2pzLlNlcnZpY2V9IHNlcnZpY2UgQSBgU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIGZvciB0aGUgbmV3IGRhdGEgbW9kZWwuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuYW1lc3BhY2UgKE9wdGlvbmFsKSBuYW1lc3BhY2UgaW5mb3JtYXRpb246XG4gICAgICAgICAqICAgIC0gYG93bmVyYCAoX3N0cmluZ18pOiBUaGUgU3BsdW5rIHVzZXJuYW1lLCBzdWNoIGFzIFwiYWRtaW5cIi4gQSB2YWx1ZSBvZiBcIm5vYm9keVwiIG1lYW5zIG5vIHNwZWNpZmljIHVzZXIuIFRoZSBcIi1cIiB3aWxkY2FyZCBtZWFucyBhbGwgdXNlcnMuXG4gICAgICAgICAqICAgIC0gYGFwcGAgKF9zdHJpbmdfKTogVGhlIGFwcCBjb250ZXh0IGZvciB0aGlzIHJlc291cmNlIChzdWNoIGFzIFwic2VhcmNoXCIpLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIGFwcHMuXG4gICAgICAgICAqICAgIC0gYHNoYXJpbmdgIChfc3RyaW5nXyk6IEEgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIHJlc291cmNlIGlzIHNoYXJlZC4gVGhlIHNoYXJpbmcgbW9kZSBjYW4gYmUgXCJ1c2VyXCIsIFwiYXBwXCIsIFwiZ2xvYmFsXCIsIG9yIFwic3lzdGVtXCIuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIG9mIHRoaXMgZGF0YSBtb2RlbDpcbiAgICAgICAgICogICAgLSBgYWNjZWxlcmF0aW9uYCAoX3N0cmluZ18pOiBBIEpTT04gb2JqZWN0IHdpdGggYW4gYGVuYWJsZWRgIGtleSwgcmVwcmVzZW50aW5nIGlmIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkIG9yIG5vdC5cbiAgICAgICAgICogICAgLSBgY29uY2lzZWAgKF9zdHJpbmdfKTogSW5kaWNhdGVzIHdoZXRoZXIgdG8gbGlzdCBhIGNvbmNpc2UgSlNPTiBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBtb2RlbCwgc2hvdWxkIGFsd2F5cyBiZSBcIjBcIi5cbiAgICAgICAgICogICAgLSBgZGVzY3JpcHRpb25gIChfc3RyaW5nXyk6IFRoZSBKU09OIGRlc2NyaWJpbmcgdGhlIGRhdGEgbW9kZWwuXG4gICAgICAgICAqICAgIC0gYGRpc3BsYXlOYW1lYCAoX3N0cmluZ18pOiBUaGUgbmFtZSBkaXNwbGF5ZWQgZm9yIHRoZSBkYXRhIG1vZGVsIGluIFNwbHVuayBXZWIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWUsIG5hbWVzcGFjZSwgcHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vdCBnaXZlbiBhIDR0aCBhcmcsIGFzc3VtZSB0aGUgbmFtZXNwYWNlIHdhcyBvbWl0dGVkXG4gICAgICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcihzZXJ2aWNlLCB0aGlzLnBhdGgoKSwgbmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24gPSBKU09OLnBhcnNlKHByb3BzLmNvbnRlbnQuYWNjZWxlcmF0aW9uKSB8fCB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VsZXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShcImVuYWJsZWRcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBlbmFibGVkIHByb3BlcnR5IHRvIGEgYm9vbGVhblxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uLmVuYWJsZWQgPSAhIXRoaXMuYWNjZWxlcmF0aW9uLmVuYWJsZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbmNpc2U9MCAoZmFsc2UpIGZvcmNlcyB0aGUgc2VydmVyIHRvIHJldHVybiBhbGwgZGV0YWlscyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBkYXRhIG1vZGVsLlxuICAgICAgICAgICAgLy8gd2UgZG8gbm90IHdhbnQgYSBzdW1tYXJ5IG9mIHRoaXMgZGF0YSBtb2RlbFxuICAgICAgICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShcImNvbmNpc2VcIikgfHwgdXRpbHMuaXNVbmRlZmluZWQocHJvcHMuY29uY2lzZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNpc2UgPSBcIjBcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRhdGFNb2RlbERlZmluaXRpb24gPSBKU09OLnBhcnNlKHByb3BzLmNvbnRlbnQuZGVzY3JpcHRpb24pO1xuXG4gICAgICAgICAgICB0aGlzLm9iamVjdE5hbWVzID0gZGF0YU1vZGVsRGVmaW5pdGlvbi5vYmplY3ROYW1lTGlzdDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkYXRhTW9kZWxEZWZpbml0aW9uLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGFNb2RlbERlZmluaXRpb24uZGVzY3JpcHRpb247XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBvYmplY3RzIGZvciB0aGlzIGRhdGEgbW9kZWwgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG9ianMgPSBkYXRhTW9kZWxEZWZpbml0aW9uLm9iamVjdHM7XG4gICAgICAgICAgICB0aGlzLm9iamVjdHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG5ldyByb290LkRhdGFNb2RlbE9iamVjdChvYmpzW2ldLCB0aGlzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlID0gdXRpbHMuYmluZCh0aGlzLCB0aGlzLnJlbW92ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIGlzQWNjZWxlcmF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5hY2NlbGVyYXRpb24uZW5hYmxlZDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGRhdGEgbW9kZWwgb2JqZWN0IGZyb20gdGhpcyBkYXRhIG1vZGVsXG4gICAgICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdHxudWxsfSBhIGRhdGEgbW9kZWwgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsXG4gICAgICAgICAqL1xuICAgICAgICBvYmplY3RCeU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBib29sZWFuIG9mIHdoZXRoZXIgdGhpcyBleGlzdHMgaW4gdGhpcyBkYXRhIG1vZGVsIG9yIG5vdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoaXMgZGF0YSBtb2RlbCBoYXMgb2JqZWN0IHdpdGggc3BlY2lmaWVkIG5hbWUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgaGFzT2JqZWN0OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMuY29udGFpbnModGhpcy5vYmplY3ROYW1lcywgbmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGRhdGEgbW9kZWwgb24gdGhlIHNlcnZlciwgdXNlZCB0byB1cGRhdGUgYWNjZWxlcmF0aW9uIHNldHRpbmdzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMgdG8gdXBkYXRlIHRoZSBvYmplY3Qgd2l0aDpcbiAgICAgICAgICogICAgIC0gYGFjY2VsZXJhdGlvbmAgKF9vYmplY3RfKTogVGhlIGFjY2VsZXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIGRhdGEgbW9kZWwuXG4gICAgICAgICAqICAgICAgICAgVmFsaWQga2V5cyBhcmU6IGBlbmFibGVkYCwgYGVhcmxpZXN0VGltZWAsIGBjcm9uU2NoZWR1bGVgLlxuICAgICAgICAgKiAgICAgICAgIEFueSBrZXlzIG5vdCBzZXQgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgYWNjZWxlcmF0aW9uIHNldHRpbmdzIGFscmVhZHlcbiAgICAgICAgICogICAgICAgICBzZXQgb24gdGhpcyBkYXRhIG1vZGVsLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZGF0YSBtb2RlbCBpcyB1cGRhdGVkOiBgKGVyciwgZGF0YU1vZGVsKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvcHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9wcztcbiAgICAgICAgICAgICAgICBwcm9wcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiTXVzdCBzcGVjaWZ5IGEgcHJvcHMgYXJndW1lbnQgdG8gdXBkYXRlIGEgZGF0YSBtb2RlbC5cIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRXhpdCBpZiBwcm9wcyBpc24ndCBzZXQsIHRvIGF2b2lkIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHR3aWNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KFwibmFtZVwiKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgJ25hbWUnIGZpZWxkIGluICd1cGRhdGUnXCIpLCB0aGlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEV4aXQgaWYgdGhlIG5hbWUgaXMgc2V0LCB0byBhdm9pZCBjYWxsaW5nIHRoZSBjYWxsYmFjayB0d2ljZS5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHVwZGF0ZWRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb246IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogcHJvcHMuYWNjY2VsZXJhdGlvbiAmJiBwcm9wcy5hY2NlbGVyYXRpb24uZW5hYmxlZCB8fCB0aGlzLmFjY2VsZXJhdGlvbi5lbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBlYXJsaWVzdF90aW1lOiBwcm9wcy5hY2NjZWxlcmF0aW9uICYmIHByb3BzLmFjY2VsZXJhdGlvbi5lYXJsaWVzdFRpbWUgfHwgdGhpcy5hY2NlbGVyYXRpb24uZWFybGllc3RUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjcm9uX3NjaGVkdWxlOiBwcm9wcy5hY2NjZWxlcmF0aW9uICYmIHByb3BzLmFjY2VsZXJhdGlvbi5jcm9uU2NoZWR1bGUgfHwgdGhpcy5hY2NlbGVyYXRpb24uY3JvblNjaGVkdWxlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3QoXCJcIiwgdXBkYXRlZFByb3BzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFNb2RlbE5hbWVzcGFjZSA9IHV0aWxzLm5hbWVzcGFjZUZyb21Qcm9wZXJ0aWVzKHJlc3BvbnNlLmRhdGEuZW50cnlbMF0pO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBuZXcgcm9vdC5EYXRhTW9kZWwodGhhdC5zZXJ2aWNlLCByZXNwb25zZS5kYXRhLmVudHJ5WzBdLm5hbWUsIGRhdGFNb2RlbE5hbWVzcGFjZSwgcmVzcG9uc2UuZGF0YS5lbnRyeVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZGF0YSBtb2RlbHMuIFlvdSBjYW4gY3JlYXRlIGFuZFxuICAgICAqIGxpc3QgZGF0YSBtb2RlbHMgdXNpbmcgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5lciwgb3JcbiAgICAgKiBnZXQgYSBzcGVjaWZpYyBkYXRhIG1vZGVsLlxuICAgICAqXG4gICAgICogQGVuZHBvaW50IGRhdGFtb2RlbC9tb2RlbFxuICAgICAqIEBjbGFzcyBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgKiBAZXh0ZW5kcyBzcGx1bmtqcy5TZXJ2aWNlLkNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICByb290LkRhdGFNb2RlbHMgPSBTZXJ2aWNlLkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyB0aGUgUkVTVCBlbmRwb2ludCBwYXRoIGZvciB0aGlzIHJlc291cmNlICh3aXRoIG5vIG5hbWVzcGFjZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzXG4gICAgICAgICAqL1xuICAgICAgICBwYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXRocy5kYXRhTW9kZWxzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc2AuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtzcGx1bmtqcy5TZXJ2aWNlfSBzZXJ2aWNlIEEgYFNlcnZpY2VgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmFtZXNwYWNlIChPcHRpb25hbCkgbmFtZXNwYWNlIGluZm9ybWF0aW9uOlxuICAgICAgICAgKiAgICAtIGBvd25lcmAgKF9zdHJpbmdfKTogVGhlIFNwbHVuayB1c2VybmFtZSwgc3VjaCBhcyBcImFkbWluXCIuIEEgdmFsdWUgb2YgXCJub2JvZHlcIiBtZWFucyBubyBzcGVjaWZpYyB1c2VyLiBUaGUgXCItXCIgd2lsZGNhcmQgbWVhbnMgYWxsIHVzZXJzLlxuICAgICAgICAgKiAgICAtIGBhcHBgIChfc3RyaW5nXyk6IFRoZSBhcHAgY29udGV4dCBmb3IgdGhpcyByZXNvdXJjZSAoc3VjaCBhcyBcInNlYXJjaFwiKS4gVGhlIFwiLVwiIHdpbGRjYXJkIG1lYW5zIGFsbCBhcHBzLlxuICAgICAgICAgKiAgICAtIGBzaGFyaW5nYCAoX3N0cmluZ18pOiBBIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSByZXNvdXJjZSBpcyBzaGFyZWQuIFRoZSBzaGFyaW5nIG1vZGUgY2FuIGJlIFwidXNlclwiLCBcImFwcFwiLCBcImdsb2JhbFwiLCBvciBcInN5c3RlbVwiLlxuICAgICAgICAgKiBcbiAgICAgICAgICogQG1ldGhvZCBzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbHNcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKHNlcnZpY2UsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gbmFtZXNwYWNlIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIoc2VydmljZSwgdGhpcy5wYXRoKCksIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSA9IHV0aWxzLmJpbmQodGhpcywgdGhpcy5jcmVhdGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGBEYXRhTW9kZWxgIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBJdCBpcyBwcmVmZXJyZWQgdGhhdCB5b3UgY3JlYXRlIGRhdGEgbW9kZWxzIHRocm91Z2ggdGhlIFNwbHVua1xuICAgICAgICAgKiBFbnRlcnByaXNlIHdpdGggYSBicm93c2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCB0byBjcmVhdGUuIElmIGl0IGNvbnRhaW5zIHNwYWNlcyB0aGV5IHdpbGwgYmUgcmVwbGFjZWRcbiAgICAgICAgICogICAgIHdpdGggdW5kZXJzY29yZXMuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQSBkaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIHRoZSBuZXcgYERhdGFNb2RlbGAgb2JqZWN0OiBgKGVyciwgY3JlYXRlZERhdGFNb2RlbClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHNwbHVua2pzLlNlcnZpY2UuRGF0YU1vZGVsc1xuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBnZXQgKG5hbWUsIGNhbGxiYWNrKSBpbnN0ZWFkIG9mIChuYW1lLCBwYXJhbXMsIGNhbGxiYWNrKVxuICAgICAgICAgICAgLy8gZG8gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZSBzd2FwXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJhbXMpICYmICFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xuXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0KFwiXCIsIHtuYW1lOiBuYW1lLCBkZXNjcmlwdGlvbjogSlNPTi5zdHJpbmdpZnkocGFyYW1zKX0sIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YU1vZGVsID0gbmV3IHJvb3QuRGF0YU1vZGVsKHRoYXQuc2VydmljZSwgcmVzcG9uc2UuZGF0YS5lbnRyeVswXS5uYW1lLCB0aGF0Lm5hbWVzcGFjZSwgcmVzcG9uc2UuZGF0YS5lbnRyeVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGFNb2RlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEEgZGljdGlvbmFyeSBvZiBwcm9wZXJ0aWVzIHVzZWQgdG8gY3JlYXRlIGEgXG4gICAgICAgICAqIGBEYXRhTW9kZWxgIGluc3RhbmNlLlxuICAgICAgICAgKiBAcmV0dXJuIHtzcGx1bmtqcy5TZXJ2aWNlLkRhdGFNb2RlbH0gQSBuZXcgYERhdGFNb2RlbGAgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgc3BsdW5ranMuU2VydmljZS5EYXRhTW9kZWxzXG4gICAgICAgICAqL1xuICAgICAgICBpbnN0YW50aWF0ZUVudGl0eTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lc3BhY2UgPSB1dGlscy5uYW1lc3BhY2VGcm9tUHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHJvb3QuRGF0YU1vZGVsKHRoaXMuc2VydmljZSwgcHJvcHMubmFtZSwgZW50aXR5TmFtZXNwYWNlLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qISovXG4gICAgLy8gSXRlcmF0ZXMgb3ZlciBhbiBlbmRwb2ludCdzIHJlc3VsdHMuXG4gICAgcm9vdC5QYWdpbmF0ZWRFbmRwb2ludEl0ZXJhdG9yID0gQ2xhc3MuZXh0ZW5kKHtcbiAgICAgICAgaW5pdDogZnVuY3Rpb24oZW5kcG9pbnQsIHBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9lbmRwb2ludCA9IGVuZHBvaW50O1xuICAgICAgICAgICAgdGhpcy5fcGFnZXNpemUgPSBwYXJhbXMucGFnZXNpemUgfHwgMDtcbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IDA7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvLyBGZXRjaGVzIHRoZSBuZXh0IHBhZ2UgZnJvbSB0aGUgZW5kcG9pbnQuXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgY291bnQ6IHRoaXMuX3BhZ2VzaXplLFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5fb2Zmc2V0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZHBvaW50KHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtUmVzdWx0cyA9IChyZXN1bHRzLnJvd3MgPyByZXN1bHRzLnJvd3MubGVuZ3RoIDogMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29mZnNldCArPSBudW1SZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cywgbnVtUmVzdWx0cyA+IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpOyJdfQ== \ No newline at end of file From 18b07e86f9b0c36c0dc15b48322d25f6cb2845ea Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 19 Nov 2021 17:11:29 +0530 Subject: [PATCH 03/11] Updated null check --- lib/service.js | 5 ++++- tests/service_tests/configuration.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/service.js b/lib/service.js index 98efcb767..4e80670b1 100644 --- a/lib/service.js +++ b/lib/service.js @@ -3129,7 +3129,10 @@ var response = await this.get_v2("", {__conf: filename}); // 2. Filter the files - var files = response?.body?.entry?.filter(f => f.name === filename); + var files = response + && response.body + && response.body.entry + && response.body.entry.filter(f => f.name === filename); // 3. Check if the file exists if(files && files.length == 0) { diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index cf10ea935..089fce911 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -167,7 +167,7 @@ exports.setup = function (svc) { // a. File exists: Positive var doesFileExistResponse1 = await configs.doesFileExist(filename); - var configFile = doesFileExistResponse1?.file; + var configFile = doesFileExistResponse1.file; assert.ok(configFile); // b. Stanza exists: Positive @@ -182,7 +182,7 @@ exports.setup = function (svc) { // c. File exists: Negative var doesFileExistResponse2 = await configs.doesFileExist("invalid_filename"); - var invalidConfigFile = doesFileExistResponse2?.file; + var invalidConfigFile = doesFileExistResponse2.file; assert.ok(!invalidConfigFile); From 26ce0c348a30cfc2d4b8b51c195c91d2a65b80af Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Wed, 1 Dec 2021 16:34:25 +0530 Subject: [PATCH 04/11] Refactored --- lib/context.js | 4 +- lib/http.js | 84 ++++++++++------------------ lib/platform/node/node_http.js | 2 +- lib/service.js | 17 +++--- tests/service_tests/configuration.js | 6 +- 5 files changed, 43 insertions(+), 70 deletions(-) diff --git a/lib/context.js b/lib/context.js index 71c55427a..89871ca10 100644 --- a/lib/context.js +++ b/lib/context.js @@ -371,10 +371,10 @@ return this._requestWrapper(request, callback); }, - get_v2: function(path, params) { + getAsync: function(path, params) { var that = this; // var request = function() { - return that.http.get_v2( + return that.http.getAsync( that.urlify(path), that._headers(), params, diff --git a/lib/http.js b/lib/http.js index 5f3bed530..5a3e1e0de 100644 --- a/lib/http.js +++ b/lib/http.js @@ -144,7 +144,7 @@ return this.request(url, message, callback); }, - get_v2: function(url, headers, params, timeout) { + getAsync: function(url, headers, params, timeout) { var message = { method: "GET", headers: headers, @@ -152,7 +152,7 @@ query: params }; - return this.request_v2(url, message); + return this.request(url, message, true); }, /** @@ -215,29 +215,6 @@ */ request: function(url, message, callback) { var that = this; - var wrappedCallback = function(response) { - callback = callback || function() {}; - - // Handle cookies if 'set-cookie' header is in the response - - var cookieHeaders = response.response.headers['set-cookie']; - if (cookieHeaders) { - utils.forEach(cookieHeaders, function (cookieHeader) { - var cookie = that._parseCookieHeader(cookieHeader); - that._cookieStore[cookie.key] = cookie.value; - }); - } - - // Handle callback - - if (response.status < 400 && response.status !== "abort") { - callback(null, response); - } - else { - callback(response); - } - }; - var query = utils.getWithVersion(this.version, queryBuilderMap)(message); var post = message.post || {}; @@ -264,38 +241,35 @@ // Now we can invoke the user-provided HTTP class, // passing in our "wrapped" callback - return this.makeRequest(encodedUrl, options, wrappedCallback); - }, - - request_v2: function(url, message) { - var that = this; - var query = utils.getWithVersion(this.version, queryBuilderMap)(message); - var post = message.post || {}; - - var encodedUrl = url + "?" + Http.encode(query); - var body = message.body ? message.body : Http.encode(post); - - var cookieString = that._getCookieString(); - - if (cookieString.length !== 0) { - message.headers["Cookie"] = cookieString; - - // Remove Authorization header - // Splunk will use Authorization header and ignore Cookies if Authorization header is sent - delete message.headers["Authorization"]; + if(callback && typeof callback === 'boolean') { + return this.makeRequestAsync(encodedUrl, options); } + else { + var wrappedCallback = function(response) { + callback = callback || function() {}; + + // Handle cookies if 'set-cookie' header is in the response + + var cookieHeaders = response.response.headers['set-cookie']; + if (cookieHeaders) { + utils.forEach(cookieHeaders, function (cookieHeader) { + var cookie = that._parseCookieHeader(cookieHeader); + that._cookieStore[cookie.key] = cookie.value; + }); + } + + // Handle callback + + if (response.status < 400 && response.status !== "abort") { + callback(null, response); + } + else { + callback(response); + } + }; - var options = { - method: message.method, - headers: message.headers, - timeout: message.timeout, - body: body - }; - - // Now we can invoke the user-provided HTTP class, - // var res_2 = await this.makeRequest_v2(encodedUrl, options); - // console.log(res_2.body.entry[0]); - return this.makeRequest_v2(encodedUrl, options); + return this.makeRequest(encodedUrl, options, wrappedCallback); + } }, /** diff --git a/lib/platform/node/node_http.js b/lib/platform/node/node_http.js index 4393b5bc2..416ed65cd 100644 --- a/lib/platform/node/node_http.js +++ b/lib/platform/node/node_http.js @@ -85,7 +85,7 @@ return req; }, - makeRequest_v2: async function(url, message) { + makeRequestAsync: async function(url, message) { var request_options = { url: url, method: message.method, diff --git a/lib/service.js b/lib/service.js index 4e80670b1..64a65d8f4 100644 --- a/lib/service.js +++ b/lib/service.js @@ -733,7 +733,7 @@ ); }, - get_v2: function(relpath, params) { + getAsync: function(relpath, params) { var url = this.qualifiedPath; // If we have a relative path, we will append it with a preceding @@ -742,7 +742,7 @@ url = url + "/" + relpath; } - return this.service.get_v2( + return this.service.getAsync( url, params, ); @@ -1410,15 +1410,14 @@ return req; }, - fetch_v2: async function(options) { + fetchAsync: async function(options) { options = options || {}; if (!options.count) { options.count = 0; } var that = this; - var response = await that.get_v2("", options); - // return response; + var response = await that.getAsync("", options); that._load(response.body); return that; }, @@ -3126,7 +3125,7 @@ var that = this; // 1. Fetch files list - var response = await this.get_v2("", {__conf: filename}); + var response = await this.getAsync("", {__conf: filename}); // 2. Filter the files var files = response @@ -3143,7 +3142,7 @@ var configurationFile = new root.ConfigurationFile(that.service, filename); // 5. Load the file content - var fetchedFile = await configurationFile.fetch_v2(); + var fetchedFile = await configurationFile.fetchAsync(); return {file: fetchedFile}; } @@ -3170,7 +3169,7 @@ } }, - create_v2: async function (configs, svc, filename, stanza, keyValueMap, callback) { + createAsync: async function (configs, svc, filename, stanza, keyValueMap, callback) { callback = callback || function() {}; var that = this; @@ -3187,7 +3186,7 @@ (err, newFile) => console.log(`Configuration File created: ${filename}`) ); configFile = new root.ConfigurationFile( that.service, filename ); - configFile = await configFile.fetch_v2(); + configFile = await configFile.fetchAsync(); } // 2. Check if the stanza exists diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index 089fce911..37d715e21 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -139,7 +139,7 @@ exports.setup = function (svc) { }); }); - it("Callback#create_v2", function (done) { + it("Callback#createAsync", function (done) { var that = this; var namespace = { owner: "nobody", app: "system" }; var filename = "jssdk_file_new_" + getNextId(); @@ -159,7 +159,7 @@ exports.setup = function (svc) { keyValueMap[property1] = value1; keyValueMap[property2] = value2; - configs.create_v2(configs, svc, filename, stanza, keyValueMap, done); + configs.createAsync(configs, svc, filename, stanza, keyValueMap, done); }, async function (done) { var configs = svc.configurations(namespace); @@ -171,7 +171,7 @@ exports.setup = function (svc) { assert.ok(configFile); // b. Stanza exists: Positive - configFile = await configFile.fetch_v2(); + configFile = await configFile.fetchAsync(); var doesStanzaExistResponse1 = await configs.doesStanzaExist(configFile, stanza); var configStanza = doesStanzaExistResponse1.stanza; From b3fd917d2d010c8b271f446051817029edbc8d0f Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Wed, 1 Dec 2021 16:36:23 +0530 Subject: [PATCH 05/11] Update context.js --- lib/context.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/context.js b/lib/context.js index 89871ca10..3fc11c0ce 100644 --- a/lib/context.js +++ b/lib/context.js @@ -373,16 +373,12 @@ getAsync: function(path, params) { var that = this; - // var request = function() { - return that.http.getAsync( - that.urlify(path), - that._headers(), - params, - that.timeout, - ); - // }; - - // return this._requestWrapper(request); + return that.http.getAsync( + that.urlify(path), + that._headers(), + params, + that.timeout, + ); }, /** From b00bef30ad073b5b187958d7f9a9ccdff543fd92 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Thu, 2 Dec 2021 16:08:15 +0530 Subject: [PATCH 06/11] Refactored --- lib/context.js | 35 +++++++++++++++------------- lib/http.js | 19 ++++----------- lib/service.js | 26 +++++---------------- tests/service_tests/configuration.js | 2 +- 4 files changed, 30 insertions(+), 52 deletions(-) diff --git a/lib/context.js b/lib/context.js index 3fc11c0ce..12efada12 100644 --- a/lib/context.js +++ b/lib/context.js @@ -356,29 +356,32 @@ * * @method splunkjs.Context */ - get: function(path, params, callback) { + get: function(path, params, callback, isAsync) { var that = this; - var request = function(callback) { + + if(isAsync) { return that.http.get( that.urlify(path), that._headers(), params, that.timeout, - callback + null, + true ); - }; - - return this._requestWrapper(request, callback); - }, - - getAsync: function(path, params) { - var that = this; - return that.http.getAsync( - that.urlify(path), - that._headers(), - params, - that.timeout, - ); + } + else { + var request = function(callback) { + return that.http.get( + that.urlify(path), + that._headers(), + params, + that.timeout, + callback + ); + }; + + return this._requestWrapper(request, callback); + } }, /** diff --git a/lib/http.js b/lib/http.js index 5a3e1e0de..2fb686da0 100644 --- a/lib/http.js +++ b/lib/http.js @@ -133,7 +133,7 @@ * * @method splunkjs.Http */ - get: function(url, headers, params, timeout, callback) { + get: function(url, headers, params, timeout, callback, isAsync) { var message = { method: "GET", headers: headers, @@ -141,18 +141,7 @@ query: params }; - return this.request(url, message, callback); - }, - - getAsync: function(url, headers, params, timeout) { - var message = { - method: "GET", - headers: headers, - timeout: timeout, - query: params - }; - - return this.request(url, message, true); + return this.request(url, message, callback, isAsync); }, /** @@ -213,7 +202,7 @@ * @method splunkjs.Http * @see makeRequest */ - request: function(url, message, callback) { + request: function(url, message, callback, isAsync) { var that = this; var query = utils.getWithVersion(this.version, queryBuilderMap)(message); var post = message.post || {}; @@ -241,7 +230,7 @@ // Now we can invoke the user-provided HTTP class, // passing in our "wrapped" callback - if(callback && typeof callback === 'boolean') { + if(isAsync) { return this.makeRequestAsync(encodedUrl, options); } else { diff --git a/lib/service.js b/lib/service.js index 64a65d8f4..81809f032 100644 --- a/lib/service.js +++ b/lib/service.js @@ -717,7 +717,7 @@ * * @method splunkjs.Service.Endpoint */ - get: function(relpath, params, callback) { + get: function(relpath, params, callback, isAsync) { var url = this.qualifiedPath; // If we have a relative path, we will append it with a preceding @@ -729,22 +729,8 @@ return this.service.get( url, params, - callback - ); - }, - - getAsync: function(relpath, params) { - var url = this.qualifiedPath; - - // If we have a relative path, we will append it with a preceding - // slash. - if (relpath) { - url = url + "/" + relpath; - } - - return this.service.getAsync( - url, - params, + callback, + isAsync ); }, @@ -1417,7 +1403,7 @@ } var that = this; - var response = await that.getAsync("", options); + var response = await that.get("", options, null, true); that._load(response.body); return that; }, @@ -3125,7 +3111,7 @@ var that = this; // 1. Fetch files list - var response = await this.getAsync("", {__conf: filename}); + var response = await this.get("", {__conf: filename}, null, true); // 2. Filter the files var files = response @@ -3169,7 +3155,7 @@ } }, - createAsync: async function (configs, svc, filename, stanza, keyValueMap, callback) { + createAsync: async function (filename, stanza, keyValueMap, callback) { callback = callback || function() {}; var that = this; diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index 37d715e21..d539e0eec 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -159,7 +159,7 @@ exports.setup = function (svc) { keyValueMap[property1] = value1; keyValueMap[property2] = value2; - configs.createAsync(configs, svc, filename, stanza, keyValueMap, done); + configs.createAsync(filename, stanza, keyValueMap, done); }, async function (done) { var configs = svc.configurations(namespace); From 034e411b692094f00774fdd9caaffb0507907170 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Wed, 5 Jan 2022 15:40:55 +0530 Subject: [PATCH 07/11] Structural changes for .conf CRUD functionality 1. Method renamed: doesFileExist --> getConfFile 2. Method renamed: doesStanzaExist --> getStanza 3. try/catch removed to let exception propagate to calling method 4. return file/stanza if found or else return null --- lib/service.js | 95 +++++++++++----------------- tests/service_tests/configuration.js | 24 +++---- 2 files changed, 46 insertions(+), 73 deletions(-) diff --git a/lib/service.js b/lib/service.js index 81809f032..b64eeedfc 100644 --- a/lib/service.js +++ b/lib/service.js @@ -3106,52 +3106,41 @@ return req; }, - doesFileExist: async function(filename) { - try { - var that = this; - - // 1. Fetch files list - var response = await this.get("", {__conf: filename}, null, true); - - // 2. Filter the files - var files = response - && response.body - && response.body.entry - && response.body.entry.filter(f => f.name === filename); - - // 3. Check if the file exists - if(files && files.length == 0) { - return { code:"FILE_NOT_FOUND", message: `File with the name '${filename}' does not exist.`}; - } - - // 4. Create a local instance - var configurationFile = new root.ConfigurationFile(that.service, filename); + getConfFile: async function(filename) { + var that = this; - // 5. Load the file content - var fetchedFile = await configurationFile.fetchAsync(); + // 1. Fetch files list + var response = await this.get("", {__conf: filename}, null, true); - return {file: fetchedFile}; - } - catch(error) { - return { errorCode:"SYSTEM_ERROR", errorMessage: error}; + // 2. Filter the files + var files = response + && response.body + && response.body.entry + && response.body.entry.filter(f => f.name === filename); + + // 3. Check if the file exists + if(files && files.length == 0) { + return null; } + + // 4. Create a local instance + var configurationFile = new root.ConfigurationFile(that.service, filename); + + // 5. Load the file content + var fetchedFile = await configurationFile.fetchAsync(); + + return fetchedFile; }, - doesStanzaExist: async function(file, stanza) { - try { - - // 1. check if the stanza exists - var fetchedStanza = file.item(stanza); - - if(!fetchedStanza) { - return { code:"STANZA_NOT_FOUND", message: `Stanza with the name '${stanza}' does not exist.`}; - } - else { - return {stanza: fetchedStanza}; - } + getStanza: async function(file, stanza) { + // 1. check if the stanza exists + var fetchedStanza = file.item(stanza); + + if(fetchedStanza == undefined) { + return null; } - catch(error) { - return { errorCode:"SYSTEM_ERROR", errorMessage: error}; + else { + return fetchedStanza; } }, @@ -3160,39 +3149,31 @@ var that = this; // 1. Check if the file exists - var doesFileExistResponse = await this.doesFileExist(filename); - var configFile = doesFileExistResponse.file; + var configFile = await this.getConfFile(filename); // 2. If the file doesn't exist, create a new file - if(!configFile) { - console.log(doesFileExistResponse); - console.log("Creating a new configuration file..."); + if(configFile == undefined) { - that.create( { __conf: filename }, - (err, newFile) => console.log(`Configuration File created: ${filename}`) ); + that.create( { __conf: filename }); configFile = new root.ConfigurationFile( that.service, filename ); configFile = await configFile.fetchAsync(); } - // 2. Check if the stanza exists - var doesStanzaExistResponse = await this.doesStanzaExist(configFile, stanza); - var configStanza = doesStanzaExistResponse.stanza; + // 3. Check if the stanza exists + var configStanza = await this.getStanza(configFile, stanza); - // 3. If the stanza doesn't exist, create a new stanza with given keyValueMap - if(!configStanza) { - console.log(doesStanzaExistResponse); - console.log("Creating a new configuration stanza..."); + // 4. If the stanza doesn't exist, create a new stanza with given keyValueMap + if(configStanza == undefined) { configFile.create(stanza, keyValueMap, function (err, newStanza) { - console.log(`Configuration Stanza created: ${stanza}`); callback(); }); } - // 4. If the stanza exists, update it with the keyValueMap + + // 5. If the stanza exists, update it with the keyValueMap else { configStanza.update(keyValueMap, (err, updatedStanza) => { - console.log(`Configuration Stanza updated: ${stanza}`); callback(); }); } diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index d539e0eec..2fb1e04df 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -158,7 +158,6 @@ exports.setup = function (svc) { var keyValueMap = {} keyValueMap[property1] = value1; keyValueMap[property2] = value2; - configs.createAsync(filename, stanza, keyValueMap, done); }, async function (done) { @@ -166,39 +165,32 @@ exports.setup = function (svc) { configs.fetch(); // a. File exists: Positive - var doesFileExistResponse1 = await configs.doesFileExist(filename); - var configFile = doesFileExistResponse1.file; + var configFile = await configs.getConfFile(filename); assert.ok(configFile); // b. Stanza exists: Positive configFile = await configFile.fetchAsync(); - var doesStanzaExistResponse1 = await configs.doesStanzaExist(configFile, stanza); - var configStanza = doesStanzaExistResponse1.stanza; - + var configStanza = await configs.getStanza(configFile, stanza); assert.ok(configStanza); assert.ok(configStanza._properties); assert.strictEqual(configStanza._properties[property1], value1 ); assert.strictEqual(configStanza._properties[property2], value2 ); // c. File exists: Negative - var doesFileExistResponse2 = await configs.doesFileExist("invalid_filename"); - var invalidConfigFile = doesFileExistResponse2.file; - + var invalidConfigFile = await configs.getConfFile("invalid_filename"); assert.ok(!invalidConfigFile); // d. Stanza exists: Positive - var doesStanzaExistResponse2 = await configs.doesStanzaExist(configFile, "invalid_stanza_name"); - var invalidConfigStanza = doesStanzaExistResponse2.stanza; - + var invalidConfigStanza = await configs.getStanza(configFile, "invalid_stanza_name"); assert.ok(!invalidConfigStanza); done(); }, ], - function (err) { - assert.ok(!err); - done(); - }); + function (err) { + assert.ok(!err); + done(); + }); }); it("Callback#can get default stanza", function (done) { From 422d4d637ac373f200d1d92e786bbf341772ac97 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Wed, 5 Jan 2022 16:49:18 +0530 Subject: [PATCH 08/11] Update README.md --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 646d863b1..8d5bbe6cf 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,29 @@ Save the file as **.splunkrc** in the current user's home directory. Click **Yes**, then continue creating the file. +### Create/Update a .conf file +```javascript + +Async.chain([ + function (done) { + // Fetch configurations + var configs = svc.configurations(namespace); + configs.fetch(done); + }, + async function (configs, done) { + // Create a key-value map to store under a stanza + var keyValueMap = {} + keyValueMap[property1] = value1; + + // If file/stanza doesn't exist, it will be created + // else it will be updated. + configs.createAsync(filename, stanzaName, keyValueMap, done); + } +], +function (err) { + done(); +}); +``` ### Client-side examples From 7b5465115ce070a0042f32d4ce0639bca409fac3 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Wed, 5 Jan 2022 16:49:53 +0530 Subject: [PATCH 09/11] Refactoring --- lib/service.js | 7 ++++--- tests/service_tests/configuration.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/service.js b/lib/service.js index b64eeedfc..7ff14f8f9 100644 --- a/lib/service.js +++ b/lib/service.js @@ -1262,6 +1262,7 @@ this._load = utils.bind(this, this._load); this.fetch = utils.bind(this, this.fetch); this.create = utils.bind(this, this.create); + this.createAsync = utils.bind(this, this.createAsync); this.list = utils.bind(this, this.list); this.item = utils.bind(this, this.item); this.instantiateEntity = utils.bind(this, this.instantiateEntity); @@ -3144,7 +3145,7 @@ } }, - createAsync: async function (filename, stanza, keyValueMap, callback) { + createAsync: async function (filename, stanzaName, keyValueMap, callback) { callback = callback || function() {}; var that = this; @@ -3161,12 +3162,12 @@ } // 3. Check if the stanza exists - var configStanza = await this.getStanza(configFile, stanza); + var configStanza = await this.getStanza(configFile, stanzaName); // 4. If the stanza doesn't exist, create a new stanza with given keyValueMap if(configStanza == undefined) { - configFile.create(stanza, keyValueMap, function (err, newStanza) { + configFile.create(stanzaName, keyValueMap, function (err, newStanza) { callback(); }); } diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index 2fb1e04df..cb08cec5a 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -154,7 +154,7 @@ exports.setup = function (svc) { var configs = svc.configurations(namespace); configs.fetch(done); }, - async function (configs, done) { + function (configs, done) { var keyValueMap = {} keyValueMap[property1] = value1; keyValueMap[property2] = value2; @@ -180,7 +180,7 @@ exports.setup = function (svc) { var invalidConfigFile = await configs.getConfFile("invalid_filename"); assert.ok(!invalidConfigFile); - // d. Stanza exists: Positive + // d. Stanza exists: Negative var invalidConfigStanza = await configs.getStanza(configFile, "invalid_stanza_name"); assert.ok(!invalidConfigStanza); From 5fa52e6254d5eb899f2d19bc2e52e5206fbc9daa Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 7 Jan 2022 15:14:36 +0530 Subject: [PATCH 10/11] README and test updated README and test updated to use actual example for .conf file --- README.md | 5 ++++- tests/service_tests/configuration.js | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8d5bbe6cf..17816f3c3 100644 --- a/README.md +++ b/README.md @@ -230,8 +230,11 @@ Async.chain([ }, async function (configs, done) { // Create a key-value map to store under a stanza + const filename = "app.conf"; + const stanzaName = "install"; var keyValueMap = {} - keyValueMap[property1] = value1; + keyValueMap["state"] = "enabled"; + keyValueMap["python.version"] = "python3"; // If file/stanza doesn't exist, it will be created // else it will be updated. diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index cb08cec5a..e62acea1c 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -143,11 +143,11 @@ exports.setup = function (svc) { var that = this; var namespace = { owner: "nobody", app: "system" }; var filename = "jssdk_file_new_" + getNextId(); - var stanza = "jssdk_stanza" - var property1 = "foo1" - var value1 = "bar1"; - var property2 = "foo2" - var value2 = "bar2"; + var stanza = "install" + var property1 = "state" + var value1 = "enabled"; + var property2 = "python.version" + var value2 = "python3"; Async.chain([ function (done) { From 381f8aab3de75e8fb0bfbb19b1432b4c2bb349ed Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 7 Jan 2022 18:10:58 +0530 Subject: [PATCH 11/11] Doc string added for new methods --- lib/service.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/service.js b/lib/service.js index 7ff14f8f9..d648d12b7 100644 --- a/lib/service.js +++ b/lib/service.js @@ -1397,6 +1397,22 @@ return req; }, + /** + * It's an asynchronous version of fetch(options, callback) function. + * + * Refreshes the resource by fetching the object from the server and + * loading it. + * + * @param {Object} options A dictionary of collection filtering and pagination options: + * - `count` (_integer_): The maximum number of items to return. + * - `offset` (_integer_): The offset of the first item to return. + * - `search` (_string_): The search query to filter responses. + * - `sort_dir` (_string_): The direction to sort returned items: “asc” or “desc”. + * - `sort_key` (_string_): The field to use for sorting (optional). + * - `sort_mode` (_string_): The collating sequence for sorting returned items: “auto”, “alpha”, “alpha_case”, or “num”. + * + * @method splunkjs.Service.Collection + */ fetchAsync: async function(options) { options = options || {}; if (!options.count) { @@ -3107,6 +3123,15 @@ return req; }, + /** + * Fetch a configuration file. + * + * @param {String} file A name for configuration file. + * @return file, if exists or null + * + * @endpoint properties + * @method splunkjs.Service.Configurations + */ getConfFile: async function(filename) { var that = this; @@ -3133,6 +3158,16 @@ return fetchedFile; }, + /** + * Fetch a configuration stanza. + * + * @param {String} file A configuration file. + * @param {String} stanza A configuration stanza. + * @return stanza, if exists or null + * + * @endpoint properties + * @method splunkjs.Service.Configurations + */ getStanza: async function(file, stanza) { // 1. check if the stanza exists var fetchedStanza = file.item(stanza); @@ -3145,6 +3180,17 @@ } }, + /** + * Creates/Updates a configuration file and stanza. + * + * @param {String} filename A name for this configuration file to be created/updated. + * @param {String} stanzaName A name for the stanza to be created/updated. + * @param {String} keyValueMap A key-value map of properties to be put under the stanza. + * @param {Function} callback A function to call with the new configuration file. + * + * @endpoint properties + * @method splunkjs.Service.Configurations + */ createAsync: async function (filename, stanzaName, keyValueMap, callback) { callback = callback || function() {}; var that = this;