{"version":3,"sources":["webpack://L.esri/webpack/bootstrap","webpack://L.esri/external \"L\"","webpack://L.esri/./node_modules/esri-leaflet/dist/esri-leaflet-debug.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","object","property","prototype","hasOwnProperty","p","s","L","leaflet","cors","window","XMLHttpRequest","pointerEvents","document","documentElement","style","Support","options","attributionWidthOffset","callbacks","serialize","params","data","key","f","param","type","toString","length","JSON","stringify","join","valueOf","encodeURIComponent","createRequest","callback","context","httpRequest","onerror","e","onreadystatechange","Util","falseFn","error","code","message","response","readyState","parse","responseText","ontimeout","this","xmlHttpPost","url","open","timeout","setRequestHeader","send","xmlHttpGet","request","paramString","requestLength","jsonp","warn","_EsriLeafletCallbacks","callbackId","responseType","script","DomUtil","create","body","src","id","addClass","abort","_callback","CORS","JSONP","Request","post","closeRing","coordinates","a","b","pointsEqual","push","ringIsClockwise","ringToTest","pt2","total","rLength","pt1","vertexIntersectsVertex","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","arrayIntersectsArray","j","coordinatesContainCoordinates","outer","inner","intersects","contains","point","coordinatesContainPoint","orientRings","poly","output","polygon","slice","outerRing","shift","reverse","hole","shallowClone","obj","target","arcgisToGeoJSON","arcgis","idAttribute","geojson","x","y","z","points","paths","rings","outerRings","holes","ring","uncontainedHoles","pop","contained","convertRingsToGeoJSON","geometry","attributes","properties","keys","Error","getId","err","spatialReference","wkid","console","geojsonToArcGIS","result","flattenMultiPolygonRings","features","geometries","geojsonToArcGIS$1","idAttr","arcgisToGeoJSON$1","extentToBounds","extent","xmin","ymin","xmax","ymax","sw","latLng","ne","latLngBounds","boundsToExtent","bounds","getSouthWest","lng","lat","getNorthEast","knownFieldNames","_findIdAttributeFromResponse","objectIdFieldName","fields","match","_findIdAttributeFromFeature","feature","responseToFeatureCollection","objectIdField","results","count","featureCollection","cleanUrl","trim","getUrlParams","options$$1","indexOf","requestParams","queryString","substring","split","decodeURI","replace","isArcgisOnline","test","geojsonTypeToArcGIS","geoJsonType","arcgisGeometryType","apply","arguments","calcAttributionWidth","map","getSize","setEsriAttribution","attributionControl","_esriAttributionAdded","setPrefix","hoverAttributionStyle","createElement","innerHTML","getElementsByTagName","appendChild","_container","attributionStyle","on","maxWidth","parentNode","removeChild","nodeList","querySelectorAll","item","_setGeometry","geometryType","LatLngBounds","getLatLng","LatLng","GeoJSON","getLayers","toGeoJSON","_getAttributionData","bind","attributions","_esriAttributions","contributors","contributor","coverageAreas","coverageArea","southWest","bbox","northEast","attribution","score","minZoom","zoomMin","maxZoom","zoomMax","sort","_updateMapAttribution","evt","oldAttributions","newAttributions","getBounds","wrappedBounds","wrap","zoom","getZoom","text","substr","attributionElement","querySelector","fire","EsriUtil","Task","Class","extend","proxy","useCors","generateSetter","initialize","endpoint","_service","setOptions","setters","setter","token","authenticate","format","boolean","returnUnformattedValues","path","_request","method","Query","offset","limit","precision","featureIds","returnGeometry","returnM","transform","where","outSr","outFields","within","_setGeometryParams","spatialRel","crosses","touches","overlaps","bboxIntersects","indexIntersects","nearby","latlng","radius","units","distance","inSr","string","between","start","end","time","simplify","factor","mapWidth","Math","abs","getWest","getEast","maxAllowableOffset","orderBy","fieldName","order","orderByFields","run","_cleanParams","isModern","_trapSQLerrors","returnCountOnly","ids","returnIdsOnly","objectIds","returnExtentOnly","distinct","returnDistinctValues","pixelSize","rawPoint","castPoint","layer","converted","query","Find","sr","layers","dynamicLayers","returnZ","gdbVersion","layerDefs","find","Identify","IdentifyFeatures","tolerance","size","imageDisplay","mapExtent","at","layerDef","undefined","layerId","identifyFeatures","IdentifyImage","setMosaicRule","setRenderingRule","setPixelSize","returnCatalogItems","getMosaicRule","mosaicRule","getRenderingRule","renderingRule","getPixelSize","_responseToGeoJSON","location","catalogItems","catalogItemVisibilities","geoJSON","pixel","crs","OBJECTID","objectId","Values","values","catalogItemVisibility","identifyImage","Service","Evented","_requestQueue","_authenticating","metadata","_runQueue","getTimeout","setTimeout","wrappedCallback","_createServiceCallback","request$$1","MapService","identify","mapService","ImageService","imageService","FeatureLayerService","addFeature","addResults","updateFeature","updateResults","deleteFeature","deleteResults","deleteFeatures","featureLayerService","tileProtocol","protocol","BasemapLayer","TileLayer","statics","TILES","Streets","urlTemplate","subdomains","attributionUrl","Topographic","Oceans","OceansLabels","pane","NationalGeographic","DarkGray","DarkGrayLabels","Gray","GrayLabels","Imagery","ImageryLabels","ImageryTransportation","ShadedRelief","ShadedReliefLabels","Terrain","TerrainLabels","USATopo","ImageryClarity","config","tileOptions","onAdd","_initPane","onRemove","off","_map","getPane","createPane","zIndex","getAttribution","TiledMapLayer","zoomOffsetAllowance","errorTileUrl","MercatorZoomLevels","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","tileUrl","getParamString","service","addEventParent","arcgisonline","RegExp","getTileUrl","tilePoint","_getZoomForUrl","template","_getSubdomain","_lodMap","createTile","coords","done","tile","DomEvent","_tileOnLoad","_tileOnError","crossOrigin","alt","once","latestWkid","copyrightText","addAttribution","CRS","EPSG3857","arcgisLODs","tileInfo","lods","correctResolutions","arcgisLOD","ci","correctRes","_withinPercentage","resolution","level","tokenQs","percentage","diff","Overlay","ImageOverlay","_topLeft","getPixelBounds","min","_reset","setPosition","_image","subtract","getPixelOrigin","RasterLayer","Layer","opacity","position","interactive","_update","throttle","updateInterval","_currentImage","_bounds","equals","addLayer","removeLayer","_popup","_getPopupData","_resetPopupState","bindPopup","fn","popupOptions","_shouldRenderPopup","_lastClick","popup","_popupFunction","unbindPopup","closePopup","bringToFront","bringToBack","getOpacity","setOpacity","getTimeRange","from","to","setTimeRange","redraw","_renderImage","contentType","image","addTo","onOverlayLoad","newImage","oldImage","_animatingZoom","_panTransition","_inProgress","_buildExportParams","_requestExport","_renderPopup","content","setLatLng","setContent","openOn","_calculateBbox","pixelBounds","unproject","getBottomLeft","getTopRight","neProjected","project","swProjected","boundsProjected","_calculateImageSize","top","latLngToLayerPoint","bottom","ImageMapLayer","transparent","setPixelType","pixelType","getPixelType","setBandIds","bandIds","isArray","getBandIds","setNoData","noData","noDataInterpretation","getNoData","getNoDataInterpretation","identifyRequest","parseInt","bboxSR","imageSR","interpolation","compressionQuality","href","DynamicMapLayer","timeOptions","getDynamicLayers","setDynamicLayers","setLayers","getLayerDefs","setLayerDefs","getTimeOptions","setTimeOptions","dpi","disableCache","_ts","Date","now","imageData","VirtualGrid","cellSize","_zooming","removeEventListener","getEvents","_removeCells","events","moveend","zoomstart","_zoomstart","zoomend","removeFrom","_cells","_activeCells","_cellsToLoad","_cellsTotal","_cellNumBounds","_getCellNumBounds","_resetWrap","infinite","_getCellSize","wrapLng","_wrapLng","floor","ceil","wrapLat","_wrapLat","mapBounds","cellBounds","divideBy","max","_removeOtherCells","_addCells","queue","center","getCenter","_isValidCell","cellsToLoad","distanceTo","_addCell","cellNumBounds","_cellCoordsToBounds","nwPoint","multiplyBy","sePoint","add","nw","wrapLatLng","se","_cellCoordsToKey","_keyToCellCoords","kArr","_removeCell","cell","cellLeave","_wrapCoords","cellEnter","createCell","wrapNum","worldBounds","getPixelWorldBounds","BinarySearchIndex","concat","index","getIndex","dirty","currentIndex","currentElement","minIndex","maxIndex","round","startIndex","endIndex","insert","splice","bulkAdd","items","FeatureManager","timeField","timeFilterMode","simplifyFactor","oidCheck","_startTimeIndex","_endTimeIndex","_timeIndex","_cache","_currentSnapshot","_activeRequests","supportedFormats","supportedQueryFormats","forceJsonFormat","_handleZoomChange","_visibleZoom","_requestFeatures","_buildQuery","exceededTransferLimit","requestAnimFrame","_addFeatures","_postProcessFeatures","_cacheKey","_buildTimeIndexes","createLayers","setWhere","oldSnapshot","newSnapshot","pendingRequests","requestError","requestCallback","removeLayers","addLayers","getWhere","oldFrom","oldTo","_filterExistingFeatures","refresh","eachFeature","_redraw","newFrom","newTo","layersToRemove","_getFeaturesInTimeRange","layersToAdd","shouldRemoveLayer","search","startTimes","endTimes","startTimeEntries","endTimeEntries","timeEntries","_featureWithinTimeRange","date","startDate","endDate","_getMetadata","_metadata","FeatureLayer","cacheLayers","_originalStyle","_layers","permanent","createNewLayer","geometryToLayer","defaultOptions","_updateLayer","latlngs","coordsToLatLng","coordsToLatLngs","setLatLngs","newLayer","hasLayer","onEachFeature","setFeatureStyle","cacheKey","cellKey","removable","resetStyle","resetFeatureStyle","setStyle","Path","eachActiveFeature","activeBounds","getFeature","setIcon","pointToLayer","getIcon","updatedIcon","icon","getStyle","updatedStyle","VERSION","task","basemapLayer","tiledMapLayer","imageMapLayer","dynamicMapLayer","featureLayer","factory"],"mappings":"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","file":"esri-leaflet-prod.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","module.exports = L;","/* esri-leaflet - v2.1.4 - Fri Mar 09 2018 18:29:17 GMT-0800 (PST)\n * Copyright (c) 2018 Environmental Systems Research Institute, Inc.\n * Apache-2.0 */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) :\n\t(factory((global.L = global.L || {}, global.L.esri = {}),global.L));\n}(this, (function (exports,leaflet) { 'use strict';\n\nvar version = \"2.1.4\";\n\nvar cors = ((window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest()));\nvar pointerEvents = document.documentElement.style.pointerEvents === '';\n\nvar Support = {\n  cors: cors,\n  pointerEvents: pointerEvents\n};\n\nvar options = {\n  attributionWidthOffset: 55\n};\n\nvar callbacks = 0;\n\nfunction serialize (params) {\n  var data = '';\n\n  params.f = params.f || 'json';\n\n  for (var key in params) {\n    if (params.hasOwnProperty(key)) {\n      var param = params[key];\n      var type = Object.prototype.toString.call(param);\n      var value;\n\n      if (data.length) {\n        data += '&';\n      }\n\n      if (type === '[object Array]') {\n        value = (Object.prototype.toString.call(param[0]) === '[object Object]') ? JSON.stringify(param) : param.join(',');\n      } else if (type === '[object Object]') {\n        value = JSON.stringify(param);\n      } else if (type === '[object Date]') {\n        value = param.valueOf();\n      } else {\n        value = param;\n      }\n\n      data += encodeURIComponent(key) + '=' + encodeURIComponent(value);\n    }\n  }\n\n  return data;\n}\n\nfunction createRequest (callback, context) {\n  var httpRequest = new window.XMLHttpRequest();\n\n  httpRequest.onerror = function (e) {\n    httpRequest.onreadystatechange = leaflet.Util.falseFn;\n\n    callback.call(context, {\n      error: {\n        code: 500,\n        message: 'XMLHttpRequest error'\n      }\n    }, null);\n  };\n\n  httpRequest.onreadystatechange = function () {\n    var response;\n    var error;\n\n    if (httpRequest.readyState === 4) {\n      try {\n        response = JSON.parse(httpRequest.responseText);\n      } catch (e) {\n        response = null;\n        error = {\n          code: 500,\n          message: 'Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error.'\n        };\n      }\n\n      if (!error && response.error) {\n        error = response.error;\n        response = null;\n      }\n\n      httpRequest.onerror = leaflet.Util.falseFn;\n\n      callback.call(context, error, response);\n    }\n  };\n\n  httpRequest.ontimeout = function () {\n    this.onerror();\n  };\n\n  return httpRequest;\n}\n\nfunction xmlHttpPost (url, params, callback, context) {\n  var httpRequest = createRequest(callback, context);\n  httpRequest.open('POST', url);\n\n  if (typeof context !== 'undefined' && context !== null) {\n    if (typeof context.options !== 'undefined') {\n      httpRequest.timeout = context.options.timeout;\n    }\n  }\n  httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\n  httpRequest.send(serialize(params));\n\n  return httpRequest;\n}\n\nfunction xmlHttpGet (url, params, callback, context) {\n  var httpRequest = createRequest(callback, context);\n  httpRequest.open('GET', url + '?' + serialize(params), true);\n\n  if (typeof context !== 'undefined' && context !== null) {\n    if (typeof context.options !== 'undefined') {\n      httpRequest.timeout = context.options.timeout;\n    }\n  }\n  httpRequest.send(null);\n\n  return httpRequest;\n}\n\n// AJAX handlers for CORS (modern browsers) or JSONP (older browsers)\nfunction request (url, params, callback, context) {\n  var paramString = serialize(params);\n  var httpRequest = createRequest(callback, context);\n  var requestLength = (url + '?' + paramString).length;\n\n  // ie10/11 require the request be opened before a timeout is applied\n  if (requestLength <= 2000 && Support.cors) {\n    httpRequest.open('GET', url + '?' + paramString);\n  } else if (requestLength > 2000 && Support.cors) {\n    httpRequest.open('POST', url);\n    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\n  }\n\n  if (typeof context !== 'undefined' && context !== null) {\n    if (typeof context.options !== 'undefined') {\n      httpRequest.timeout = context.options.timeout;\n    }\n  }\n\n  // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest\n  if (requestLength <= 2000 && Support.cors) {\n    httpRequest.send(null);\n\n  // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest\n  } else if (requestLength > 2000 && Support.cors) {\n    httpRequest.send(paramString);\n\n  // request is less  than 2000 characters and the browser does not support CORS, make a JSONP request\n  } else if (requestLength <= 2000 && !Support.cors) {\n    return jsonp(url, params, callback, context);\n\n  // request is longer then 2000 characters and the browser does not support CORS, log a warning\n  } else {\n    warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html');\n    return;\n  }\n\n  return httpRequest;\n}\n\nfunction jsonp (url, params, callback, context) {\n  window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {};\n  var callbackId = 'c' + callbacks;\n  params.callback = 'window._EsriLeafletCallbacks.' + callbackId;\n\n  window._EsriLeafletCallbacks[callbackId] = function (response) {\n    if (window._EsriLeafletCallbacks[callbackId] !== true) {\n      var error;\n      var responseType = Object.prototype.toString.call(response);\n\n      if (!(responseType === '[object Object]' || responseType === '[object Array]')) {\n        error = {\n          error: {\n            code: 500,\n            message: 'Expected array or object as JSONP response'\n          }\n        };\n        response = null;\n      }\n\n      if (!error && response.error) {\n        error = response;\n        response = null;\n      }\n\n      callback.call(context, error, response);\n      window._EsriLeafletCallbacks[callbackId] = true;\n    }\n  };\n\n  var script = leaflet.DomUtil.create('script', null, document.body);\n  script.type = 'text/javascript';\n  script.src = url + '?' + serialize(params);\n  script.id = callbackId;\n  leaflet.DomUtil.addClass(script, 'esri-leaflet-jsonp');\n\n  callbacks++;\n\n  return {\n    id: callbackId,\n    url: script.src,\n    abort: function () {\n      window._EsriLeafletCallbacks._callback[callbackId]({\n        code: 0,\n        message: 'Request aborted.'\n      });\n    }\n  };\n}\n\nvar get = ((Support.cors) ? xmlHttpGet : jsonp);\nget.CORS = xmlHttpGet;\nget.JSONP = jsonp;\n\n// export the Request object to call the different handlers for debugging\nvar Request = {\n  request: request,\n  get: get,\n  post: xmlHttpPost\n};\n\n/*\n * Copyright 2017 Esri\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// checks if 2 x,y points are equal\nfunction pointsEqual (a, b) {\n  for (var i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// checks if the first and last points of a ring are equal and closes the ring\nfunction closeRing (coordinates) {\n  if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {\n    coordinates.push(coordinates[0]);\n  }\n  return coordinates;\n}\n\n// determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring\n// or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon-\n// points-are-in-clockwise-order\nfunction ringIsClockwise (ringToTest) {\n  var total = 0;\n  var i = 0;\n  var rLength = ringToTest.length;\n  var pt1 = ringToTest[i];\n  var pt2;\n  for (i; i < rLength - 1; i++) {\n    pt2 = ringToTest[i + 1];\n    total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);\n    pt1 = pt2;\n  }\n  return (total >= 0);\n}\n\n// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L504-L519\nfunction vertexIntersectsVertex (a1, a2, b1, b2) {\n  var uaT = ((b2[0] - b1[0]) * (a1[1] - b1[1])) - ((b2[1] - b1[1]) * (a1[0] - b1[0]));\n  var ubT = ((a2[0] - a1[0]) * (a1[1] - b1[1])) - ((a2[1] - a1[1]) * (a1[0] - b1[0]));\n  var uB = ((b2[1] - b1[1]) * (a2[0] - a1[0])) - ((b2[0] - b1[0]) * (a2[1] - a1[1]));\n\n  if (uB !== 0) {\n    var ua = uaT / uB;\n    var ub = ubT / uB;\n\n    if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L521-L531\nfunction arrayIntersectsArray (a, b) {\n  for (var i = 0; i < a.length - 1; i++) {\n    for (var j = 0; j < b.length - 1; j++) {\n      if (vertexIntersectsVertex(a[i], a[i + 1], b[j], b[j + 1])) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\n// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L470-L480\nfunction coordinatesContainPoint (coordinates, point) {\n  var contains = false;\n  for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {\n    if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) ||\n         (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) &&\n        (point[0] < (((coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1])) / (coordinates[j][1] - coordinates[i][1])) + coordinates[i][0])) {\n      contains = !contains;\n    }\n  }\n  return contains;\n}\n\n// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L106-L113\nfunction coordinatesContainCoordinates (outer, inner) {\n  var intersects = arrayIntersectsArray(outer, inner);\n  var contains = coordinatesContainPoint(outer, inner[0]);\n  if (!intersects && contains) {\n    return true;\n  }\n  return false;\n}\n\n// do any polygons in this array contain any other polygons in this array?\n// used for checking for holes in arcgis rings\n// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L117-L172\nfunction convertRingsToGeoJSON (rings) {\n  var outerRings = [];\n  var holes = [];\n  var x; // iterator\n  var outerRing; // current outer ring being evaluated\n  var hole; // current hole being evaluated\n\n  // for each ring\n  for (var r = 0; r < rings.length; r++) {\n    var ring = closeRing(rings[r].slice(0));\n    if (ring.length < 4) {\n      continue;\n    }\n    // is this ring an outer ring? is it clockwise?\n    if (ringIsClockwise(ring)) {\n      var polygon = [ ring.slice().reverse() ]; // wind outer rings counterclockwise for RFC 7946 compliance\n      outerRings.push(polygon); // push to outer rings\n    } else {\n      holes.push(ring.slice().reverse()); // wind inner rings clockwise for RFC 7946 compliance\n    }\n  }\n\n  var uncontainedHoles = [];\n\n  // while there are holes left...\n  while (holes.length) {\n    // pop a hole off out stack\n    hole = holes.pop();\n\n    // loop over all outer rings and see if they contain our hole.\n    var contained = false;\n    for (x = outerRings.length - 1; x >= 0; x--) {\n      outerRing = outerRings[x][0];\n      if (coordinatesContainCoordinates(outerRing, hole)) {\n        // the hole is contained push it into our polygon\n        outerRings[x].push(hole);\n        contained = true;\n        break;\n      }\n    }\n\n    // ring is not contained in any outer ring\n    // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320\n    if (!contained) {\n      uncontainedHoles.push(hole);\n    }\n  }\n\n  // if we couldn't match any holes using contains we can try intersects...\n  while (uncontainedHoles.length) {\n    // pop a hole off out stack\n    hole = uncontainedHoles.pop();\n\n    // loop over all outer rings and see if any intersect our hole.\n    var intersects = false;\n\n    for (x = outerRings.length - 1; x >= 0; x--) {\n      outerRing = outerRings[x][0];\n      if (arrayIntersectsArray(outerRing, hole)) {\n        // the hole is contained push it into our polygon\n        outerRings[x].push(hole);\n        intersects = true;\n        break;\n      }\n    }\n\n    if (!intersects) {\n      outerRings.push([hole.reverse()]);\n    }\n  }\n\n  if (outerRings.length === 1) {\n    return {\n      type: 'Polygon',\n      coordinates: outerRings[0]\n    };\n  } else {\n    return {\n      type: 'MultiPolygon',\n      coordinates: outerRings\n    };\n  }\n}\n\n// This function ensures that rings are oriented in the right directions\n// outer rings are clockwise, holes are counterclockwise\n// used for converting GeoJSON Polygons to ArcGIS Polygons\nfunction orientRings (poly) {\n  var output = [];\n  var polygon = poly.slice(0);\n  var outerRing = closeRing(polygon.shift().slice(0));\n  if (outerRing.length >= 4) {\n    if (!ringIsClockwise(outerRing)) {\n      outerRing.reverse();\n    }\n\n    output.push(outerRing);\n\n    for (var i = 0; i < polygon.length; i++) {\n      var hole = closeRing(polygon[i].slice(0));\n      if (hole.length >= 4) {\n        if (ringIsClockwise(hole)) {\n          hole.reverse();\n        }\n        output.push(hole);\n      }\n    }\n  }\n\n  return output;\n}\n\n// This function flattens holes in multipolygons to one array of polygons\n// used for converting GeoJSON Polygons to ArcGIS Polygons\nfunction flattenMultiPolygonRings (rings) {\n  var output = [];\n  for (var i = 0; i < rings.length; i++) {\n    var polygon = orientRings(rings[i]);\n    for (var x = polygon.length - 1; x >= 0; x--) {\n      var ring = polygon[x].slice(0);\n      output.push(ring);\n    }\n  }\n  return output;\n}\n\n// shallow object clone for feature properties and attributes\n// from http://jsperf.com/cloning-an-object/2\nfunction shallowClone (obj) {\n  var target = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      target[i] = obj[i];\n    }\n  }\n  return target;\n}\n\nfunction getId (attributes, idAttribute) {\n  var keys = idAttribute ? [idAttribute, 'OBJECTID', 'FID'] : ['OBJECTID', 'FID'];\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (\n      key in attributes &&\n      (typeof attributes[key] === 'string' ||\n        typeof attributes[key] === 'number')\n    ) {\n      return attributes[key];\n    }\n  }\n  throw Error('No valid id attribute found');\n}\n\nfunction arcgisToGeoJSON (arcgis, idAttribute) {\n  var geojson = {};\n\n  if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') {\n    geojson.type = 'Point';\n    geojson.coordinates = [arcgis.x, arcgis.y];\n    if (typeof arcgis.z === 'number') {\n      geojson.coordinates.push(arcgis.z);\n    }\n  }\n\n  if (arcgis.points) {\n    geojson.type = 'MultiPoint';\n    geojson.coordinates = arcgis.points.slice(0);\n  }\n\n  if (arcgis.paths) {\n    if (arcgis.paths.length === 1) {\n      geojson.type = 'LineString';\n      geojson.coordinates = arcgis.paths[0].slice(0);\n    } else {\n      geojson.type = 'MultiLineString';\n      geojson.coordinates = arcgis.paths.slice(0);\n    }\n  }\n\n  if (arcgis.rings) {\n    geojson = convertRingsToGeoJSON(arcgis.rings.slice(0));\n  }\n\n  if (arcgis.geometry || arcgis.attributes) {\n    geojson.type = 'Feature';\n    geojson.geometry = (arcgis.geometry) ? arcgisToGeoJSON(arcgis.geometry) : null;\n    geojson.properties = (arcgis.attributes) ? shallowClone(arcgis.attributes) : null;\n    if (arcgis.attributes) {\n      try {\n        geojson.id = getId(arcgis.attributes, idAttribute);\n      } catch (err) {\n        // don't set an id\n      }\n    }\n  }\n\n  // if no valid geometry was encountered\n  if (JSON.stringify(geojson.geometry) === JSON.stringify({})) {\n    geojson.geometry = null;\n  }\n\n  if (\n    arcgis.spatialReference &&\n    arcgis.spatialReference.wkid &&\n    arcgis.spatialReference.wkid !== 4326\n  ) {\n    console.warn('Object converted in non-standard crs - ' + JSON.stringify(arcgis.spatialReference));\n  }\n\n  return geojson;\n}\n\nfunction geojsonToArcGIS (geojson, idAttribute) {\n  idAttribute = idAttribute || 'OBJECTID';\n  var spatialReference = { wkid: 4326 };\n  var result = {};\n  var i;\n\n  switch (geojson.type) {\n    case 'Point':\n      result.x = geojson.coordinates[0];\n      result.y = geojson.coordinates[1];\n      result.spatialReference = spatialReference;\n      break;\n    case 'MultiPoint':\n      result.points = geojson.coordinates.slice(0);\n      result.spatialReference = spatialReference;\n      break;\n    case 'LineString':\n      result.paths = [geojson.coordinates.slice(0)];\n      result.spatialReference = spatialReference;\n      break;\n    case 'MultiLineString':\n      result.paths = geojson.coordinates.slice(0);\n      result.spatialReference = spatialReference;\n      break;\n    case 'Polygon':\n      result.rings = orientRings(geojson.coordinates.slice(0));\n      result.spatialReference = spatialReference;\n      break;\n    case 'MultiPolygon':\n      result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0));\n      result.spatialReference = spatialReference;\n      break;\n    case 'Feature':\n      if (geojson.geometry) {\n        result.geometry = geojsonToArcGIS(geojson.geometry, idAttribute);\n      }\n      result.attributes = (geojson.properties) ? shallowClone(geojson.properties) : {};\n      if (geojson.id) {\n        result.attributes[idAttribute] = geojson.id;\n      }\n      break;\n    case 'FeatureCollection':\n      result = [];\n      for (i = 0; i < geojson.features.length; i++) {\n        result.push(geojsonToArcGIS(geojson.features[i], idAttribute));\n      }\n      break;\n    case 'GeometryCollection':\n      result = [];\n      for (i = 0; i < geojson.geometries.length; i++) {\n        result.push(geojsonToArcGIS(geojson.geometries[i], idAttribute));\n      }\n      break;\n  }\n\n  return result;\n}\n\nfunction geojsonToArcGIS$1 (geojson, idAttr) {\n  return geojsonToArcGIS(geojson, idAttr);\n}\n\nfunction arcgisToGeoJSON$1 (arcgis, idAttr) {\n  return arcgisToGeoJSON(arcgis, idAttr);\n}\n\n// convert an extent (ArcGIS) to LatLngBounds (Leaflet)\nfunction extentToBounds (extent) {\n  // \"NaN\" coordinates from ArcGIS Server indicate a null geometry\n  if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') {\n    var sw = leaflet.latLng(extent.ymin, extent.xmin);\n    var ne = leaflet.latLng(extent.ymax, extent.xmax);\n    return leaflet.latLngBounds(sw, ne);\n  } else {\n    return null;\n  }\n}\n\n// convert an LatLngBounds (Leaflet) to extent (ArcGIS)\nfunction boundsToExtent (bounds) {\n  bounds = leaflet.latLngBounds(bounds);\n  return {\n    'xmin': bounds.getSouthWest().lng,\n    'ymin': bounds.getSouthWest().lat,\n    'xmax': bounds.getNorthEast().lng,\n    'ymax': bounds.getNorthEast().lat,\n    'spatialReference': {\n      'wkid': 4326\n    }\n  };\n}\n\nvar knownFieldNames = /^(OBJECTID|FID|OID|ID)$/i;\n\n// Attempts to find the ID Field from response\nfunction _findIdAttributeFromResponse (response) {\n  var result;\n\n  if (response.objectIdFieldName) {\n    // Find Id Field directly\n    result = response.objectIdFieldName;\n  } else if (response.fields) {\n    // Find ID Field based on field type\n    for (var j = 0; j <= response.fields.length - 1; j++) {\n      if (response.fields[j].type === 'esriFieldTypeOID') {\n        result = response.fields[j].name;\n        break;\n      }\n    }\n    if (!result) {\n      // If no field was marked as being the esriFieldTypeOID try well known field names\n      for (j = 0; j <= response.fields.length - 1; j++) {\n        if (response.fields[j].name.match(knownFieldNames)) {\n          result = response.fields[j].name;\n          break;\n        }\n      }\n    }\n  }\n  return result;\n}\n\n// This is the 'last' resort, find the Id field from the specified feature\nfunction _findIdAttributeFromFeature (feature) {\n  for (var key in feature.attributes) {\n    if (key.match(knownFieldNames)) {\n      return key;\n    }\n  }\n}\n\nfunction responseToFeatureCollection (response, idAttribute) {\n  var objectIdField;\n  var features = response.features || response.results;\n  var count = features.length;\n\n  if (idAttribute) {\n    objectIdField = idAttribute;\n  } else {\n    objectIdField = _findIdAttributeFromResponse(response);\n  }\n\n  var featureCollection = {\n    type: 'FeatureCollection',\n    features: []\n  };\n\n  if (count) {\n    for (var i = features.length - 1; i >= 0; i--) {\n      var feature = arcgisToGeoJSON$1(features[i], objectIdField || _findIdAttributeFromFeature(features[i]));\n      featureCollection.features.push(feature);\n    }\n  }\n\n  return featureCollection;\n}\n\n  // trim url whitespace and add a trailing slash if needed\nfunction cleanUrl (url) {\n  // trim leading and trailing spaces, but not spaces inside the url\n  url = leaflet.Util.trim(url);\n\n  // add a trailing slash to the url if the user omitted it\n  if (url[url.length - 1] !== '/') {\n    url += '/';\n  }\n\n  return url;\n}\n\n/* Extract url params if any and store them in requestParams attribute.\n   Return the options params updated */\nfunction getUrlParams (options$$1) {\n  if (options$$1.url.indexOf('?') !== -1) {\n    options$$1.requestParams = options$$1.requestParams || {};\n    var queryString = options$$1.url.substring(options$$1.url.indexOf('?') + 1);\n    options$$1.url = options$$1.url.split('?')[0];\n    options$$1.requestParams = JSON.parse('{\"' + decodeURI(queryString).replace(/\"/g, '\\\\\"').replace(/&/g, '\",\"').replace(/=/g, '\":\"') + '\"}');\n  }\n  options$$1.url = cleanUrl(options$$1.url.split('?')[0]);\n  return options$$1;\n}\n\nfunction isArcgisOnline (url) {\n  /* hosted feature services support geojson as an output format\n  utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */\n  return (/^(?!.*utility\\.arcgis\\.com).*\\.arcgis\\.com.*FeatureServer/i).test(url);\n}\n\nfunction geojsonTypeToArcGIS (geoJsonType) {\n  var arcgisGeometryType;\n  switch (geoJsonType) {\n    case 'Point':\n      arcgisGeometryType = 'esriGeometryPoint';\n      break;\n    case 'MultiPoint':\n      arcgisGeometryType = 'esriGeometryMultipoint';\n      break;\n    case 'LineString':\n      arcgisGeometryType = 'esriGeometryPolyline';\n      break;\n    case 'MultiLineString':\n      arcgisGeometryType = 'esriGeometryPolyline';\n      break;\n    case 'Polygon':\n      arcgisGeometryType = 'esriGeometryPolygon';\n      break;\n    case 'MultiPolygon':\n      arcgisGeometryType = 'esriGeometryPolygon';\n      break;\n  }\n\n  return arcgisGeometryType;\n}\n\nfunction warn () {\n  if (console && console.warn) {\n    console.warn.apply(console, arguments);\n  }\n}\n\nfunction calcAttributionWidth (map) {\n  // either crop at 55px or user defined buffer\n  return (map.getSize().x - options.attributionWidthOffset) + 'px';\n}\n\nfunction setEsriAttribution (map) {\n  if (map.attributionControl && !map.attributionControl._esriAttributionAdded) {\n    map.attributionControl.setPrefix('<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a> | Powered by <a href=\"https://www.esri.com\">Esri</a>');\n\n    var hoverAttributionStyle = document.createElement('style');\n    hoverAttributionStyle.type = 'text/css';\n    hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' +\n      'white-space: normal;' +\n    '}';\n\n    document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle);\n    leaflet.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover');\n\n    // define a new css class in JS to trim attribution into a single line\n    var attributionStyle = document.createElement('style');\n    attributionStyle.type = 'text/css';\n    attributionStyle.innerHTML = '.esri-truncated-attribution {' +\n      'vertical-align: -3px;' +\n      'white-space: nowrap;' +\n      'overflow: hidden;' +\n      'text-overflow: ellipsis;' +\n      'display: inline-block;' +\n      'transition: 0s white-space;' +\n      'transition-delay: 1s;' +\n      'max-width: ' + calcAttributionWidth(map) + ';' +\n    '}';\n\n    document.getElementsByTagName('head')[0].appendChild(attributionStyle);\n    leaflet.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution');\n\n    // update the width used to truncate when the map itself is resized\n    map.on('resize', function (e) {\n      map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target);\n    });\n\n    // remove injected scripts and style tags\n    map.on('unload', function () {\n      hoverAttributionStyle.parentNode.removeChild(hoverAttributionStyle);\n      attributionStyle.parentNode.removeChild(attributionStyle);\n      var nodeList = document.querySelectorAll('.esri-leaflet-jsonp');\n      for (var i = 0; i < nodeList.length; i++) {\n        nodeList.item(i).parentNode.removeChild(nodeList.item(i));\n      }\n    });\n\n    map.attributionControl._esriAttributionAdded = true;\n  }\n}\n\nfunction _setGeometry (geometry) {\n  var params = {\n    geometry: null,\n    geometryType: null\n  };\n\n  // convert bounds to extent and finish\n  if (geometry instanceof leaflet.LatLngBounds) {\n    // set geometry + geometryType\n    params.geometry = boundsToExtent(geometry);\n    params.geometryType = 'esriGeometryEnvelope';\n    return params;\n  }\n\n  // convert L.Marker > L.LatLng\n  if (geometry.getLatLng) {\n    geometry = geometry.getLatLng();\n  }\n\n  // convert L.LatLng to a geojson point and continue;\n  if (geometry instanceof leaflet.LatLng) {\n    geometry = {\n      type: 'Point',\n      coordinates: [geometry.lng, geometry.lat]\n    };\n  }\n\n  // handle L.GeoJSON, pull out the first geometry\n  if (geometry instanceof leaflet.GeoJSON) {\n    // reassign geometry to the GeoJSON value  (we are assuming that only one feature is present)\n    geometry = geometry.getLayers()[0].feature.geometry;\n    params.geometry = geojsonToArcGIS$1(geometry);\n    params.geometryType = geojsonTypeToArcGIS(geometry.type);\n  }\n\n  // Handle L.Polyline and L.Polygon\n  if (geometry.toGeoJSON) {\n    geometry = geometry.toGeoJSON();\n  }\n\n  // handle GeoJSON feature by pulling out the geometry\n  if (geometry.type === 'Feature') {\n    // get the geometry of the geojson feature\n    geometry = geometry.geometry;\n  }\n\n  // confirm that our GeoJSON is a point, line or polygon\n  if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n    params.geometry = geojsonToArcGIS$1(geometry);\n    params.geometryType = geojsonTypeToArcGIS(geometry.type);\n    return params;\n  }\n\n  // warn the user if we havn't found an appropriate object\n  warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object');\n\n  return;\n}\n\nfunction _getAttributionData (url, map) {\n  jsonp(url, {}, leaflet.Util.bind(function (error, attributions) {\n    if (error) { return; }\n    map._esriAttributions = [];\n    for (var c = 0; c < attributions.contributors.length; c++) {\n      var contributor = attributions.contributors[c];\n\n      for (var i = 0; i < contributor.coverageAreas.length; i++) {\n        var coverageArea = contributor.coverageAreas[i];\n        var southWest = leaflet.latLng(coverageArea.bbox[0], coverageArea.bbox[1]);\n        var northEast = leaflet.latLng(coverageArea.bbox[2], coverageArea.bbox[3]);\n        map._esriAttributions.push({\n          attribution: contributor.attribution,\n          score: coverageArea.score,\n          bounds: leaflet.latLngBounds(southWest, northEast),\n          minZoom: coverageArea.zoomMin,\n          maxZoom: coverageArea.zoomMax\n        });\n      }\n    }\n\n    map._esriAttributions.sort(function (a, b) {\n      return b.score - a.score;\n    });\n\n    // pass the same argument as the map's 'moveend' event\n    var obj = { target: map };\n    _updateMapAttribution(obj);\n  }, this));\n}\n\nfunction _updateMapAttribution (evt) {\n  var map = evt.target;\n  var oldAttributions = map._esriAttributions;\n\n  if (map && map.attributionControl && oldAttributions) {\n    var newAttributions = '';\n    var bounds = map.getBounds();\n    var wrappedBounds = leaflet.latLngBounds(\n      bounds.getSouthWest().wrap(),\n      bounds.getNorthEast().wrap()\n    );\n    var zoom = map.getZoom();\n\n    for (var i = 0; i < oldAttributions.length; i++) {\n      var attribution = oldAttributions[i];\n      var text = attribution.attribution;\n\n      if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) {\n        newAttributions += (', ' + text);\n      }\n    }\n\n    newAttributions = newAttributions.substr(2);\n    var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution');\n\n    attributionElement.innerHTML = newAttributions;\n    attributionElement.style.maxWidth = calcAttributionWidth(map);\n\n    map.fire('attributionupdated', {\n      attribution: newAttributions\n    });\n  }\n}\n\nvar EsriUtil = {\n  warn: warn,\n  cleanUrl: cleanUrl,\n  getUrlParams: getUrlParams,\n  isArcgisOnline: isArcgisOnline,\n  geojsonTypeToArcGIS: geojsonTypeToArcGIS,\n  responseToFeatureCollection: responseToFeatureCollection,\n  geojsonToArcGIS: geojsonToArcGIS$1,\n  arcgisToGeoJSON: arcgisToGeoJSON$1,\n  boundsToExtent: boundsToExtent,\n  extentToBounds: extentToBounds,\n  calcAttributionWidth: calcAttributionWidth,\n  setEsriAttribution: setEsriAttribution,\n  _setGeometry: _setGeometry,\n  _getAttributionData: _getAttributionData,\n  _updateMapAttribution: _updateMapAttribution,\n  _findIdAttributeFromFeature: _findIdAttributeFromFeature,\n  _findIdAttributeFromResponse: _findIdAttributeFromResponse\n};\n\nvar Task = leaflet.Class.extend({\n\n  options: {\n    proxy: false,\n    useCors: cors\n  },\n\n  // Generate a method for each methodName:paramName in the setters for this task.\n  generateSetter: function (param, context) {\n    return leaflet.Util.bind(function (value) {\n      this.params[param] = value;\n      return this;\n    }, context);\n  },\n\n  initialize: function (endpoint) {\n    // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service\n    if (endpoint.request && endpoint.options) {\n      this._service = endpoint;\n      leaflet.Util.setOptions(this, endpoint.options);\n    } else {\n      leaflet.Util.setOptions(this, endpoint);\n      this.options.url = cleanUrl(endpoint.url);\n    }\n\n    // clone default params into this object\n    this.params = leaflet.Util.extend({}, this.params || {});\n\n    // generate setter methods based on the setters object implimented a child class\n    if (this.setters) {\n      for (var setter in this.setters) {\n        var param = this.setters[setter];\n        this[setter] = this.generateSetter(param, this);\n      }\n    }\n  },\n\n  token: function (token) {\n    if (this._service) {\n      this._service.authenticate(token);\n    } else {\n      this.params.token = token;\n    }\n    return this;\n  },\n\n  // ArcGIS Server Find/Identify 10.5+\n  format: function (boolean) {\n    // use double negative to expose a more intuitive positive method name\n    this.params.returnUnformattedValues = !boolean;\n    return this;\n  },\n\n  request: function (callback, context) {\n    if (this.options.requestParams) {\n      leaflet.Util.extend(this.params, this.options.requestParams);\n    }\n    if (this._service) {\n      return this._service.request(this.path, this.params, callback, context);\n    }\n\n    return this._request('request', this.path, this.params, callback, context);\n  },\n\n  _request: function (method, path, params, callback, context) {\n    var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;\n\n    if ((method === 'get' || method === 'request') && !this.options.useCors) {\n      return Request.get.JSONP(url, params, callback, context);\n    }\n\n    return Request[method](url, params, callback, context);\n  }\n});\n\nfunction task (options) {\n  options = getUrlParams(options);\n  return new Task(options);\n}\n\nvar Query = Task.extend({\n  setters: {\n    'offset': 'resultOffset',\n    'limit': 'resultRecordCount',\n    'fields': 'outFields',\n    'precision': 'geometryPrecision',\n    'featureIds': 'objectIds',\n    'returnGeometry': 'returnGeometry',\n    'returnM': 'returnM',\n    'transform': 'datumTransformation',\n    'token': 'token'\n  },\n\n  path: 'query',\n\n  params: {\n    returnGeometry: true,\n    where: '1=1',\n    outSr: 4326,\n    outFields: '*'\n  },\n\n  // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations.\n  within: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer\n    return this;\n  },\n\n  // Returns a feature if any spatial relationship is found. Applies to all shape type combinations.\n  intersects: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelIntersects';\n    return this;\n  },\n\n  // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations.\n  contains: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer\n    return this;\n  },\n\n  // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations.\n  crosses: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelCrosses';\n    return this;\n  },\n\n  // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point.\n  touches: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelTouches';\n    return this;\n  },\n\n  // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations.\n  overlaps: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelOverlaps';\n    return this;\n  },\n\n  // Returns a feature if the envelope of the two shapes intersects.\n  bboxIntersects: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects';\n    return this;\n  },\n\n  // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc\n  indexIntersects: function (geometry) {\n    this._setGeometryParams(geometry);\n    this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry\n    return this;\n  },\n\n  // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online\n  nearby: function (latlng, radius) {\n    latlng = leaflet.latLng(latlng);\n    this.params.geometry = [latlng.lng, latlng.lat];\n    this.params.geometryType = 'esriGeometryPoint';\n    this.params.spatialRel = 'esriSpatialRelIntersects';\n    this.params.units = 'esriSRUnit_Meter';\n    this.params.distance = radius;\n    this.params.inSr = 4326;\n    return this;\n  },\n\n  where: function (string) {\n    // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered\n    this.params.where = string;\n    return this;\n  },\n\n  between: function (start, end) {\n    this.params.time = [start.valueOf(), end.valueOf()];\n    return this;\n  },\n\n  simplify: function (map, factor) {\n    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());\n    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;\n    return this;\n  },\n\n  orderBy: function (fieldName, order) {\n    order = order || 'ASC';\n    this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : '';\n    this.params.orderByFields += ([fieldName, order]).join(' ');\n    return this;\n  },\n\n  run: function (callback, context) {\n    this._cleanParams();\n\n    // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly\n    if (this.options.isModern || isArcgisOnline(this.options.url)) {\n      this.params.f = 'geojson';\n\n      return this.request(function (error, response) {\n        this._trapSQLerrors(error);\n        callback.call(context, error, response, response);\n      }, this);\n\n    // otherwise convert it in the callback then pass it on\n    } else {\n      return this.request(function (error, response) {\n        this._trapSQLerrors(error);\n        callback.call(context, error, (response && responseToFeatureCollection(response)), response);\n      }, this);\n    }\n  },\n\n  count: function (callback, context) {\n    this._cleanParams();\n    this.params.returnCountOnly = true;\n    return this.request(function (error, response) {\n      callback.call(this, error, (response && response.count), response);\n    }, context);\n  },\n\n  ids: function (callback, context) {\n    this._cleanParams();\n    this.params.returnIdsOnly = true;\n    return this.request(function (error, response) {\n      callback.call(this, error, (response && response.objectIds), response);\n    }, context);\n  },\n\n  // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online\n  bounds: function (callback, context) {\n    this._cleanParams();\n    this.params.returnExtentOnly = true;\n    return this.request(function (error, response) {\n      if (response && response.extent && extentToBounds(response.extent)) {\n        callback.call(context, error, extentToBounds(response.extent), response);\n      } else {\n        error = {\n          message: 'Invalid Bounds'\n        };\n        callback.call(context, error, null, response);\n      }\n    }, context);\n  },\n\n  distinct: function () {\n    // geometry must be omitted for queries requesting distinct values\n    this.params.returnGeometry = false;\n    this.params.returnDistinctValues = true;\n    return this;\n  },\n\n  // only valid for image services\n  pixelSize: function (rawPoint) {\n    var castPoint = leaflet.point(rawPoint);\n    this.params.pixelSize = [castPoint.x, castPoint.y];\n    return this;\n  },\n\n  // only valid for map services\n  layer: function (layer) {\n    this.path = layer + '/query';\n    return this;\n  },\n\n  _trapSQLerrors: function (error) {\n    if (error) {\n      if (error.code === '400') {\n        warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes');\n      }\n    }\n  },\n\n  _cleanParams: function () {\n    delete this.params.returnIdsOnly;\n    delete this.params.returnExtentOnly;\n    delete this.params.returnCountOnly;\n  },\n\n  _setGeometryParams: function (geometry) {\n    this.params.inSr = 4326;\n    var converted = _setGeometry(geometry);\n    this.params.geometry = converted.geometry;\n    this.params.geometryType = converted.geometryType;\n  }\n\n});\n\nfunction query (options) {\n  return new Query(options);\n}\n\nvar Find = Task.extend({\n  setters: {\n    // method name > param name\n    'contains': 'contains',\n    'text': 'searchText',\n    'fields': 'searchFields', // denote an array or single string\n    'spatialReference': 'sr',\n    'sr': 'sr',\n    'layers': 'layers',\n    'returnGeometry': 'returnGeometry',\n    'maxAllowableOffset': 'maxAllowableOffset',\n    'precision': 'geometryPrecision',\n    'dynamicLayers': 'dynamicLayers',\n    'returnZ': 'returnZ',\n    'returnM': 'returnM',\n    'gdbVersion': 'gdbVersion',\n    // skipped implementing this (for now) because the REST service implementation isnt consistent between operations\n    // 'transform': 'datumTransformations',\n    'token': 'token'\n  },\n\n  path: 'find',\n\n  params: {\n    sr: 4326,\n    contains: true,\n    returnGeometry: true,\n    returnZ: true,\n    returnM: false\n  },\n\n  layerDefs: function (id, where) {\n    this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';\n    this.params.layerDefs += ([id, where]).join(':');\n    return this;\n  },\n\n  simplify: function (map, factor) {\n    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());\n    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;\n    return this;\n  },\n\n  run: function (callback, context) {\n    return this.request(function (error, response) {\n      callback.call(context, error, (response && responseToFeatureCollection(response)), response);\n    }, context);\n  }\n});\n\nfunction find (options) {\n  return new Find(options);\n}\n\nvar Identify = Task.extend({\n  path: 'identify',\n\n  between: function (start, end) {\n    this.params.time = [start.valueOf(), end.valueOf()];\n    return this;\n  }\n});\n\nfunction identify (options) {\n  return new Identify(options);\n}\n\nvar IdentifyFeatures = Identify.extend({\n  setters: {\n    'layers': 'layers',\n    'precision': 'geometryPrecision',\n    'tolerance': 'tolerance',\n    // skipped implementing this (for now) because the REST service implementation isnt consistent between operations.\n    // 'transform': 'datumTransformations'\n    'returnGeometry': 'returnGeometry'\n  },\n\n  params: {\n    sr: 4326,\n    layers: 'all',\n    tolerance: 3,\n    returnGeometry: true\n  },\n\n  on: function (map) {\n    var extent = boundsToExtent(map.getBounds());\n    var size = map.getSize();\n    this.params.imageDisplay = [size.x, size.y, 96];\n    this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];\n    return this;\n  },\n\n  at: function (geometry) {\n    // cast lat, long pairs in raw array form manually\n    if (geometry.length === 2) {\n      geometry = leaflet.latLng(geometry);\n    }\n    this._setGeometryParams(geometry);\n    return this;\n  },\n\n  layerDef: function (id, where) {\n    this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';\n    this.params.layerDefs += ([id, where]).join(':');\n    return this;\n  },\n\n  simplify: function (map, factor) {\n    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());\n    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;\n    return this;\n  },\n\n  run: function (callback, context) {\n    return this.request(function (error, response) {\n      // immediately invoke with an error\n      if (error) {\n        callback.call(context, error, undefined, response);\n        return;\n\n      // ok no error lets just assume we have features...\n      } else {\n        var featureCollection = responseToFeatureCollection(response);\n        response.results = response.results.reverse();\n        for (var i = 0; i < featureCollection.features.length; i++) {\n          var feature = featureCollection.features[i];\n          feature.layerId = response.results[i].layerId;\n        }\n        callback.call(context, undefined, featureCollection, response);\n      }\n    });\n  },\n\n  _setGeometryParams: function (geometry) {\n    var converted = _setGeometry(geometry);\n    this.params.geometry = converted.geometry;\n    this.params.geometryType = converted.geometryType;\n  }\n});\n\nfunction identifyFeatures (options) {\n  return new IdentifyFeatures(options);\n}\n\nvar IdentifyImage = Identify.extend({\n  setters: {\n    'setMosaicRule': 'mosaicRule',\n    'setRenderingRule': 'renderingRule',\n    'setPixelSize': 'pixelSize',\n    'returnCatalogItems': 'returnCatalogItems',\n    'returnGeometry': 'returnGeometry'\n  },\n\n  params: {\n    returnGeometry: false\n  },\n\n  at: function (latlng) {\n    latlng = leaflet.latLng(latlng);\n    this.params.geometry = JSON.stringify({\n      x: latlng.lng,\n      y: latlng.lat,\n      spatialReference: {\n        wkid: 4326\n      }\n    });\n    this.params.geometryType = 'esriGeometryPoint';\n    return this;\n  },\n\n  getMosaicRule: function () {\n    return this.params.mosaicRule;\n  },\n\n  getRenderingRule: function () {\n    return this.params.renderingRule;\n  },\n\n  getPixelSize: function () {\n    return this.params.pixelSize;\n  },\n\n  run: function (callback, context) {\n    return this.request(function (error, response) {\n      callback.call(context, error, (response && this._responseToGeoJSON(response)), response);\n    }, this);\n  },\n\n  // get pixel data and return as geoJSON point\n  // populate catalog items (if any)\n  // merging in any catalogItemVisibilities as a propery of each feature\n  _responseToGeoJSON: function (response) {\n    var location = response.location;\n    var catalogItems = response.catalogItems;\n    var catalogItemVisibilities = response.catalogItemVisibilities;\n    var geoJSON = {\n      'pixel': {\n        'type': 'Feature',\n        'geometry': {\n          'type': 'Point',\n          'coordinates': [location.x, location.y]\n        },\n        'crs': {\n          'type': 'EPSG',\n          'properties': {\n            'code': location.spatialReference.wkid\n          }\n        },\n        'properties': {\n          'OBJECTID': response.objectId,\n          'name': response.name,\n          'value': response.value\n        },\n        'id': response.objectId\n      }\n    };\n\n    if (response.properties && response.properties.Values) {\n      geoJSON.pixel.properties.values = response.properties.Values;\n    }\n\n    if (catalogItems && catalogItems.features) {\n      geoJSON.catalogItems = responseToFeatureCollection(catalogItems);\n      if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) {\n        for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) {\n          geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i];\n        }\n      }\n    }\n    return geoJSON;\n  }\n\n});\n\nfunction identifyImage (params) {\n  return new IdentifyImage(params);\n}\n\nvar Service = leaflet.Evented.extend({\n\n  options: {\n    proxy: false,\n    useCors: cors,\n    timeout: 0\n  },\n\n  initialize: function (options) {\n    options = options || {};\n    this._requestQueue = [];\n    this._authenticating = false;\n    leaflet.Util.setOptions(this, options);\n    this.options.url = cleanUrl(this.options.url);\n  },\n\n  get: function (path, params, callback, context) {\n    return this._request('get', path, params, callback, context);\n  },\n\n  post: function (path, params, callback, context) {\n    return this._request('post', path, params, callback, context);\n  },\n\n  request: function (path, params, callback, context) {\n    return this._request('request', path, params, callback, context);\n  },\n\n  metadata: function (callback, context) {\n    return this._request('get', '', {}, callback, context);\n  },\n\n  authenticate: function (token) {\n    this._authenticating = false;\n    this.options.token = token;\n    this._runQueue();\n    return this;\n  },\n\n  getTimeout: function () {\n    return this.options.timeout;\n  },\n\n  setTimeout: function (timeout) {\n    this.options.timeout = timeout;\n  },\n\n  _request: function (method, path, params, callback, context) {\n    this.fire('requeststart', {\n      url: this.options.url + path,\n      params: params,\n      method: method\n    }, true);\n\n    var wrappedCallback = this._createServiceCallback(method, path, params, callback, context);\n\n    if (this.options.token) {\n      params.token = this.options.token;\n    }\n    if (this.options.requestParams) {\n      leaflet.Util.extend(params, this.options.requestParams);\n    }\n    if (this._authenticating) {\n      this._requestQueue.push([method, path, params, callback, context]);\n      return;\n    } else {\n      var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;\n\n      if ((method === 'get' || method === 'request') && !this.options.useCors) {\n        return Request.get.JSONP(url, params, wrappedCallback, context);\n      } else {\n        return Request[method](url, params, wrappedCallback, context);\n      }\n    }\n  },\n\n  _createServiceCallback: function (method, path, params, callback, context) {\n    return leaflet.Util.bind(function (error, response) {\n      if (error && (error.code === 499 || error.code === 498)) {\n        this._authenticating = true;\n\n        this._requestQueue.push([method, path, params, callback, context]);\n\n        // fire an event for users to handle and re-authenticate\n        this.fire('authenticationrequired', {\n          authenticate: leaflet.Util.bind(this.authenticate, this)\n        }, true);\n\n        // if the user has access to a callback they can handle the auth error\n        error.authenticate = leaflet.Util.bind(this.authenticate, this);\n      }\n\n      callback.call(context, error, response);\n\n      if (error) {\n        this.fire('requesterror', {\n          url: this.options.url + path,\n          params: params,\n          message: error.message,\n          code: error.code,\n          method: method\n        }, true);\n      } else {\n        this.fire('requestsuccess', {\n          url: this.options.url + path,\n          params: params,\n          response: response,\n          method: method\n        }, true);\n      }\n\n      this.fire('requestend', {\n        url: this.options.url + path,\n        params: params,\n        method: method\n      }, true);\n    }, this);\n  },\n\n  _runQueue: function () {\n    for (var i = this._requestQueue.length - 1; i >= 0; i--) {\n      var request$$1 = this._requestQueue[i];\n      var method = request$$1.shift();\n      this[method].apply(this, request$$1);\n    }\n    this._requestQueue = [];\n  }\n});\n\nfunction service (options) {\n  options = getUrlParams(options);\n  return new Service(options);\n}\n\nvar MapService = Service.extend({\n\n  identify: function () {\n    return identifyFeatures(this);\n  },\n\n  find: function () {\n    return find(this);\n  },\n\n  query: function () {\n    return query(this);\n  }\n\n});\n\nfunction mapService (options) {\n  return new MapService(options);\n}\n\nvar ImageService = Service.extend({\n\n  query: function () {\n    return query(this);\n  },\n\n  identify: function () {\n    return identifyImage(this);\n  }\n});\n\nfunction imageService (options) {\n  return new ImageService(options);\n}\n\nvar FeatureLayerService = Service.extend({\n\n  options: {\n    idAttribute: 'OBJECTID'\n  },\n\n  query: function () {\n    return query(this);\n  },\n\n  addFeature: function (feature, callback, context) {\n    delete feature.id;\n\n    feature = geojsonToArcGIS$1(feature);\n\n    return this.post('addFeatures', {\n      features: [feature]\n    }, function (error, response) {\n      var result = (response && response.addResults) ? response.addResults[0] : undefined;\n      if (callback) {\n        callback.call(context, error || response.addResults[0].error, result);\n      }\n    }, context);\n  },\n\n  updateFeature: function (feature, callback, context) {\n    feature = geojsonToArcGIS$1(feature, this.options.idAttribute);\n\n    return this.post('updateFeatures', {\n      features: [feature]\n    }, function (error, response) {\n      var result = (response && response.updateResults) ? response.updateResults[0] : undefined;\n      if (callback) {\n        callback.call(context, error || response.updateResults[0].error, result);\n      }\n    }, context);\n  },\n\n  deleteFeature: function (id, callback, context) {\n    return this.post('deleteFeatures', {\n      objectIds: id\n    }, function (error, response) {\n      var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined;\n      if (callback) {\n        callback.call(context, error || response.deleteResults[0].error, result);\n      }\n    }, context);\n  },\n\n  deleteFeatures: function (ids, callback, context) {\n    return this.post('deleteFeatures', {\n      objectIds: ids\n    }, function (error, response) {\n      // pass back the entire array\n      var result = (response && response.deleteResults) ? response.deleteResults : undefined;\n      if (callback) {\n        callback.call(context, error || response.deleteResults[0].error, result);\n      }\n    }, context);\n  }\n});\n\nfunction featureLayerService (options) {\n  return new FeatureLayerService(options);\n}\n\nvar tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:';\n\nvar BasemapLayer = leaflet.TileLayer.extend({\n  statics: {\n    TILES: {\n      Streets: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 19,\n          subdomains: ['server', 'services'],\n          attribution: 'USGS, NOAA',\n          attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map'\n        }\n      },\n      Topographic: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 19,\n          subdomains: ['server', 'services'],\n          attribution: 'USGS, NOAA',\n          attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map'\n        }\n      },\n      Oceans: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          attribution: 'USGS, NOAA',\n          attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap'\n        }\n      },\n      OceansLabels: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane'\n        }\n      },\n      NationalGeographic: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.'\n        }\n      },\n      DarkGray: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'\n        }\n      },\n      DarkGrayLabels: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n          attribution: ''\n\n        }\n      },\n      Gray: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'\n        }\n      },\n      GrayLabels: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 16,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n          attribution: ''\n        }\n      },\n      Imagery: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 19,\n          subdomains: ['server', 'services'],\n          attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community',\n          attributionUrl: 'https://static.arcgis.com/attribution/World_Imagery'\n        }\n      },\n      ImageryLabels: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 19,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n          attribution: ''\n        }\n      },\n      ImageryTransportation: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 19,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane'\n        }\n      },\n      ShadedRelief: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 13,\n          subdomains: ['server', 'services'],\n          attribution: 'USGS'\n        }\n      },\n      ShadedReliefLabels: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 12,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n          attribution: ''\n        }\n      },\n      Terrain: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 13,\n          subdomains: ['server', 'services'],\n          attribution: 'USGS, NOAA'\n        }\n      },\n      TerrainLabels: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 13,\n          subdomains: ['server', 'services'],\n          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n          attribution: ''\n        }\n      },\n      USATopo: {\n        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 15,\n          subdomains: ['server', 'services'],\n          attribution: 'USGS, National Geographic Society, i-cubed'\n        }\n      },\n      ImageryClarity: {\n        urlTemplate: tileProtocol + '//clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n        options: {\n          minZoom: 1,\n          maxZoom: 19,\n          attribution: 'Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community'\n        }\n      }\n    }\n  },\n\n  initialize: function (key, options) {\n    var config;\n\n    // set the config variable with the appropriate config object\n    if (typeof key === 'object' && key.urlTemplate && key.options) {\n      config = key;\n    } else if (typeof key === 'string' && BasemapLayer.TILES[key]) {\n      config = BasemapLayer.TILES[key];\n    } else {\n      throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of \"Streets\", \"Topographic\", \"Oceans\", \"OceansLabels\", \"NationalGeographic\", \"Gray\", \"GrayLabels\", \"DarkGray\", \"DarkGrayLabels\", \"Imagery\", \"ImageryLabels\", \"ImageryTransportation\", \"ImageryClarity\", \"ShadedRelief\", \"ShadedReliefLabels\", \"Terrain\", \"TerrainLabels\" or \"USATopo\"');\n    }\n\n    // merge passed options into the config options\n    var tileOptions = leaflet.Util.extend(config.options, options);\n\n    leaflet.Util.setOptions(this, tileOptions);\n\n    if (this.options.token) {\n      config.urlTemplate += ('?token=' + this.options.token);\n    }\n\n    // call the initialize method on L.TileLayer to set everything up\n    leaflet.TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions);\n  },\n\n  onAdd: function (map) {\n    // include 'Powered by Esri' in map attribution\n    setEsriAttribution(map);\n\n    if (this.options.pane === 'esri-labels') {\n      this._initPane();\n    }\n    // some basemaps can supply dynamic attribution\n    if (this.options.attributionUrl) {\n      _getAttributionData(this.options.attributionUrl, map);\n    }\n\n    map.on('moveend', _updateMapAttribution);\n\n    leaflet.TileLayer.prototype.onAdd.call(this, map);\n  },\n\n  onRemove: function (map) {\n    map.off('moveend', _updateMapAttribution);\n    leaflet.TileLayer.prototype.onRemove.call(this, map);\n  },\n\n  _initPane: function () {\n    if (!this._map.getPane(this.options.pane)) {\n      var pane = this._map.createPane(this.options.pane);\n      pane.style.pointerEvents = 'none';\n      pane.style.zIndex = 500;\n    }\n  },\n\n  getAttribution: function () {\n    if (this.options.attribution) {\n      var attribution = '<span class=\"esri-dynamic-attribution\">' + this.options.attribution + '</span>';\n    }\n    return attribution;\n  }\n});\n\nfunction basemapLayer (key, options) {\n  return new BasemapLayer(key, options);\n}\n\nvar TiledMapLayer = leaflet.TileLayer.extend({\n  options: {\n    zoomOffsetAllowance: 0.1,\n    errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=='\n  },\n\n  statics: {\n    MercatorZoomLevels: {\n      '0': 156543.03392799999,\n      '1': 78271.516963999893,\n      '2': 39135.758482000099,\n      '3': 19567.879240999901,\n      '4': 9783.9396204999593,\n      '5': 4891.9698102499797,\n      '6': 2445.9849051249898,\n      '7': 1222.9924525624899,\n      '8': 611.49622628138002,\n      '9': 305.74811314055802,\n      '10': 152.874056570411,\n      '11': 76.437028285073197,\n      '12': 38.218514142536598,\n      '13': 19.109257071268299,\n      '14': 9.5546285356341496,\n      '15': 4.7773142679493699,\n      '16': 2.38865713397468,\n      '17': 1.1943285668550501,\n      '18': 0.59716428355981699,\n      '19': 0.29858214164761698,\n      '20': 0.14929107082381,\n      '21': 0.07464553541191,\n      '22': 0.0373227677059525,\n      '23': 0.0186613838529763\n    }\n  },\n\n  initialize: function (options) {\n    options = leaflet.Util.setOptions(this, options);\n\n    // set the urls\n    options = getUrlParams(options);\n    this.tileUrl = (options.proxy ? options.proxy + '?' : '') + options.url + 'tile/{z}/{y}/{x}' + (options.requestParams && Object.keys(options.requestParams).length > 0 ? leaflet.Util.getParamString(options.requestParams) : '');\n    // Remove subdomain in url\n    // https://github.com/Esri/esri-leaflet/issues/991\n    if (options.url.indexOf('{s}') !== -1 && options.subdomains) {\n      options.url = options.url.replace('{s}', options.subdomains[0]);\n    }\n    this.service = mapService(options);\n    this.service.addEventParent(this);\n\n    var arcgisonline = new RegExp(/tiles.arcgis(online)?\\.com/g);\n    if (arcgisonline.test(options.url)) {\n      this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}');\n      options.subdomains = ['1', '2', '3', '4'];\n    }\n\n    if (this.options.token) {\n      this.tileUrl += ('?token=' + this.options.token);\n    }\n\n    // init layer by calling TileLayers initialize method\n    leaflet.TileLayer.prototype.initialize.call(this, this.tileUrl, options);\n  },\n\n  getTileUrl: function (tilePoint) {\n    var zoom = this._getZoomForUrl();\n\n    return leaflet.Util.template(this.tileUrl, leaflet.Util.extend({\n      s: this._getSubdomain(tilePoint),\n      x: tilePoint.x,\n      y: tilePoint.y,\n      // try lod map first, then just default to zoom level\n      z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom\n    }, this.options));\n  },\n\n  createTile: function (coords, done) {\n    var tile = document.createElement('img');\n\n    leaflet.DomEvent.on(tile, 'load', leaflet.Util.bind(this._tileOnLoad, this, done, tile));\n    leaflet.DomEvent.on(tile, 'error', leaflet.Util.bind(this._tileOnError, this, done, tile));\n\n    if (this.options.crossOrigin) {\n      tile.crossOrigin = '';\n    }\n\n    /*\n     Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons\n     http://www.w3.org/TR/WCAG20-TECHS/H67\n    */\n    tile.alt = '';\n\n    // if there is no lod map or an lod map with a proper zoom load the tile\n    // otherwise wait for the lod map to become available\n    if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) {\n      tile.src = this.getTileUrl(coords);\n    } else {\n      this.once('lodmap', function () {\n        tile.src = this.getTileUrl(coords);\n      }, this);\n    }\n\n    return tile;\n  },\n\n  onAdd: function (map) {\n    // include 'Powered by Esri' in map attribution\n    setEsriAttribution(map);\n\n    if (!this._lodMap) {\n      this.metadata(function (error, metadata) {\n        if (!error && metadata.spatialReference) {\n          var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid;\n          // display the copyright text from the service using leaflet's attribution control\n          if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {\n            this.options.attribution = metadata.copyrightText;\n            map.attributionControl.addAttribution(this.getAttribution());\n          }\n\n          // if the service tiles were published in web mercator using conventional LODs but missing levels, we can try and remap them\n          if (map.options.crs === leaflet.CRS.EPSG3857 && (sr === 102100 || sr === 3857)) {\n            this._lodMap = {};\n            // create the zoom level data\n            var arcgisLODs = metadata.tileInfo.lods;\n            var correctResolutions = TiledMapLayer.MercatorZoomLevels;\n\n            for (var i = 0; i < arcgisLODs.length; i++) {\n              var arcgisLOD = arcgisLODs[i];\n              for (var ci in correctResolutions) {\n                var correctRes = correctResolutions[ci];\n\n                if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) {\n                  this._lodMap[ci] = arcgisLOD.level;\n                  break;\n                }\n              }\n            }\n\n            this.fire('lodmap');\n          } else if (map.options.crs && map.options.crs.code && (map.options.crs.code.indexOf(sr) > -1)) {\n            // if the projection is WGS84, or the developer is using Proj4 to define a custom CRS, no action is required\n          } else {\n            // if the service was cached in a custom projection and an appropriate LOD hasn't been defined in the map, guide the developer to our Proj4 sample\n            warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html');\n          }\n        }\n      }, this);\n    }\n\n    leaflet.TileLayer.prototype.onAdd.call(this, map);\n  },\n\n  metadata: function (callback, context) {\n    this.service.metadata(callback, context);\n    return this;\n  },\n\n  identify: function () {\n    return this.service.identify();\n  },\n\n  find: function () {\n    return this.service.find();\n  },\n\n  query: function () {\n    return this.service.query();\n  },\n\n  authenticate: function (token) {\n    var tokenQs = '?token=' + token;\n    this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs;\n    this.options.token = token;\n    this.service.authenticate(token);\n    return this;\n  },\n\n  _withinPercentage: function (a, b, percentage) {\n    var diff = Math.abs((a / b) - 1);\n    return diff < percentage;\n  }\n});\n\nfunction tiledMapLayer (url, options) {\n  return new TiledMapLayer(url, options);\n}\n\nvar Overlay = leaflet.ImageOverlay.extend({\n  onAdd: function (map) {\n    this._topLeft = map.getPixelBounds().min;\n    leaflet.ImageOverlay.prototype.onAdd.call(this, map);\n  },\n  _reset: function () {\n    if (this._map.options.crs === leaflet.CRS.EPSG3857) {\n      leaflet.ImageOverlay.prototype._reset.call(this);\n    } else {\n      leaflet.DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin()));\n    }\n  }\n});\n\nvar RasterLayer = leaflet.Layer.extend({\n  options: {\n    opacity: 1,\n    position: 'front',\n    f: 'image',\n    useCors: cors,\n    attribution: null,\n    interactive: false,\n    alt: ''\n  },\n\n  onAdd: function (map) {\n    // include 'Powered by Esri' in map attribution\n    setEsriAttribution(map);\n\n    this._update = leaflet.Util.throttle(this._update, this.options.updateInterval, this);\n\n    map.on('moveend', this._update, this);\n\n    // if we had an image loaded and it matches the\n    // current bounds show the image otherwise remove it\n    if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) {\n      map.addLayer(this._currentImage);\n    } else if (this._currentImage) {\n      this._map.removeLayer(this._currentImage);\n      this._currentImage = null;\n    }\n\n    this._update();\n\n    if (this._popup) {\n      this._map.on('click', this._getPopupData, this);\n      this._map.on('dblclick', this._resetPopupState, this);\n    }\n\n    // add copyright text listed in service metadata\n    this.metadata(function (err, metadata) {\n      if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) {\n        this.options.attribution = metadata.copyrightText;\n        map.attributionControl.addAttribution(this.getAttribution());\n      }\n    }, this);\n  },\n\n  onRemove: function (map) {\n    if (this._currentImage) {\n      this._map.removeLayer(this._currentImage);\n    }\n\n    if (this._popup) {\n      this._map.off('click', this._getPopupData, this);\n      this._map.off('dblclick', this._resetPopupState, this);\n    }\n\n    this._map.off('moveend', this._update, this);\n  },\n\n  bindPopup: function (fn, popupOptions) {\n    this._shouldRenderPopup = false;\n    this._lastClick = false;\n    this._popup = leaflet.popup(popupOptions);\n    this._popupFunction = fn;\n    if (this._map) {\n      this._map.on('click', this._getPopupData, this);\n      this._map.on('dblclick', this._resetPopupState, this);\n    }\n    return this;\n  },\n\n  unbindPopup: function () {\n    if (this._map) {\n      this._map.closePopup(this._popup);\n      this._map.off('click', this._getPopupData, this);\n      this._map.off('dblclick', this._resetPopupState, this);\n    }\n    this._popup = false;\n    return this;\n  },\n\n  bringToFront: function () {\n    this.options.position = 'front';\n    if (this._currentImage) {\n      this._currentImage.bringToFront();\n    }\n    return this;\n  },\n\n  bringToBack: function () {\n    this.options.position = 'back';\n    if (this._currentImage) {\n      this._currentImage.bringToBack();\n    }\n    return this;\n  },\n\n  getAttribution: function () {\n    return this.options.attribution;\n  },\n\n  getOpacity: function () {\n    return this.options.opacity;\n  },\n\n  setOpacity: function (opacity) {\n    this.options.opacity = opacity;\n    if (this._currentImage) {\n      this._currentImage.setOpacity(opacity);\n    }\n    return this;\n  },\n\n  getTimeRange: function () {\n    return [this.options.from, this.options.to];\n  },\n\n  setTimeRange: function (from, to) {\n    this.options.from = from;\n    this.options.to = to;\n    this._update();\n    return this;\n  },\n\n  metadata: function (callback, context) {\n    this.service.metadata(callback, context);\n    return this;\n  },\n\n  authenticate: function (token) {\n    this.service.authenticate(token);\n    return this;\n  },\n\n  redraw: function () {\n    this._update();\n  },\n\n  _renderImage: function (url, bounds, contentType) {\n    if (this._map) {\n      // if no output directory has been specified for a service, MIME data will be returned\n      if (contentType) {\n        url = 'data:' + contentType + ';base64,' + url;\n      }\n      // create a new image overlay and add it to the map\n      // to start loading the image\n      // opacity is 0 while the image is loading\n      var image = new Overlay(url, bounds, {\n        opacity: 0,\n        crossOrigin: this.options.useCors,\n        alt: this.options.alt,\n        pane: this.options.pane || this.getPane(),\n        interactive: this.options.interactive\n      }).addTo(this._map);\n\n      var onOverlayError = function () {\n        this._map.removeLayer(image);\n        this.fire('error');\n        image.off('load', onOverlayLoad, this);\n      };\n\n      var onOverlayLoad = function (e) {\n        image.off('error', onOverlayLoad, this);\n        if (this._map) {\n          var newImage = e.target;\n          var oldImage = this._currentImage;\n\n          // if the bounds of this image matches the bounds that\n          // _renderImage was called with and we have a map with the same bounds\n          // hide the old image if there is one and set the opacity\n          // of the new image otherwise remove the new image\n          if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) {\n            this._currentImage = newImage;\n\n            if (this.options.position === 'front') {\n              this.bringToFront();\n            } else {\n              this.bringToBack();\n            }\n\n            if (this._map && this._currentImage._map) {\n              this._currentImage.setOpacity(this.options.opacity);\n            } else {\n              this._currentImage._map.removeLayer(this._currentImage);\n            }\n\n            if (oldImage && this._map) {\n              this._map.removeLayer(oldImage);\n            }\n\n            if (oldImage && oldImage._map) {\n              oldImage._map.removeLayer(oldImage);\n            }\n          } else {\n            this._map.removeLayer(newImage);\n          }\n        }\n\n        this.fire('load', {\n          bounds: bounds\n        });\n      };\n\n      // If loading the image fails\n      image.once('error', onOverlayError, this);\n\n      // once the image loads\n      image.once('load', onOverlayLoad, this);\n\n      this.fire('loading', {\n        bounds: bounds\n      });\n    }\n  },\n\n  _update: function () {\n    if (!this._map) {\n      return;\n    }\n\n    var zoom = this._map.getZoom();\n    var bounds = this._map.getBounds();\n\n    if (this._animatingZoom) {\n      return;\n    }\n\n    if (this._map._panTransition && this._map._panTransition._inProgress) {\n      return;\n    }\n\n    if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n      if (this._currentImage) {\n        this._currentImage._map.removeLayer(this._currentImage);\n        this._currentImage = null;\n      }\n      return;\n    }\n\n    var params = this._buildExportParams();\n    leaflet.Util.extend(params, this.options.requestParams);\n\n    if (params) {\n      this._requestExport(params, bounds);\n    } else if (this._currentImage) {\n      this._currentImage._map.removeLayer(this._currentImage);\n      this._currentImage = null;\n    }\n  },\n\n  _renderPopup: function (latlng, error, results, response) {\n    latlng = leaflet.latLng(latlng);\n    if (this._shouldRenderPopup && this._lastClick.equals(latlng)) {\n      // add the popup to the map where the mouse was clicked at\n      var content = this._popupFunction(error, results, response);\n      if (content) {\n        this._popup.setLatLng(latlng).setContent(content).openOn(this._map);\n      }\n    }\n  },\n\n  _resetPopupState: function (e) {\n    this._shouldRenderPopup = false;\n    this._lastClick = e.latlng;\n  },\n\n  _calculateBbox: function () {\n    var pixelBounds = this._map.getPixelBounds();\n\n    var sw = this._map.unproject(pixelBounds.getBottomLeft());\n    var ne = this._map.unproject(pixelBounds.getTopRight());\n\n    var neProjected = this._map.options.crs.project(ne);\n    var swProjected = this._map.options.crs.project(sw);\n\n    // this ensures ne/sw are switched in polar maps where north/top bottom/south is inverted\n    var boundsProjected = leaflet.bounds(neProjected, swProjected);\n\n    return [boundsProjected.getBottomLeft().x, boundsProjected.getBottomLeft().y, boundsProjected.getTopRight().x, boundsProjected.getTopRight().y].join(',');\n  },\n\n  _calculateImageSize: function () {\n    // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying within the div\n    var bounds = this._map.getPixelBounds();\n    var size = this._map.getSize();\n\n    var sw = this._map.unproject(bounds.getBottomLeft());\n    var ne = this._map.unproject(bounds.getTopRight());\n\n    var top = this._map.latLngToLayerPoint(ne).y;\n    var bottom = this._map.latLngToLayerPoint(sw).y;\n\n    if (top > 0 || bottom < size.y) {\n      size.y = bottom - top;\n    }\n\n    return size.x + ',' + size.y;\n  }\n});\n\nvar ImageMapLayer = RasterLayer.extend({\n\n  options: {\n    updateInterval: 150,\n    format: 'jpgpng',\n    transparent: true,\n    f: 'image'\n  },\n\n  query: function () {\n    return this.service.query();\n  },\n\n  identify: function () {\n    return this.service.identify();\n  },\n\n  initialize: function (options) {\n    options = getUrlParams(options);\n    this.service = imageService(options);\n    this.service.addEventParent(this);\n\n    leaflet.Util.setOptions(this, options);\n  },\n\n  setPixelType: function (pixelType) {\n    this.options.pixelType = pixelType;\n    this._update();\n    return this;\n  },\n\n  getPixelType: function () {\n    return this.options.pixelType;\n  },\n\n  setBandIds: function (bandIds) {\n    if (leaflet.Util.isArray(bandIds)) {\n      this.options.bandIds = bandIds.join(',');\n    } else {\n      this.options.bandIds = bandIds.toString();\n    }\n    this._update();\n    return this;\n  },\n\n  getBandIds: function () {\n    return this.options.bandIds;\n  },\n\n  setNoData: function (noData, noDataInterpretation) {\n    if (leaflet.Util.isArray(noData)) {\n      this.options.noData = noData.join(',');\n    } else {\n      this.options.noData = noData.toString();\n    }\n    if (noDataInterpretation) {\n      this.options.noDataInterpretation = noDataInterpretation;\n    }\n    this._update();\n    return this;\n  },\n\n  getNoData: function () {\n    return this.options.noData;\n  },\n\n  getNoDataInterpretation: function () {\n    return this.options.noDataInterpretation;\n  },\n\n  setRenderingRule: function (renderingRule) {\n    this.options.renderingRule = renderingRule;\n    this._update();\n  },\n\n  getRenderingRule: function () {\n    return this.options.renderingRule;\n  },\n\n  setMosaicRule: function (mosaicRule) {\n    this.options.mosaicRule = mosaicRule;\n    this._update();\n  },\n\n  getMosaicRule: function () {\n    return this.options.mosaicRule;\n  },\n\n  _getPopupData: function (e) {\n    var callback = leaflet.Util.bind(function (error, results, response) {\n      if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n      setTimeout(leaflet.Util.bind(function () {\n        this._renderPopup(e.latlng, error, results, response);\n      }, this), 300);\n    }, this);\n\n    var identifyRequest = this.identify().at(e.latlng);\n\n    // set mosaic rule for identify task if it is set for layer\n    if (this.options.mosaicRule) {\n      identifyRequest.setMosaicRule(this.options.mosaicRule);\n      // @TODO: force return catalog items too?\n    }\n\n    // @TODO: set rendering rule? Not sure,\n    // sometimes you want raw pixel values\n    // if (this.options.renderingRule) {\n    //   identifyRequest.setRenderingRule(this.options.renderingRule);\n    // }\n\n    identifyRequest.run(callback);\n\n    // set the flags to show the popup\n    this._shouldRenderPopup = true;\n    this._lastClick = e.latlng;\n  },\n\n  _buildExportParams: function () {\n    var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);\n\n    var params = {\n      bbox: this._calculateBbox(),\n      size: this._calculateImageSize(),\n      format: this.options.format,\n      transparent: this.options.transparent,\n      bboxSR: sr,\n      imageSR: sr\n    };\n\n    if (this.options.from && this.options.to) {\n      params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();\n    }\n\n    if (this.options.pixelType) {\n      params.pixelType = this.options.pixelType;\n    }\n\n    if (this.options.interpolation) {\n      params.interpolation = this.options.interpolation;\n    }\n\n    if (this.options.compressionQuality) {\n      params.compressionQuality = this.options.compressionQuality;\n    }\n\n    if (this.options.bandIds) {\n      params.bandIds = this.options.bandIds;\n    }\n\n    // 0 is falsy *and* a valid input parameter\n    if (this.options.noData === 0 || this.options.noData) {\n      params.noData = this.options.noData;\n    }\n\n    if (this.options.noDataInterpretation) {\n      params.noDataInterpretation = this.options.noDataInterpretation;\n    }\n\n    if (this.service.options.token) {\n      params.token = this.service.options.token;\n    }\n\n    if (this.options.renderingRule) {\n      params.renderingRule = JSON.stringify(this.options.renderingRule);\n    }\n\n    if (this.options.mosaicRule) {\n      params.mosaicRule = JSON.stringify(this.options.mosaicRule);\n    }\n\n    return params;\n  },\n\n  _requestExport: function (params, bounds) {\n    if (this.options.f === 'json') {\n      this.service.request('exportImage', params, function (error, response) {\n        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n        if (this.options.token) {\n          response.href += ('?token=' + this.options.token);\n        }\n        this._renderImage(response.href, bounds);\n      }, this);\n    } else {\n      params.f = 'image';\n      this._renderImage(this.options.url + 'exportImage' + leaflet.Util.getParamString(params), bounds);\n    }\n  }\n});\n\nfunction imageMapLayer (url, options) {\n  return new ImageMapLayer(url, options);\n}\n\nvar DynamicMapLayer = RasterLayer.extend({\n\n  options: {\n    updateInterval: 150,\n    layers: false,\n    layerDefs: false,\n    timeOptions: false,\n    format: 'png24',\n    transparent: true,\n    f: 'json'\n  },\n\n  initialize: function (options) {\n    options = getUrlParams(options);\n    this.service = mapService(options);\n    this.service.addEventParent(this);\n\n    if ((options.proxy || options.token) && options.f !== 'json') {\n      options.f = 'json';\n    }\n\n    leaflet.Util.setOptions(this, options);\n  },\n\n  getDynamicLayers: function () {\n    return this.options.dynamicLayers;\n  },\n\n  setDynamicLayers: function (dynamicLayers) {\n    this.options.dynamicLayers = dynamicLayers;\n    this._update();\n    return this;\n  },\n\n  getLayers: function () {\n    return this.options.layers;\n  },\n\n  setLayers: function (layers) {\n    this.options.layers = layers;\n    this._update();\n    return this;\n  },\n\n  getLayerDefs: function () {\n    return this.options.layerDefs;\n  },\n\n  setLayerDefs: function (layerDefs) {\n    this.options.layerDefs = layerDefs;\n    this._update();\n    return this;\n  },\n\n  getTimeOptions: function () {\n    return this.options.timeOptions;\n  },\n\n  setTimeOptions: function (timeOptions) {\n    this.options.timeOptions = timeOptions;\n    this._update();\n    return this;\n  },\n\n  query: function () {\n    return this.service.query();\n  },\n\n  identify: function () {\n    return this.service.identify();\n  },\n\n  find: function () {\n    return this.service.find();\n  },\n\n  _getPopupData: function (e) {\n    var callback = leaflet.Util.bind(function (error, featureCollection, response) {\n      if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n      setTimeout(leaflet.Util.bind(function () {\n        this._renderPopup(e.latlng, error, featureCollection, response);\n      }, this), 300);\n    }, this);\n\n    var identifyRequest;\n    if (this.options.popup) {\n      identifyRequest = this.options.popup.on(this._map).at(e.latlng);\n    } else {\n      identifyRequest = this.identify().on(this._map).at(e.latlng);\n    }\n\n    // remove extraneous vertices from response features if it has not already been done\n    identifyRequest.params.maxAllowableOffset ? true : identifyRequest.simplify(this._map, 0.5);\n\n    if (!(this.options.popup && this.options.popup.params && this.options.popup.params.layers)) {\n      if (this.options.layers) {\n        identifyRequest.layers('visible:' + this.options.layers.join(','));\n      } else {\n        identifyRequest.layers('visible');\n      }\n    }\n\n    // if present, pass layer ids and sql filters through to the identify task\n    if (this.options.layerDefs && typeof this.options.layerDefs !== 'string' && !identifyRequest.params.layerDefs) {\n      for (var id in this.options.layerDefs) {\n        if (this.options.layerDefs.hasOwnProperty(id)) {\n          identifyRequest.layerDef(id, this.options.layerDefs[id]);\n        }\n      }\n    }\n\n    identifyRequest.run(callback);\n\n    // set the flags to show the popup\n    this._shouldRenderPopup = true;\n    this._lastClick = e.latlng;\n  },\n\n  _buildExportParams: function () {\n    var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);\n\n    var params = {\n      bbox: this._calculateBbox(),\n      size: this._calculateImageSize(),\n      dpi: 96,\n      format: this.options.format,\n      transparent: this.options.transparent,\n      bboxSR: sr,\n      imageSR: sr\n    };\n\n    if (this.options.dynamicLayers) {\n      params.dynamicLayers = this.options.dynamicLayers;\n    }\n\n    if (this.options.layers) {\n      if (this.options.layers.length === 0) {\n        return;\n      } else {\n        params.layers = 'show:' + this.options.layers.join(',');\n      }\n    }\n\n    if (this.options.layerDefs) {\n      params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs);\n    }\n\n    if (this.options.timeOptions) {\n      params.timeOptions = JSON.stringify(this.options.timeOptions);\n    }\n\n    if (this.options.from && this.options.to) {\n      params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();\n    }\n\n    if (this.service.options.token) {\n      params.token = this.service.options.token;\n    }\n\n    if (this.options.proxy) {\n      params.proxy = this.options.proxy;\n    }\n\n    // use a timestamp to bust server cache\n    if (this.options.disableCache) {\n      params._ts = Date.now();\n    }\n\n    return params;\n  },\n\n  _requestExport: function (params, bounds) {\n    if (this.options.f === 'json') {\n      this.service.request('export', params, function (error, response) {\n        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n\n        if (this.options.token) {\n          response.href += ('?token=' + this.options.token);\n        }\n        if (this.options.proxy) {\n          response.href = this.options.proxy + '?' + response.href;\n        }\n        if (response.href) {\n          this._renderImage(response.href, bounds);\n        } else {\n          this._renderImage(response.imageData, bounds, response.contentType);\n        }\n      }, this);\n    } else {\n      params.f = 'image';\n      this._renderImage(this.options.url + 'export' + leaflet.Util.getParamString(params), bounds);\n    }\n  }\n});\n\nfunction dynamicMapLayer (url, options) {\n  return new DynamicMapLayer(url, options);\n}\n\nvar VirtualGrid = leaflet.Layer.extend({\n\n  options: {\n    cellSize: 512,\n    updateInterval: 150\n  },\n\n  initialize: function (options) {\n    options = leaflet.setOptions(this, options);\n    this._zooming = false;\n  },\n\n  onAdd: function (map) {\n    this._map = map;\n    this._update = leaflet.Util.throttle(this._update, this.options.updateInterval, this);\n    this._reset();\n    this._update();\n  },\n\n  onRemove: function () {\n    this._map.removeEventListener(this.getEvents(), this);\n    this._removeCells();\n  },\n\n  getEvents: function () {\n    var events = {\n      moveend: this._update,\n      zoomstart: this._zoomstart,\n      zoomend: this._reset\n    };\n\n    return events;\n  },\n\n  addTo: function (map) {\n    map.addLayer(this);\n    return this;\n  },\n\n  removeFrom: function (map) {\n    map.removeLayer(this);\n    return this;\n  },\n\n  _zoomstart: function () {\n    this._zooming = true;\n  },\n\n  _reset: function () {\n    this._removeCells();\n\n    this._cells = {};\n    this._activeCells = {};\n    this._cellsToLoad = 0;\n    this._cellsTotal = 0;\n    this._cellNumBounds = this._getCellNumBounds();\n\n    this._resetWrap();\n    this._zooming = false;\n  },\n\n  _resetWrap: function () {\n    var map = this._map;\n    var crs = map.options.crs;\n\n    if (crs.infinite) { return; }\n\n    var cellSize = this._getCellSize();\n\n    if (crs.wrapLng) {\n      this._wrapLng = [\n        Math.floor(map.project([0, crs.wrapLng[0]]).x / cellSize),\n        Math.ceil(map.project([0, crs.wrapLng[1]]).x / cellSize)\n      ];\n    }\n\n    if (crs.wrapLat) {\n      this._wrapLat = [\n        Math.floor(map.project([crs.wrapLat[0], 0]).y / cellSize),\n        Math.ceil(map.project([crs.wrapLat[1], 0]).y / cellSize)\n      ];\n    }\n  },\n\n  _getCellSize: function () {\n    return this.options.cellSize;\n  },\n\n  _update: function () {\n    if (!this._map) {\n      return;\n    }\n\n    var mapBounds = this._map.getPixelBounds();\n    var cellSize = this._getCellSize();\n\n    // cell coordinates range for the current view\n    var cellBounds = leaflet.bounds(\n      mapBounds.min.divideBy(cellSize).floor(),\n      mapBounds.max.divideBy(cellSize).floor());\n\n    this._removeOtherCells(cellBounds);\n    this._addCells(cellBounds);\n\n    this.fire('cellsupdated');\n  },\n\n  _addCells: function (cellBounds) {\n    var queue = [];\n    var center = cellBounds.getCenter();\n    var zoom = this._map.getZoom();\n\n    var j, i, coords;\n    // create a queue of coordinates to load cells from\n    for (j = cellBounds.min.y; j <= cellBounds.max.y; j++) {\n      for (i = cellBounds.min.x; i <= cellBounds.max.x; i++) {\n        coords = leaflet.point(i, j);\n        coords.z = zoom;\n\n        if (this._isValidCell(coords)) {\n          queue.push(coords);\n        }\n      }\n    }\n\n    var cellsToLoad = queue.length;\n\n    if (cellsToLoad === 0) { return; }\n\n    this._cellsToLoad += cellsToLoad;\n    this._cellsTotal += cellsToLoad;\n\n    // sort cell queue to load cells in order of their distance to center\n    queue.sort(function (a, b) {\n      return a.distanceTo(center) - b.distanceTo(center);\n    });\n\n    for (i = 0; i < cellsToLoad; i++) {\n      this._addCell(queue[i]);\n    }\n  },\n\n  _isValidCell: function (coords) {\n    var crs = this._map.options.crs;\n\n    if (!crs.infinite) {\n      // don't load cell if it's out of bounds and not wrapped\n      var cellNumBounds = this._cellNumBounds;\n      if (\n        (!crs.wrapLng && (coords.x < cellNumBounds.min.x || coords.x > cellNumBounds.max.x)) ||\n        (!crs.wrapLat && (coords.y < cellNumBounds.min.y || coords.y > cellNumBounds.max.y))\n      ) {\n        return false;\n      }\n    }\n\n    if (!this.options.bounds) {\n      return true;\n    }\n\n    // don't load cell if it doesn't intersect the bounds in options\n    var cellBounds = this._cellCoordsToBounds(coords);\n    return leaflet.latLngBounds(this.options.bounds).intersects(cellBounds);\n  },\n\n  // converts cell coordinates to its geographical bounds\n  _cellCoordsToBounds: function (coords) {\n    var map = this._map;\n    var cellSize = this.options.cellSize;\n    var nwPoint = coords.multiplyBy(cellSize);\n    var sePoint = nwPoint.add([cellSize, cellSize]);\n    var nw = map.wrapLatLng(map.unproject(nwPoint, coords.z));\n    var se = map.wrapLatLng(map.unproject(sePoint, coords.z));\n\n    return leaflet.latLngBounds(nw, se);\n  },\n\n  // converts cell coordinates to key for the cell cache\n  _cellCoordsToKey: function (coords) {\n    return coords.x + ':' + coords.y;\n  },\n\n  // converts cell cache key to coordiantes\n  _keyToCellCoords: function (key) {\n    var kArr = key.split(':');\n    var x = parseInt(kArr[0], 10);\n    var y = parseInt(kArr[1], 10);\n\n    return leaflet.point(x, y);\n  },\n\n  // remove any present cells that are off the specified bounds\n  _removeOtherCells: function (bounds) {\n    for (var key in this._cells) {\n      if (!bounds.contains(this._keyToCellCoords(key))) {\n        this._removeCell(key);\n      }\n    }\n  },\n\n  _removeCell: function (key) {\n    var cell = this._activeCells[key];\n\n    if (cell) {\n      delete this._activeCells[key];\n\n      if (this.cellLeave) {\n        this.cellLeave(cell.bounds, cell.coords);\n      }\n\n      this.fire('cellleave', {\n        bounds: cell.bounds,\n        coords: cell.coords\n      });\n    }\n  },\n\n  _removeCells: function () {\n    for (var key in this._cells) {\n      var cellBounds = this._cells[key].bounds;\n      var coords = this._cells[key].coords;\n\n      if (this.cellLeave) {\n        this.cellLeave(cellBounds, coords);\n      }\n\n      this.fire('cellleave', {\n        bounds: cellBounds,\n        coords: coords\n      });\n    }\n  },\n\n  _addCell: function (coords) {\n    // wrap cell coords if necessary (depending on CRS)\n    this._wrapCoords(coords);\n\n    // generate the cell key\n    var key = this._cellCoordsToKey(coords);\n\n    // get the cell from the cache\n    var cell = this._cells[key];\n    // if this cell should be shown as isnt active yet (enter)\n\n    if (cell && !this._activeCells[key]) {\n      if (this.cellEnter) {\n        this.cellEnter(cell.bounds, coords);\n      }\n\n      this.fire('cellenter', {\n        bounds: cell.bounds,\n        coords: coords\n      });\n\n      this._activeCells[key] = cell;\n    }\n\n    // if we dont have this cell in the cache yet (create)\n    if (!cell) {\n      cell = {\n        coords: coords,\n        bounds: this._cellCoordsToBounds(coords)\n      };\n\n      this._cells[key] = cell;\n      this._activeCells[key] = cell;\n\n      if (this.createCell) {\n        this.createCell(cell.bounds, coords);\n      }\n\n      this.fire('cellcreate', {\n        bounds: cell.bounds,\n        coords: coords\n      });\n    }\n  },\n\n  _wrapCoords: function (coords) {\n    coords.x = this._wrapLng ? leaflet.Util.wrapNum(coords.x, this._wrapLng) : coords.x;\n    coords.y = this._wrapLat ? leaflet.Util.wrapNum(coords.y, this._wrapLat) : coords.y;\n  },\n\n  // get the global cell coordinates range for the current zoom\n  _getCellNumBounds: function () {\n    var worldBounds = this._map.getPixelWorldBounds();\n    var size = this._getCellSize();\n\n    return worldBounds ? leaflet.bounds(\n      worldBounds.min.divideBy(size).floor(),\n      worldBounds.max.divideBy(size).ceil().subtract([1, 1])) : null;\n  }\n});\n\nfunction BinarySearchIndex (values) {\n  this.values = [].concat(values || []);\n}\n\nBinarySearchIndex.prototype.query = function (value) {\n  var index = this.getIndex(value);\n  return this.values[index];\n};\n\nBinarySearchIndex.prototype.getIndex = function getIndex (value) {\n  if (this.dirty) {\n    this.sort();\n  }\n\n  var minIndex = 0;\n  var maxIndex = this.values.length - 1;\n  var currentIndex;\n  var currentElement;\n\n  while (minIndex <= maxIndex) {\n    currentIndex = (minIndex + maxIndex) / 2 | 0;\n    currentElement = this.values[Math.round(currentIndex)];\n    if (+currentElement.value < +value) {\n      minIndex = currentIndex + 1;\n    } else if (+currentElement.value > +value) {\n      maxIndex = currentIndex - 1;\n    } else {\n      return currentIndex;\n    }\n  }\n\n  return Math.abs(~maxIndex);\n};\n\nBinarySearchIndex.prototype.between = function between (start, end) {\n  var startIndex = this.getIndex(start);\n  var endIndex = this.getIndex(end);\n\n  if (startIndex === 0 && endIndex === 0) {\n    return [];\n  }\n\n  while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) {\n    startIndex--;\n  }\n\n  while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) {\n    endIndex++;\n  }\n\n  if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) {\n    endIndex++;\n  }\n\n  return this.values.slice(startIndex, endIndex);\n};\n\nBinarySearchIndex.prototype.insert = function insert (item) {\n  this.values.splice(this.getIndex(item.value), 0, item);\n  return this;\n};\n\nBinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) {\n  this.values = this.values.concat([].concat(items || []));\n\n  if (sort) {\n    this.sort();\n  } else {\n    this.dirty = true;\n  }\n\n  return this;\n};\n\nBinarySearchIndex.prototype.sort = function sort () {\n  this.values.sort(function (a, b) {\n    return +b.value - +a.value;\n  }).reverse();\n  this.dirty = false;\n  return this;\n};\n\nvar FeatureManager = VirtualGrid.extend({\n  /**\n   * Options\n   */\n\n  options: {\n    attribution: null,\n    where: '1=1',\n    fields: ['*'],\n    from: false,\n    to: false,\n    timeField: false,\n    timeFilterMode: 'server',\n    simplifyFactor: 0,\n    precision: 6\n  },\n\n  /**\n   * Constructor\n   */\n\n  initialize: function (options) {\n    VirtualGrid.prototype.initialize.call(this, options);\n\n    options = getUrlParams(options);\n    options = leaflet.Util.setOptions(this, options);\n\n    this.service = featureLayerService(options);\n    this.service.addEventParent(this);\n\n    // use case insensitive regex to look for common fieldnames used for indexing\n    if (this.options.fields[0] !== '*') {\n      var oidCheck = false;\n      for (var i = 0; i < this.options.fields.length; i++) {\n        if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) {\n          oidCheck = true;\n        }\n      }\n      if (oidCheck === false) {\n        warn('no known esriFieldTypeOID field detected in fields Array.  Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.');\n      }\n    }\n\n    if (this.options.timeField.start && this.options.timeField.end) {\n      this._startTimeIndex = new BinarySearchIndex();\n      this._endTimeIndex = new BinarySearchIndex();\n    } else if (this.options.timeField) {\n      this._timeIndex = new BinarySearchIndex();\n    }\n\n    this._cache = {};\n    this._currentSnapshot = []; // cache of what layers should be active\n    this._activeRequests = 0;\n  },\n\n  /**\n   * Layer Interface\n   */\n\n  onAdd: function (map) {\n    // include 'Powered by Esri' in map attribution\n    setEsriAttribution(map);\n\n    this.service.metadata(function (err, metadata) {\n      if (!err) {\n        var supportedFormats = metadata.supportedQueryFormats;\n\n        // Check if someone has requested that we don't use geoJSON, even if it's available\n        var forceJsonFormat = false;\n        if (this.service.options.isModern === false) {\n          forceJsonFormat = true;\n        }\n\n        // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively\n        if (!forceJsonFormat && supportedFormats && supportedFormats.indexOf('geoJSON') !== -1) {\n          this.service.options.isModern = true;\n        }\n\n        // add copyright text listed in service metadata\n        if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {\n          this.options.attribution = metadata.copyrightText;\n          map.attributionControl.addAttribution(this.getAttribution());\n        }\n      }\n    }, this);\n\n    map.on('zoomend', this._handleZoomChange, this);\n\n    return VirtualGrid.prototype.onAdd.call(this, map);\n  },\n\n  onRemove: function (map) {\n    map.off('zoomend', this._handleZoomChange, this);\n\n    return VirtualGrid.prototype.onRemove.call(this, map);\n  },\n\n  getAttribution: function () {\n    return this.options.attribution;\n  },\n\n  /**\n   * Feature Management\n   */\n\n  createCell: function (bounds, coords) {\n    // dont fetch features outside the scale range defined for the layer\n    if (this._visibleZoom()) {\n      this._requestFeatures(bounds, coords);\n    }\n  },\n\n  _requestFeatures: function (bounds, coords, callback) {\n    this._activeRequests++;\n\n    // our first active request fires loading\n    if (this._activeRequests === 1) {\n      this.fire('loading', {\n        bounds: bounds\n      }, true);\n    }\n\n    return this._buildQuery(bounds).run(function (error, featureCollection, response) {\n      if (response && response.exceededTransferLimit) {\n        this.fire('drawlimitexceeded');\n      }\n\n      // no error, features\n      if (!error && featureCollection && featureCollection.features.length) {\n        // schedule adding features until the next animation frame\n        leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {\n          this._addFeatures(featureCollection.features, coords);\n          this._postProcessFeatures(bounds);\n        }, this));\n      }\n\n      // no error, no features\n      if (!error && featureCollection && !featureCollection.features.length) {\n        this._postProcessFeatures(bounds);\n      }\n\n      if (error) {\n        this._postProcessFeatures(bounds);\n      }\n\n      if (callback) {\n        callback.call(this, error, featureCollection);\n      }\n    }, this);\n  },\n\n  _postProcessFeatures: function (bounds) {\n    // deincrement the request counter now that we have processed features\n    this._activeRequests--;\n\n    // if there are no more active requests fire a load event for this view\n    if (this._activeRequests <= 0) {\n      this.fire('load', {\n        bounds: bounds\n      });\n    }\n  },\n\n  _cacheKey: function (coords) {\n    return coords.z + ':' + coords.x + ':' + coords.y;\n  },\n\n  _addFeatures: function (features, coords) {\n    var key = this._cacheKey(coords);\n    this._cache[key] = this._cache[key] || [];\n\n    for (var i = features.length - 1; i >= 0; i--) {\n      var id = features[i].id;\n\n      if (this._currentSnapshot.indexOf(id) === -1) {\n        this._currentSnapshot.push(id);\n      }\n      if (this._cache[key].indexOf(id) === -1) {\n        this._cache[key].push(id);\n      }\n    }\n\n    if (this.options.timeField) {\n      this._buildTimeIndexes(features);\n    }\n\n    this.createLayers(features);\n  },\n\n  _buildQuery: function (bounds) {\n    var query = this.service.query()\n      .intersects(bounds)\n      .where(this.options.where)\n      .fields(this.options.fields)\n      .precision(this.options.precision);\n\n    if (this.options.requestParams) {\n      leaflet.Util.extend(query.params, this.options.requestParams);\n    }\n\n    if (this.options.simplifyFactor) {\n      query.simplify(this._map, this.options.simplifyFactor);\n    }\n\n    if (this.options.timeFilterMode === 'server' && this.options.from && this.options.to) {\n      query.between(this.options.from, this.options.to);\n    }\n\n    return query;\n  },\n\n  /**\n   * Where Methods\n   */\n\n  setWhere: function (where, callback, context) {\n    this.options.where = (where && where.length) ? where : '1=1';\n\n    var oldSnapshot = [];\n    var newSnapshot = [];\n    var pendingRequests = 0;\n    var requestError = null;\n    var requestCallback = leaflet.Util.bind(function (error, featureCollection) {\n      if (error) {\n        requestError = error;\n      }\n\n      if (featureCollection) {\n        for (var i = featureCollection.features.length - 1; i >= 0; i--) {\n          newSnapshot.push(featureCollection.features[i].id);\n        }\n      }\n\n      pendingRequests--;\n\n      if (pendingRequests <= 0 && this._visibleZoom()) {\n        this._currentSnapshot = newSnapshot;\n        // schedule adding features for the next animation frame\n        leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {\n          this.removeLayers(oldSnapshot);\n          this.addLayers(newSnapshot);\n          if (callback) {\n            callback.call(context, requestError);\n          }\n        }, this));\n      }\n    }, this);\n\n    for (var i = this._currentSnapshot.length - 1; i >= 0; i--) {\n      oldSnapshot.push(this._currentSnapshot[i]);\n    }\n\n    for (var key in this._activeCells) {\n      pendingRequests++;\n      var coords = this._keyToCellCoords(key);\n      var bounds = this._cellCoordsToBounds(coords);\n      this._requestFeatures(bounds, key, requestCallback);\n    }\n\n    return this;\n  },\n\n  getWhere: function () {\n    return this.options.where;\n  },\n\n  /**\n   * Time Range Methods\n   */\n\n  getTimeRange: function () {\n    return [this.options.from, this.options.to];\n  },\n\n  setTimeRange: function (from, to, callback, context) {\n    var oldFrom = this.options.from;\n    var oldTo = this.options.to;\n    var pendingRequests = 0;\n    var requestError = null;\n    var requestCallback = leaflet.Util.bind(function (error) {\n      if (error) {\n        requestError = error;\n      }\n      this._filterExistingFeatures(oldFrom, oldTo, from, to);\n\n      pendingRequests--;\n\n      if (callback && pendingRequests <= 0) {\n        callback.call(context, requestError);\n      }\n    }, this);\n\n    this.options.from = from;\n    this.options.to = to;\n\n    this._filterExistingFeatures(oldFrom, oldTo, from, to);\n\n    if (this.options.timeFilterMode === 'server') {\n      for (var key in this._activeCells) {\n        pendingRequests++;\n        var coords = this._keyToCellCoords(key);\n        var bounds = this._cellCoordsToBounds(coords);\n        this._requestFeatures(bounds, key, requestCallback);\n      }\n    }\n\n    return this;\n  },\n\n  refresh: function () {\n    for (var key in this._activeCells) {\n      var coords = this._keyToCellCoords(key);\n      var bounds = this._cellCoordsToBounds(coords);\n      this._requestFeatures(bounds, key);\n    }\n\n    if (this.redraw) {\n      this.once('load', function () {\n        this.eachFeature(function (layer) {\n          this._redraw(layer.feature.id);\n        }, this);\n      }, this);\n    }\n  },\n\n  _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) {\n    var layersToRemove = (oldFrom && oldTo) ? this._getFeaturesInTimeRange(oldFrom, oldTo) : this._currentSnapshot;\n    var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo);\n\n    if (layersToAdd.indexOf) {\n      for (var i = 0; i < layersToAdd.length; i++) {\n        var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]);\n        if (shouldRemoveLayer >= 0) {\n          layersToRemove.splice(shouldRemoveLayer, 1);\n        }\n      }\n    }\n\n    // schedule adding features until the next animation frame\n    leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {\n      this.removeLayers(layersToRemove);\n      this.addLayers(layersToAdd);\n    }, this));\n  },\n\n  _getFeaturesInTimeRange: function (start, end) {\n    var ids = [];\n    var search;\n\n    if (this.options.timeField.start && this.options.timeField.end) {\n      var startTimes = this._startTimeIndex.between(start, end);\n      var endTimes = this._endTimeIndex.between(start, end);\n      search = startTimes.concat(endTimes);\n    } else {\n      search = this._timeIndex.between(start, end);\n    }\n\n    for (var i = search.length - 1; i >= 0; i--) {\n      ids.push(search[i].id);\n    }\n\n    return ids;\n  },\n\n  _buildTimeIndexes: function (geojson) {\n    var i;\n    var feature;\n    if (this.options.timeField.start && this.options.timeField.end) {\n      var startTimeEntries = [];\n      var endTimeEntries = [];\n      for (i = geojson.length - 1; i >= 0; i--) {\n        feature = geojson[i];\n        startTimeEntries.push({\n          id: feature.id,\n          value: new Date(feature.properties[this.options.timeField.start])\n        });\n        endTimeEntries.push({\n          id: feature.id,\n          value: new Date(feature.properties[this.options.timeField.end])\n        });\n      }\n      this._startTimeIndex.bulkAdd(startTimeEntries);\n      this._endTimeIndex.bulkAdd(endTimeEntries);\n    } else {\n      var timeEntries = [];\n      for (i = geojson.length - 1; i >= 0; i--) {\n        feature = geojson[i];\n        timeEntries.push({\n          id: feature.id,\n          value: new Date(feature.properties[this.options.timeField])\n        });\n      }\n\n      this._timeIndex.bulkAdd(timeEntries);\n    }\n  },\n\n  _featureWithinTimeRange: function (feature) {\n    if (!this.options.from || !this.options.to) {\n      return true;\n    }\n\n    var from = +this.options.from.valueOf();\n    var to = +this.options.to.valueOf();\n\n    if (typeof this.options.timeField === 'string') {\n      var date = +feature.properties[this.options.timeField];\n      return (date >= from) && (date <= to);\n    }\n\n    if (this.options.timeField.start && this.options.timeField.end) {\n      var startDate = +feature.properties[this.options.timeField.start];\n      var endDate = +feature.properties[this.options.timeField.end];\n      return ((startDate >= from) && (startDate <= to)) || ((endDate >= from) && (endDate <= to));\n    }\n  },\n\n  _visibleZoom: function () {\n    // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer\n    if (!this._map) {\n      return false;\n    }\n    var zoom = this._map.getZoom();\n    if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n      return false;\n    } else { return true; }\n  },\n\n  _handleZoomChange: function () {\n    if (!this._visibleZoom()) {\n      this.removeLayers(this._currentSnapshot);\n      this._currentSnapshot = [];\n    } else {\n      /*\n      for every cell in this._activeCells\n        1. Get the cache key for the coords of the cell\n        2. If this._cache[key] exists it will be an array of feature IDs.\n        3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back.\n      */\n      for (var i in this._activeCells) {\n        var coords = this._activeCells[i].coords;\n        var key = this._cacheKey(coords);\n        if (this._cache[key]) {\n          this.addLayers(this._cache[key]);\n        }\n      }\n    }\n  },\n\n  /**\n   * Service Methods\n   */\n\n  authenticate: function (token) {\n    this.service.authenticate(token);\n    return this;\n  },\n\n  metadata: function (callback, context) {\n    this.service.metadata(callback, context);\n    return this;\n  },\n\n  query: function () {\n    return this.service.query();\n  },\n\n  _getMetadata: function (callback) {\n    if (this._metadata) {\n      var error;\n      callback(error, this._metadata);\n    } else {\n      this.metadata(leaflet.Util.bind(function (error, response) {\n        this._metadata = response;\n        callback(error, this._metadata);\n      }, this));\n    }\n  },\n\n  addFeature: function (feature, callback, context) {\n    this._getMetadata(leaflet.Util.bind(function (error, metadata) {\n      if (error) {\n        if (callback) { callback.call(this, error, null); }\n        return;\n      }\n\n      this.service.addFeature(feature, leaflet.Util.bind(function (error, response) {\n        if (!error) {\n          // assign ID from result to appropriate objectid field from service metadata\n          feature.properties[metadata.objectIdField] = response.objectId;\n\n          // we also need to update the geojson id for createLayers() to function\n          feature.id = response.objectId;\n          this.createLayers([feature]);\n        }\n\n        if (callback) {\n          callback.call(context, error, response);\n        }\n      }, this));\n    }, this));\n  },\n\n  updateFeature: function (feature, callback, context) {\n    this.service.updateFeature(feature, function (error, response) {\n      if (!error) {\n        this.removeLayers([feature.id], true);\n        this.createLayers([feature]);\n      }\n\n      if (callback) {\n        callback.call(context, error, response);\n      }\n    }, this);\n  },\n\n  deleteFeature: function (id, callback, context) {\n    this.service.deleteFeature(id, function (error, response) {\n      if (!error && response.objectId) {\n        this.removeLayers([response.objectId], true);\n      }\n      if (callback) {\n        callback.call(context, error, response);\n      }\n    }, this);\n  },\n\n  deleteFeatures: function (ids, callback, context) {\n    return this.service.deleteFeatures(ids, function (error, response) {\n      if (!error && response.length > 0) {\n        for (var i = 0; i < response.length; i++) {\n          this.removeLayers([response[i].objectId], true);\n        }\n      }\n      if (callback) {\n        callback.call(context, error, response);\n      }\n    }, this);\n  }\n});\n\nvar FeatureLayer = FeatureManager.extend({\n\n  options: {\n    cacheLayers: true\n  },\n\n  /**\n   * Constructor\n   */\n  initialize: function (options) {\n    FeatureManager.prototype.initialize.call(this, options);\n    this._originalStyle = this.options.style;\n    this._layers = {};\n  },\n\n  /**\n   * Layer Interface\n   */\n\n  onRemove: function (map) {\n    for (var i in this._layers) {\n      map.removeLayer(this._layers[i]);\n      // trigger the event when the entire featureLayer is removed from the map\n      this.fire('removefeature', {\n        feature: this._layers[i].feature,\n        permanent: false\n      }, true);\n    }\n\n    return FeatureManager.prototype.onRemove.call(this, map);\n  },\n\n  createNewLayer: function (geojson) {\n    var layer = leaflet.GeoJSON.geometryToLayer(geojson, this.options);\n    layer.defaultOptions = layer.options;\n    return layer;\n  },\n\n  _updateLayer: function (layer, geojson) {\n    // convert the geojson coordinates into a Leaflet LatLng array/nested arrays\n    // pass it to setLatLngs to update layer geometries\n    var latlngs = [];\n    var coordsToLatLng = this.options.coordsToLatLng || leaflet.GeoJSON.coordsToLatLng;\n\n    // copy new attributes, if present\n    if (geojson.properties) {\n      layer.feature.properties = geojson.properties;\n    }\n\n    switch (geojson.geometry.type) {\n      case 'Point':\n        latlngs = leaflet.GeoJSON.coordsToLatLng(geojson.geometry.coordinates);\n        layer.setLatLng(latlngs);\n        break;\n      case 'LineString':\n        latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng);\n        layer.setLatLngs(latlngs);\n        break;\n      case 'MultiLineString':\n        latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);\n        layer.setLatLngs(latlngs);\n        break;\n      case 'Polygon':\n        latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);\n        layer.setLatLngs(latlngs);\n        break;\n      case 'MultiPolygon':\n        latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng);\n        layer.setLatLngs(latlngs);\n        break;\n    }\n  },\n\n  /**\n   * Feature Management Methods\n   */\n\n  createLayers: function (features) {\n    for (var i = features.length - 1; i >= 0; i--) {\n      var geojson = features[i];\n\n      var layer = this._layers[geojson.id];\n      var newLayer;\n\n      if (this._visibleZoom() && layer && !this._map.hasLayer(layer)) {\n        this._map.addLayer(layer);\n        this.fire('addfeature', {\n          feature: layer.feature\n        }, true);\n      }\n\n      // update geometry if necessary\n      if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) {\n        this._updateLayer(layer, geojson);\n      }\n\n      if (!layer) {\n        newLayer = this.createNewLayer(geojson);\n        newLayer.feature = geojson;\n\n        // bubble events from individual layers to the feature layer\n        newLayer.addEventParent(this);\n\n        if (this.options.onEachFeature) {\n          this.options.onEachFeature(newLayer.feature, newLayer);\n        }\n\n        // cache the layer\n        this._layers[newLayer.feature.id] = newLayer;\n\n        // style the layer\n        this.setFeatureStyle(newLayer.feature.id, this.options.style);\n\n        this.fire('createfeature', {\n          feature: newLayer.feature\n        }, true);\n\n        // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled\n        if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) {\n          this._map.addLayer(newLayer);\n        }\n      }\n    }\n  },\n\n  addLayers: function (ids) {\n    for (var i = ids.length - 1; i >= 0; i--) {\n      var layer = this._layers[ids[i]];\n      if (layer) {\n        this._map.addLayer(layer);\n      }\n    }\n  },\n\n  removeLayers: function (ids, permanent) {\n    for (var i = ids.length - 1; i >= 0; i--) {\n      var id = ids[i];\n      var layer = this._layers[id];\n      if (layer) {\n        this.fire('removefeature', {\n          feature: layer.feature,\n          permanent: permanent\n        }, true);\n        this._map.removeLayer(layer);\n      }\n      if (layer && permanent) {\n        delete this._layers[id];\n      }\n    }\n  },\n\n  cellEnter: function (bounds, coords) {\n    if (this._visibleZoom() && !this._zooming && this._map) {\n      leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {\n        var cacheKey = this._cacheKey(coords);\n        var cellKey = this._cellCoordsToKey(coords);\n        var layers = this._cache[cacheKey];\n        if (this._activeCells[cellKey] && layers) {\n          this.addLayers(layers);\n        }\n      }, this));\n    }\n  },\n\n  cellLeave: function (bounds, coords) {\n    if (!this._zooming) {\n      leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {\n        if (this._map) {\n          var cacheKey = this._cacheKey(coords);\n          var cellKey = this._cellCoordsToKey(coords);\n          var layers = this._cache[cacheKey];\n          var mapBounds = this._map.getBounds();\n          if (!this._activeCells[cellKey] && layers) {\n            var removable = true;\n\n            for (var i = 0; i < layers.length; i++) {\n              var layer = this._layers[layers[i]];\n              if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) {\n                removable = false;\n              }\n            }\n\n            if (removable) {\n              this.removeLayers(layers, !this.options.cacheLayers);\n            }\n\n            if (!this.options.cacheLayers && removable) {\n              delete this._cache[cacheKey];\n              delete this._cells[cellKey];\n              delete this._activeCells[cellKey];\n            }\n          }\n        }\n      }, this));\n    }\n  },\n\n  /**\n   * Styling Methods\n   */\n\n  resetStyle: function () {\n    this.options.style = this._originalStyle;\n    this.eachFeature(function (layer) {\n      this.resetFeatureStyle(layer.feature.id);\n    }, this);\n    return this;\n  },\n\n  setStyle: function (style) {\n    this.options.style = style;\n    this.eachFeature(function (layer) {\n      this.setFeatureStyle(layer.feature.id, style);\n    }, this);\n    return this;\n  },\n\n  resetFeatureStyle: function (id) {\n    var layer = this._layers[id];\n    var style = this._originalStyle || leaflet.Path.prototype.options;\n    if (layer) {\n      leaflet.Util.extend(layer.options, layer.defaultOptions);\n      this.setFeatureStyle(id, style);\n    }\n    return this;\n  },\n\n  setFeatureStyle: function (id, style) {\n    var layer = this._layers[id];\n    if (typeof style === 'function') {\n      style = style(layer.feature);\n    }\n    if (layer.setStyle) {\n      layer.setStyle(style);\n    }\n    return this;\n  },\n\n  /**\n   * Utility Methods\n   */\n\n  eachActiveFeature: function (fn, context) {\n    // figure out (roughly) which layers are in view\n    if (this._map) {\n      var activeBounds = this._map.getBounds();\n      for (var i in this._layers) {\n        if (this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) {\n          // a simple point in poly test for point geometries\n          if (typeof this._layers[i].getLatLng === 'function' && activeBounds.contains(this._layers[i].getLatLng())) {\n            fn.call(context, this._layers[i]);\n          } else if (typeof this._layers[i].getBounds === 'function' && activeBounds.intersects(this._layers[i].getBounds())) {\n            // intersecting bounds check for polyline and polygon geometries\n            fn.call(context, this._layers[i]);\n          }\n        }\n      }\n    }\n    return this;\n  },\n\n  eachFeature: function (fn, context) {\n    for (var i in this._layers) {\n      fn.call(context, this._layers[i]);\n    }\n    return this;\n  },\n\n  getFeature: function (id) {\n    return this._layers[id];\n  },\n\n  bringToBack: function () {\n    this.eachFeature(function (layer) {\n      if (layer.bringToBack) {\n        layer.bringToBack();\n      }\n    });\n  },\n\n  bringToFront: function () {\n    this.eachFeature(function (layer) {\n      if (layer.bringToFront) {\n        layer.bringToFront();\n      }\n    });\n  },\n\n  redraw: function (id) {\n    if (id) {\n      this._redraw(id);\n    }\n    return this;\n  },\n\n  _redraw: function (id) {\n    var layer = this._layers[id];\n    var geojson = layer.feature;\n\n    // if this looks like a marker\n    if (layer && layer.setIcon && this.options.pointToLayer) {\n      // update custom symbology, if necessary\n      if (this.options.pointToLayer) {\n        var getIcon = this.options.pointToLayer(geojson, leaflet.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));\n        var updatedIcon = getIcon.options.icon;\n        layer.setIcon(updatedIcon);\n      }\n    }\n\n    // looks like a vector marker (circleMarker)\n    if (layer && layer.setStyle && this.options.pointToLayer) {\n      var getStyle = this.options.pointToLayer(geojson, leaflet.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));\n      var updatedStyle = getStyle.options;\n      this.setFeatureStyle(geojson.id, updatedStyle);\n    }\n\n    // looks like a path (polygon/polyline)\n    if (layer && layer.setStyle && this.options.style) {\n      this.resetStyle(geojson.id);\n    }\n  }\n});\n\nfunction featureLayer (options) {\n  return new FeatureLayer(options);\n}\n\n// export version\n\nexports.VERSION = version;\nexports.Support = Support;\nexports.options = options;\nexports.Util = EsriUtil;\nexports.get = get;\nexports.post = xmlHttpPost;\nexports.request = request;\nexports.Task = Task;\nexports.task = task;\nexports.Query = Query;\nexports.query = query;\nexports.Find = Find;\nexports.find = find;\nexports.Identify = Identify;\nexports.identify = identify;\nexports.IdentifyFeatures = IdentifyFeatures;\nexports.identifyFeatures = identifyFeatures;\nexports.IdentifyImage = IdentifyImage;\nexports.identifyImage = identifyImage;\nexports.Service = Service;\nexports.service = service;\nexports.MapService = MapService;\nexports.mapService = mapService;\nexports.ImageService = ImageService;\nexports.imageService = imageService;\nexports.FeatureLayerService = FeatureLayerService;\nexports.featureLayerService = featureLayerService;\nexports.BasemapLayer = BasemapLayer;\nexports.basemapLayer = basemapLayer;\nexports.TiledMapLayer = TiledMapLayer;\nexports.tiledMapLayer = tiledMapLayer;\nexports.RasterLayer = RasterLayer;\nexports.ImageMapLayer = ImageMapLayer;\nexports.imageMapLayer = imageMapLayer;\nexports.DynamicMapLayer = DynamicMapLayer;\nexports.dynamicMapLayer = dynamicMapLayer;\nexports.FeatureManager = FeatureManager;\nexports.FeatureLayer = FeatureLayer;\nexports.featureLayer = featureLayer;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9zcmMvU3VwcG9ydC5qcyIsIi4uL3NyYy9PcHRpb25zLmpzIiwiLi4vc3JjL1JlcXVlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGVzcmkvYXJjZ2lzLXRvLWdlb2pzb24tdXRpbHMvaW5kZXguanMiLCIuLi9zcmMvVXRpbC5qcyIsIi4uL3NyYy9UYXNrcy9UYXNrLmpzIiwiLi4vc3JjL1Rhc2tzL1F1ZXJ5LmpzIiwiLi4vc3JjL1Rhc2tzL0ZpbmQuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnkuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnlGZWF0dXJlcy5qcyIsIi4uL3NyYy9UYXNrcy9JZGVudGlmeUltYWdlLmpzIiwiLi4vc3JjL1NlcnZpY2VzL1NlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9JbWFnZVNlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvRmVhdHVyZUxheWVyU2VydmljZS5qcyIsIi4uL3NyYy9MYXllcnMvQmFzZW1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9UaWxlZE1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9SYXN0ZXJMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvSW1hZ2VNYXBMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvRHluYW1pY01hcExheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtdmlydHVhbC1ncmlkL3NyYy92aXJ0dWFsLWdyaWQuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueS1iaW5hcnktc2VhcmNoL2luZGV4LmpzIiwiLi4vc3JjL0xheWVycy9GZWF0dXJlTGF5ZXIvRmVhdHVyZU1hbmFnZXIuanMiLCIuLi9zcmMvTGF5ZXJzL0ZlYXR1cmVMYXllci9GZWF0dXJlTGF5ZXIuanMiLCIuLi9zcmMvRXNyaUxlYWZsZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHZhciBjb3JzID0gKCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKSk7XG5leHBvcnQgdmFyIHBvaW50ZXJFdmVudHMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJyc7XG5cbmV4cG9ydCB2YXIgU3VwcG9ydCA9IHtcbiAgY29yczogY29ycyxcbiAgcG9pbnRlckV2ZW50czogcG9pbnRlckV2ZW50c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VwcG9ydDtcbiIsImV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcbiAgYXR0cmlidXRpb25XaWR0aE9mZnNldDogNTVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCJpbXBvcnQgeyBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3VwcG9ydCBmcm9tICcuL1N1cHBvcnQnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4vVXRpbCc7XG5cbnZhciBjYWxsYmFja3MgPSAwO1xuXG5mdW5jdGlvbiBzZXJpYWxpemUgKHBhcmFtcykge1xuICB2YXIgZGF0YSA9ICcnO1xuXG4gIHBhcmFtcy5mID0gcGFyYW1zLmYgfHwgJ2pzb24nO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1trZXldO1xuICAgICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocGFyYW0pO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgZGF0YSArPSAnJic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHZhbHVlID0gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbVswXSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSA/IEpTT04uc3RyaW5naWZ5KHBhcmFtKSA6IHBhcmFtLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJhbSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICB2YWx1ZSA9IHBhcmFtLnZhbHVlT2YoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGFyYW07XG4gICAgICB9XG5cbiAgICAgIGRhdGEgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0IChjYWxsYmFjaywgY29udGV4dCkge1xuICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgaHR0cFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgIG1lc3NhZ2U6ICdYTUxIdHRwUmVxdWVzdCBlcnJvcidcbiAgICAgIH1cbiAgICB9LCBudWxsKTtcbiAgfTtcblxuICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlO1xuICAgIHZhciBlcnJvcjtcblxuICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiBUaGlzIGNvdWxkIGFsc28gYmUgY2F1c2VkIGJ5IGEgQ09SUyBvciBYTUxIdHRwUmVxdWVzdCBlcnJvci4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVxdWVzdC5vbmVycm9yID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG4gICAgfVxuICB9O1xuXG4gIGh0dHBSZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9uZXJyb3IoKTtcbiAgfTtcblxuICByZXR1cm4gaHR0cFJlcXVlc3Q7XG59XG5cbmZ1bmN0aW9uIHhtbEh0dHBQb3N0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIGh0dHBSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdChjYWxsYmFjaywgY29udGV4dCk7XG4gIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuICBodHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Jyk7XG4gIGh0dHBSZXF1ZXN0LnNlbmQoc2VyaWFsaXplKHBhcmFtcykpO1xuXG4gIHJldHVybiBodHRwUmVxdWVzdDtcbn1cblxuZnVuY3Rpb24geG1sSHR0cEdldCAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwgKyAnPycgKyBzZXJpYWxpemUocGFyYW1zKSwgdHJ1ZSk7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZXh0ICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBodHRwUmVxdWVzdC50aW1lb3V0ID0gY29udGV4dC5vcHRpb25zLnRpbWVvdXQ7XG4gICAgfVxuICB9XG4gIGh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG4vLyBBSkFYIGhhbmRsZXJzIGZvciBDT1JTIChtb2Rlcm4gYnJvd3NlcnMpIG9yIEpTT05QIChvbGRlciBicm93c2VycylcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIHBhcmFtU3RyaW5nID0gc2VyaWFsaXplKHBhcmFtcyk7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICB2YXIgcmVxdWVzdExlbmd0aCA9ICh1cmwgKyAnPycgKyBwYXJhbVN0cmluZykubGVuZ3RoO1xuXG4gIC8vIGllMTAvMTEgcmVxdWlyZSB0aGUgcmVxdWVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgdGltZW91dCBpcyBhcHBsaWVkXG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgJz8nICsgcGFyYW1TdHJpbmcpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RMZW5ndGggPiAyMDAwICYmIFN1cHBvcnQuY29ycykge1xuICAgIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlcXVlc3QgaXMgbGVzcyB0aGFuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgQ09SUywgbWFrZSBHRVQgcmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0XG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTtcblxuICAvLyByZXF1ZXN0IGlzIG1vcmUgdGhhbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIENPUlMsIG1ha2UgUE9TVCByZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3RcbiAgfSBlbHNlIGlmIChyZXF1ZXN0TGVuZ3RoID4gMjAwMCAmJiBTdXBwb3J0LmNvcnMpIHtcbiAgICBodHRwUmVxdWVzdC5zZW5kKHBhcmFtU3RyaW5nKTtcblxuICAvLyByZXF1ZXN0IGlzIGxlc3MgIHRoYW4gMjAwMCBjaGFyYWN0ZXJzIGFuZCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIG1ha2UgYSBKU09OUCByZXF1ZXN0XG4gIH0gZWxzZSBpZiAocmVxdWVzdExlbmd0aCA8PSAyMDAwICYmICFTdXBwb3J0LmNvcnMpIHtcbiAgICByZXR1cm4ganNvbnAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAvLyByZXF1ZXN0IGlzIGxvbmdlciB0aGVuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBDT1JTLCBsb2cgYSB3YXJuaW5nXG4gIH0gZWxzZSB7XG4gICAgd2FybignYSByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHdhcyBsb25nZXIgdGhlbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoaXMgYnJvd3NlciBjYW5ub3QgbWFrZSBhIGNyb3NzLWRvbWFpbiBwb3N0IHJlcXVlc3QuIFBsZWFzZSB1c2UgYSBwcm94eSBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2FwaS1yZWZlcmVuY2UvcmVxdWVzdC5odG1sJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnAgKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICB3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzID0gd2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGNhbGxiYWNrSWQgPSAnYycgKyBjYWxsYmFja3M7XG4gIHBhcmFtcy5jYWxsYmFjayA9ICd3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzLicgKyBjYWxsYmFja0lkO1xuXG4gIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAod2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrc1tjYWxsYmFja0lkXSAhPT0gdHJ1ZSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgdmFyIHJlc3BvbnNlVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXNwb25zZSk7XG5cbiAgICAgIGlmICghKHJlc3BvbnNlVHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgcmVzcG9uc2VUeXBlID09PSAnW29iamVjdCBBcnJheV0nKSkge1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBKU09OUCByZXNwb25zZSdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvciAmJiByZXNwb25zZS5lcnJvcikge1xuICAgICAgICBlcnJvciA9IHJlc3BvbnNlO1xuICAgICAgICByZXNwb25zZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2NyaXB0ID0gRG9tVXRpbC5jcmVhdGUoJ3NjcmlwdCcsIG51bGwsIGRvY3VtZW50LmJvZHkpO1xuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICBzY3JpcHQuc3JjID0gdXJsICsgJz8nICsgc2VyaWFsaXplKHBhcmFtcyk7XG4gIHNjcmlwdC5pZCA9IGNhbGxiYWNrSWQ7XG4gIERvbVV0aWwuYWRkQ2xhc3Moc2NyaXB0LCAnZXNyaS1sZWFmbGV0LWpzb25wJyk7XG5cbiAgY2FsbGJhY2tzKys7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogY2FsbGJhY2tJZCxcbiAgICB1cmw6IHNjcmlwdC5zcmMsXG4gICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3MuX2NhbGxiYWNrW2NhbGxiYWNrSWRdKHtcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgYWJvcnRlZC4nXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBnZXQgPSAoKFN1cHBvcnQuY29ycykgPyB4bWxIdHRwR2V0IDoganNvbnApO1xuZ2V0LkNPUlMgPSB4bWxIdHRwR2V0O1xuZ2V0LkpTT05QID0ganNvbnA7XG5cbi8vIGNob29zZSB0aGUgY29ycmVjdCBBSkFYIGhhbmRsZXIgZGVwZW5kaW5nIG9uIENPUlMgc3VwcG9ydFxuZXhwb3J0IHsgZ2V0IH07XG5cbi8vIGFsd2F5cyB1c2UgWE1MSHR0cFJlcXVlc3QgZm9yIHBvc3RzXG5leHBvcnQgeyB4bWxIdHRwUG9zdCBhcyBwb3N0IH07XG5cbi8vIGV4cG9ydCB0aGUgUmVxdWVzdCBvYmplY3QgdG8gY2FsbCB0aGUgZGlmZmVyZW50IGhhbmRsZXJzIGZvciBkZWJ1Z2dpbmdcbmV4cG9ydCB2YXIgUmVxdWVzdCA9IHtcbiAgcmVxdWVzdDogcmVxdWVzdCxcbiAgZ2V0OiBnZXQsXG4gIHBvc3Q6IHhtbEh0dHBQb3N0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDE3IEVzcmlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gY2hlY2tzIGlmIDIgeCx5IHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIHBvaW50c0VxdWFsIChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBjaGVja3MgaWYgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBvZiBhIHJpbmcgYXJlIGVxdWFsIGFuZCBjbG9zZXMgdGhlIHJpbmdcbmZ1bmN0aW9uIGNsb3NlUmluZyAoY29vcmRpbmF0ZXMpIHtcbiAgaWYgKCFwb2ludHNFcXVhbChjb29yZGluYXRlc1swXSwgY29vcmRpbmF0ZXNbY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV0pKSB7XG4gICAgY29vcmRpbmF0ZXMucHVzaChjb29yZGluYXRlc1swXSk7XG4gIH1cbiAgcmV0dXJuIGNvb3JkaW5hdGVzO1xufVxuXG4vLyBkZXRlcm1pbmUgaWYgcG9seWdvbiByaW5nIGNvb3JkaW5hdGVzIGFyZSBjbG9ja3dpc2UuIGNsb2Nrd2lzZSBzaWduaWZpZXMgb3V0ZXIgcmluZywgY291bnRlci1jbG9ja3dpc2UgYW4gaW5uZXIgcmluZ1xuLy8gb3IgaG9sZS4gdGhpcyBsb2dpYyB3YXMgZm91bmQgYXQgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTY1NjQ3L2hvdy10by1kZXRlcm1pbmUtaWYtYS1saXN0LW9mLXBvbHlnb24tXG4vLyBwb2ludHMtYXJlLWluLWNsb2Nrd2lzZS1vcmRlclxuZnVuY3Rpb24gcmluZ0lzQ2xvY2t3aXNlIChyaW5nVG9UZXN0KSB7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJMZW5ndGggPSByaW5nVG9UZXN0Lmxlbmd0aDtcbiAgdmFyIHB0MSA9IHJpbmdUb1Rlc3RbaV07XG4gIHZhciBwdDI7XG4gIGZvciAoaTsgaSA8IHJMZW5ndGggLSAxOyBpKyspIHtcbiAgICBwdDIgPSByaW5nVG9UZXN0W2kgKyAxXTtcbiAgICB0b3RhbCArPSAocHQyWzBdIC0gcHQxWzBdKSAqIChwdDJbMV0gKyBwdDFbMV0pO1xuICAgIHB0MSA9IHB0MjtcbiAgfVxuICByZXR1cm4gKHRvdGFsID49IDApO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNTA0LUw1MTlcbmZ1bmN0aW9uIHZlcnRleEludGVyc2VjdHNWZXJ0ZXggKGExLCBhMiwgYjEsIGIyKSB7XG4gIHZhciB1YVQgPSAoKGIyWzBdIC0gYjFbMF0pICogKGExWzFdIC0gYjFbMV0pKSAtICgoYjJbMV0gLSBiMVsxXSkgKiAoYTFbMF0gLSBiMVswXSkpO1xuICB2YXIgdWJUID0gKChhMlswXSAtIGExWzBdKSAqIChhMVsxXSAtIGIxWzFdKSkgLSAoKGEyWzFdIC0gYTFbMV0pICogKGExWzBdIC0gYjFbMF0pKTtcbiAgdmFyIHVCID0gKChiMlsxXSAtIGIxWzFdKSAqIChhMlswXSAtIGExWzBdKSkgLSAoKGIyWzBdIC0gYjFbMF0pICogKGEyWzFdIC0gYTFbMV0pKTtcblxuICBpZiAodUIgIT09IDApIHtcbiAgICB2YXIgdWEgPSB1YVQgLyB1QjtcbiAgICB2YXIgdWIgPSB1YlQgLyB1QjtcblxuICAgIGlmICh1YSA+PSAwICYmIHVhIDw9IDEgJiYgdWIgPj0gMCAmJiB1YiA8PSAxKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLmpzIGh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL1RlcnJhZm9ybWVyL2Jsb2IvbWFzdGVyL3RlcnJhZm9ybWVyLmpzI0w1MjEtTDUzMVxuZnVuY3Rpb24gYXJyYXlJbnRlcnNlY3RzQXJyYXkgKGEsIGIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgIGlmICh2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4KGFbaV0sIGFbaSArIDFdLCBiW2pdLCBiW2ogKyAxXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNDcwLUw0ODBcbmZ1bmN0aW9uIGNvb3JkaW5hdGVzQ29udGFpblBvaW50IChjb29yZGluYXRlcywgcG9pbnQpIHtcbiAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSAtMSwgbCA9IGNvb3JkaW5hdGVzLmxlbmd0aCwgaiA9IGwgLSAxOyArK2kgPCBsOyBqID0gaSkge1xuICAgIGlmICgoKGNvb3JkaW5hdGVzW2ldWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbal1bMV0pIHx8XG4gICAgICAgICAoY29vcmRpbmF0ZXNbal1bMV0gPD0gcG9pbnRbMV0gJiYgcG9pbnRbMV0gPCBjb29yZGluYXRlc1tpXVsxXSkpICYmXG4gICAgICAgIChwb2ludFswXSA8ICgoKGNvb3JkaW5hdGVzW2pdWzBdIC0gY29vcmRpbmF0ZXNbaV1bMF0pICogKHBvaW50WzFdIC0gY29vcmRpbmF0ZXNbaV1bMV0pKSAvIChjb29yZGluYXRlc1tqXVsxXSAtIGNvb3JkaW5hdGVzW2ldWzFdKSkgKyBjb29yZGluYXRlc1tpXVswXSkpIHtcbiAgICAgIGNvbnRhaW5zID0gIWNvbnRhaW5zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGFpbnM7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMDYtTDExM1xuZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluQ29vcmRpbmF0ZXMgKG91dGVyLCBpbm5lcikge1xuICB2YXIgaW50ZXJzZWN0cyA9IGFycmF5SW50ZXJzZWN0c0FycmF5KG91dGVyLCBpbm5lcik7XG4gIHZhciBjb250YWlucyA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50KG91dGVyLCBpbm5lclswXSk7XG4gIGlmICghaW50ZXJzZWN0cyAmJiBjb250YWlucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZG8gYW55IHBvbHlnb25zIGluIHRoaXMgYXJyYXkgY29udGFpbiBhbnkgb3RoZXIgcG9seWdvbnMgaW4gdGhpcyBhcnJheT9cbi8vIHVzZWQgZm9yIGNoZWNraW5nIGZvciBob2xlcyBpbiBhcmNnaXMgcmluZ3Ncbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMTctTDE3MlxuZnVuY3Rpb24gY29udmVydFJpbmdzVG9HZW9KU09OIChyaW5ncykge1xuICB2YXIgb3V0ZXJSaW5ncyA9IFtdO1xuICB2YXIgaG9sZXMgPSBbXTtcbiAgdmFyIHg7IC8vIGl0ZXJhdG9yXG4gIHZhciBvdXRlclJpbmc7IC8vIGN1cnJlbnQgb3V0ZXIgcmluZyBiZWluZyBldmFsdWF0ZWRcbiAgdmFyIGhvbGU7IC8vIGN1cnJlbnQgaG9sZSBiZWluZyBldmFsdWF0ZWRcblxuICAvLyBmb3IgZWFjaCByaW5nXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3MubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgcmluZyA9IGNsb3NlUmluZyhyaW5nc1tyXS5zbGljZSgwKSk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGlzIHRoaXMgcmluZyBhbiBvdXRlciByaW5nPyBpcyBpdCBjbG9ja3dpc2U/XG4gICAgaWYgKHJpbmdJc0Nsb2Nrd2lzZShyaW5nKSkge1xuICAgICAgdmFyIHBvbHlnb24gPSBbIHJpbmcuc2xpY2UoKS5yZXZlcnNlKCkgXTsgLy8gd2luZCBvdXRlciByaW5ncyBjb3VudGVyY2xvY2t3aXNlIGZvciBSRkMgNzk0NiBjb21wbGlhbmNlXG4gICAgICBvdXRlclJpbmdzLnB1c2gocG9seWdvbik7IC8vIHB1c2ggdG8gb3V0ZXIgcmluZ3NcbiAgICB9IGVsc2Uge1xuICAgICAgaG9sZXMucHVzaChyaW5nLnNsaWNlKCkucmV2ZXJzZSgpKTsgLy8gd2luZCBpbm5lciByaW5ncyBjbG9ja3dpc2UgZm9yIFJGQyA3OTQ2IGNvbXBsaWFuY2VcbiAgICB9XG4gIH1cblxuICB2YXIgdW5jb250YWluZWRIb2xlcyA9IFtdO1xuXG4gIC8vIHdoaWxlIHRoZXJlIGFyZSBob2xlcyBsZWZ0Li4uXG4gIHdoaWxlIChob2xlcy5sZW5ndGgpIHtcbiAgICAvLyBwb3AgYSBob2xlIG9mZiBvdXQgc3RhY2tcbiAgICBob2xlID0gaG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgdGhleSBjb250YWluIG91ciBob2xlLlxuICAgIHZhciBjb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKHggPSBvdXRlclJpbmdzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICBvdXRlclJpbmcgPSBvdXRlclJpbmdzW3hdWzBdO1xuICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyUmluZywgaG9sZSkpIHtcbiAgICAgICAgLy8gdGhlIGhvbGUgaXMgY29udGFpbmVkIHB1c2ggaXQgaW50byBvdXIgcG9seWdvblxuICAgICAgICBvdXRlclJpbmdzW3hdLnB1c2goaG9sZSk7XG4gICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJpbmcgaXMgbm90IGNvbnRhaW5lZCBpbiBhbnkgb3V0ZXIgcmluZ1xuICAgIC8vIHNvbWV0aW1lcyB0aGlzIGhhcHBlbnMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0L2lzc3Vlcy8zMjBcbiAgICBpZiAoIWNvbnRhaW5lZCkge1xuICAgICAgdW5jb250YWluZWRIb2xlcy5wdXNoKGhvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGNvdWxkbid0IG1hdGNoIGFueSBob2xlcyB1c2luZyBjb250YWlucyB3ZSBjYW4gdHJ5IGludGVyc2VjdHMuLi5cbiAgd2hpbGUgKHVuY29udGFpbmVkSG9sZXMubGVuZ3RoKSB7XG4gICAgLy8gcG9wIGEgaG9sZSBvZmYgb3V0IHN0YWNrXG4gICAgaG9sZSA9IHVuY29udGFpbmVkSG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgYW55IGludGVyc2VjdCBvdXIgaG9sZS5cbiAgICB2YXIgaW50ZXJzZWN0cyA9IGZhbHNlO1xuXG4gICAgZm9yICh4ID0gb3V0ZXJSaW5ncy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nc1t4XVswXTtcbiAgICAgIGlmIChhcnJheUludGVyc2VjdHNBcnJheShvdXRlclJpbmcsIGhvbGUpKSB7XG4gICAgICAgIC8vIHRoZSBob2xlIGlzIGNvbnRhaW5lZCBwdXNoIGl0IGludG8gb3VyIHBvbHlnb25cbiAgICAgICAgb3V0ZXJSaW5nc1t4XS5wdXNoKGhvbGUpO1xuICAgICAgICBpbnRlcnNlY3RzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnNlY3RzKSB7XG4gICAgICBvdXRlclJpbmdzLnB1c2goW2hvbGUucmV2ZXJzZSgpXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dGVyUmluZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBvdXRlclJpbmdzWzBdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ011bHRpUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5nc1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgcmluZ3MgYXJlIG9yaWVudGVkIGluIHRoZSByaWdodCBkaXJlY3Rpb25zXG4vLyBvdXRlciByaW5ncyBhcmUgY2xvY2t3aXNlLCBob2xlcyBhcmUgY291bnRlcmNsb2Nrd2lzZVxuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gb3JpZW50UmluZ3MgKHBvbHkpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgcG9seWdvbiA9IHBvbHkuc2xpY2UoMCk7XG4gIHZhciBvdXRlclJpbmcgPSBjbG9zZVJpbmcocG9seWdvbi5zaGlmdCgpLnNsaWNlKDApKTtcbiAgaWYgKG91dGVyUmluZy5sZW5ndGggPj0gNCkge1xuICAgIGlmICghcmluZ0lzQ2xvY2t3aXNlKG91dGVyUmluZykpIHtcbiAgICAgIG91dGVyUmluZy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gob3V0ZXJSaW5nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhvbGUgPSBjbG9zZVJpbmcocG9seWdvbltpXS5zbGljZSgwKSk7XG4gICAgICBpZiAoaG9sZS5sZW5ndGggPj0gNCkge1xuICAgICAgICBpZiAocmluZ0lzQ2xvY2t3aXNlKGhvbGUpKSB7XG4gICAgICAgICAgaG9sZS5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goaG9sZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBtdWx0aXBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiBwb2x5Z29uc1xuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzIChyaW5ncykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcG9seWdvbiA9IG9yaWVudFJpbmdzKHJpbmdzW2ldKTtcbiAgICBmb3IgKHZhciB4ID0gcG9seWdvbi5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW3hdLnNsaWNlKDApO1xuICAgICAgb3V0cHV0LnB1c2gocmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8vIHNoYWxsb3cgb2JqZWN0IGNsb25lIGZvciBmZWF0dXJlIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbi8vIGZyb20gaHR0cDovL2pzcGVyZi5jb20vY2xvbmluZy1hbi1vYmplY3QvMlxuZnVuY3Rpb24gc2hhbGxvd0Nsb25lIChvYmopIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gZ2V0SWQgKGF0dHJpYnV0ZXMsIGlkQXR0cmlidXRlKSB7XG4gIHZhciBrZXlzID0gaWRBdHRyaWJ1dGUgPyBbaWRBdHRyaWJ1dGUsICdPQkpFQ1RJRCcsICdGSUQnXSA6IFsnT0JKRUNUSUQnLCAnRklEJ107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChcbiAgICAgIGtleSBpbiBhdHRyaWJ1dGVzICYmXG4gICAgICAodHlwZW9mIGF0dHJpYnV0ZXNba2V5XSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIGF0dHJpYnV0ZXNba2V5XSA9PT0gJ251bWJlcicpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlc1trZXldO1xuICAgIH1cbiAgfVxuICB0aHJvdyBFcnJvcignTm8gdmFsaWQgaWQgYXR0cmlidXRlIGZvdW5kJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyaWJ1dGUpIHtcbiAgdmFyIGdlb2pzb24gPSB7fTtcblxuICBpZiAodHlwZW9mIGFyY2dpcy54ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYXJjZ2lzLnkgPT09ICdudW1iZXInKSB7XG4gICAgZ2VvanNvbi50eXBlID0gJ1BvaW50JztcbiAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gW2FyY2dpcy54LCBhcmNnaXMueV07XG4gICAgaWYgKHR5cGVvZiBhcmNnaXMueiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMucHVzaChhcmNnaXMueik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyY2dpcy5wb2ludHMpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGFyY2dpcy5wb2ludHMuc2xpY2UoMCk7XG4gIH1cblxuICBpZiAoYXJjZ2lzLnBhdGhzKSB7XG4gICAgaWYgKGFyY2dpcy5wYXRocy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGdlb2pzb24udHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHNbMF0uc2xpY2UoMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlb2pzb24udHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGFyY2dpcy5wYXRocy5zbGljZSgwKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJjZ2lzLnJpbmdzKSB7XG4gICAgZ2VvanNvbiA9IGNvbnZlcnRSaW5nc1RvR2VvSlNPTihhcmNnaXMucmluZ3Muc2xpY2UoMCkpO1xuICB9XG5cbiAgaWYgKGFyY2dpcy5nZW9tZXRyeSB8fCBhcmNnaXMuYXR0cmlidXRlcykge1xuICAgIGdlb2pzb24udHlwZSA9ICdGZWF0dXJlJztcbiAgICBnZW9qc29uLmdlb21ldHJ5ID0gKGFyY2dpcy5nZW9tZXRyeSkgPyBhcmNnaXNUb0dlb0pTT04oYXJjZ2lzLmdlb21ldHJ5KSA6IG51bGw7XG4gICAgZ2VvanNvbi5wcm9wZXJ0aWVzID0gKGFyY2dpcy5hdHRyaWJ1dGVzKSA/IHNoYWxsb3dDbG9uZShhcmNnaXMuYXR0cmlidXRlcykgOiBudWxsO1xuICAgIGlmIChhcmNnaXMuYXR0cmlidXRlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2VvanNvbi5pZCA9IGdldElkKGFyY2dpcy5hdHRyaWJ1dGVzLCBpZEF0dHJpYnV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gZG9uJ3Qgc2V0IGFuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgbm8gdmFsaWQgZ2VvbWV0cnkgd2FzIGVuY291bnRlcmVkXG4gIGlmIChKU09OLnN0cmluZ2lmeShnZW9qc29uLmdlb21ldHJ5KSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pKSB7XG4gICAgZ2VvanNvbi5nZW9tZXRyeSA9IG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgYXJjZ2lzLnNwYXRpYWxSZWZlcmVuY2UgJiZcbiAgICBhcmNnaXMuc3BhdGlhbFJlZmVyZW5jZS53a2lkICYmXG4gICAgYXJjZ2lzLnNwYXRpYWxSZWZlcmVuY2Uud2tpZCAhPT0gNDMyNlxuICApIHtcbiAgICBjb25zb2xlLndhcm4oJ09iamVjdCBjb252ZXJ0ZWQgaW4gbm9uLXN0YW5kYXJkIGNycyAtICcgKyBKU09OLnN0cmluZ2lmeShhcmNnaXMuc3BhdGlhbFJlZmVyZW5jZSkpO1xuICB9XG5cbiAgcmV0dXJuIGdlb2pzb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cmlidXRlKSB7XG4gIGlkQXR0cmlidXRlID0gaWRBdHRyaWJ1dGUgfHwgJ09CSkVDVElEJztcbiAgdmFyIHNwYXRpYWxSZWZlcmVuY2UgPSB7IHdraWQ6IDQzMjYgfTtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaTtcblxuICBzd2l0Y2ggKGdlb2pzb24udHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgIHJlc3VsdC54ID0gZ2VvanNvbi5jb29yZGluYXRlc1swXTtcbiAgICAgIHJlc3VsdC55ID0gZ2VvanNvbi5jb29yZGluYXRlc1sxXTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpUG9pbnQnOlxuICAgICAgcmVzdWx0LnBvaW50cyA9IGdlb2pzb24uY29vcmRpbmF0ZXMuc2xpY2UoMCk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdMaW5lU3RyaW5nJzpcbiAgICAgIHJlc3VsdC5wYXRocyA9IFtnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApXTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICByZXN1bHQucGF0aHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICByZXN1bHQucmluZ3MgPSBvcmllbnRSaW5ncyhnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApKTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICByZXN1bHQucmluZ3MgPSBmbGF0dGVuTXVsdGlQb2x5Z29uUmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGZWF0dXJlJzpcbiAgICAgIGlmIChnZW9qc29uLmdlb21ldHJ5KSB7XG4gICAgICAgIHJlc3VsdC5nZW9tZXRyeSA9IGdlb2pzb25Ub0FyY0dJUyhnZW9qc29uLmdlb21ldHJ5LCBpZEF0dHJpYnV0ZSk7XG4gICAgICB9XG4gICAgICByZXN1bHQuYXR0cmlidXRlcyA9IChnZW9qc29uLnByb3BlcnRpZXMpID8gc2hhbGxvd0Nsb25lKGdlb2pzb24ucHJvcGVydGllcykgOiB7fTtcbiAgICAgIGlmIChnZW9qc29uLmlkKSB7XG4gICAgICAgIHJlc3VsdC5hdHRyaWJ1dGVzW2lkQXR0cmlidXRlXSA9IGdlb2pzb24uaWQ7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGZWF0dXJlQ29sbGVjdGlvbic6XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGdlb2pzb25Ub0FyY0dJUyhnZW9qc29uLmZlYXR1cmVzW2ldLCBpZEF0dHJpYnV0ZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnR2VvbWV0cnlDb2xsZWN0aW9uJzpcbiAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5nZW9tZXRyaWVzW2ldLCBpZEF0dHJpYnV0ZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB7IGFyY2dpc1RvR2VvSlNPTjogYXJjZ2lzVG9HZW9KU09OLCBnZW9qc29uVG9BcmNHSVM6IGdlb2pzb25Ub0FyY0dJUyB9O1xuIiwiaW1wb3J0IHsgbGF0TG5nLCBsYXRMbmdCb3VuZHMsIExhdExuZywgTGF0TG5nQm91bmRzLCBVdGlsLCBEb21VdGlsLCBHZW9KU09OIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBqc29ucCB9IGZyb20gJy4vUmVxdWVzdCc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9PcHRpb25zJztcblxuaW1wb3J0IHtcbiAgZ2VvanNvblRvQXJjR0lTIGFzIGcyYSxcbiAgYXJjZ2lzVG9HZW9KU09OIGFzIGEyZ1xufSBmcm9tICdAZXNyaS9hcmNnaXMtdG8tZ2VvanNvbi11dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cikge1xuICByZXR1cm4gZzJhKGdlb2pzb24sIGlkQXR0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyKSB7XG4gIHJldHVybiBhMmcoYXJjZ2lzLCBpZEF0dHIpO1xufVxuXG4vLyBjb252ZXJ0IGFuIGV4dGVudCAoQXJjR0lTKSB0byBMYXRMbmdCb3VuZHMgKExlYWZsZXQpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW50VG9Cb3VuZHMgKGV4dGVudCkge1xuICAvLyBcIk5hTlwiIGNvb3JkaW5hdGVzIGZyb20gQXJjR0lTIFNlcnZlciBpbmRpY2F0ZSBhIG51bGwgZ2VvbWV0cnlcbiAgaWYgKGV4dGVudC54bWluICE9PSAnTmFOJyAmJiBleHRlbnQueW1pbiAhPT0gJ05hTicgJiYgZXh0ZW50LnhtYXggIT09ICdOYU4nICYmIGV4dGVudC55bWF4ICE9PSAnTmFOJykge1xuICAgIHZhciBzdyA9IGxhdExuZyhleHRlbnQueW1pbiwgZXh0ZW50LnhtaW4pO1xuICAgIHZhciBuZSA9IGxhdExuZyhleHRlbnQueW1heCwgZXh0ZW50LnhtYXgpO1xuICAgIHJldHVybiBsYXRMbmdCb3VuZHMoc3csIG5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBjb252ZXJ0IGFuIExhdExuZ0JvdW5kcyAoTGVhZmxldCkgdG8gZXh0ZW50IChBcmNHSVMpXG5leHBvcnQgZnVuY3Rpb24gYm91bmRzVG9FeHRlbnQgKGJvdW5kcykge1xuICBib3VuZHMgPSBsYXRMbmdCb3VuZHMoYm91bmRzKTtcbiAgcmV0dXJuIHtcbiAgICAneG1pbic6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsXG4gICAgJ3ltaW4nOiBib3VuZHMuZ2V0U291dGhXZXN0KCkubGF0LFxuICAgICd4bWF4JzogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxuZyxcbiAgICAneW1heCc6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiB7XG4gICAgICAnd2tpZCc6IDQzMjZcbiAgICB9XG4gIH07XG59XG5cbnZhciBrbm93bkZpZWxkTmFtZXMgPSAvXihPQkpFQ1RJRHxGSUR8T0lEfElEKSQvaTtcblxuLy8gQXR0ZW1wdHMgdG8gZmluZCB0aGUgSUQgRmllbGQgZnJvbSByZXNwb25zZVxuZXhwb3J0IGZ1bmN0aW9uIF9maW5kSWRBdHRyaWJ1dGVGcm9tUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gIHZhciByZXN1bHQ7XG5cbiAgaWYgKHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lKSB7XG4gICAgLy8gRmluZCBJZCBGaWVsZCBkaXJlY3RseVxuICAgIHJlc3VsdCA9IHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmZpZWxkcykge1xuICAgIC8vIEZpbmQgSUQgRmllbGQgYmFzZWQgb24gZmllbGQgdHlwZVxuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IHJlc3BvbnNlLmZpZWxkcy5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgIGlmIChyZXNwb25zZS5maWVsZHNbal0udHlwZSA9PT0gJ2VzcmlGaWVsZFR5cGVPSUQnKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmZpZWxkc1tqXS5uYW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIC8vIElmIG5vIGZpZWxkIHdhcyBtYXJrZWQgYXMgYmVpbmcgdGhlIGVzcmlGaWVsZFR5cGVPSUQgdHJ5IHdlbGwga25vd24gZmllbGQgbmFtZXNcbiAgICAgIGZvciAoaiA9IDA7IGogPD0gcmVzcG9uc2UuZmllbGRzLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgICBpZiAocmVzcG9uc2UuZmllbGRzW2pdLm5hbWUubWF0Y2goa25vd25GaWVsZE5hbWVzKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmZpZWxkc1tqXS5uYW1lO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFRoaXMgaXMgdGhlICdsYXN0JyByZXNvcnQsIGZpbmQgdGhlIElkIGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCBmZWF0dXJlXG5leHBvcnQgZnVuY3Rpb24gX2ZpbmRJZEF0dHJpYnV0ZUZyb21GZWF0dXJlIChmZWF0dXJlKSB7XG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLmF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoa2V5Lm1hdGNoKGtub3duRmllbGROYW1lcykpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gKHJlc3BvbnNlLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgb2JqZWN0SWRGaWVsZDtcbiAgdmFyIGZlYXR1cmVzID0gcmVzcG9uc2UuZmVhdHVyZXMgfHwgcmVzcG9uc2UucmVzdWx0cztcbiAgdmFyIGNvdW50ID0gZmVhdHVyZXMubGVuZ3RoO1xuXG4gIGlmIChpZEF0dHJpYnV0ZSkge1xuICAgIG9iamVjdElkRmllbGQgPSBpZEF0dHJpYnV0ZTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RJZEZpZWxkID0gX2ZpbmRJZEF0dHJpYnV0ZUZyb21SZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSB7XG4gICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICBmZWF0dXJlczogW11cbiAgfTtcblxuICBpZiAoY291bnQpIHtcbiAgICBmb3IgKHZhciBpID0gZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmZWF0dXJlID0gYXJjZ2lzVG9HZW9KU09OKGZlYXR1cmVzW2ldLCBvYmplY3RJZEZpZWxkIHx8IF9maW5kSWRBdHRyaWJ1dGVGcm9tRmVhdHVyZShmZWF0dXJlc1tpXSkpO1xuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb247XG59XG5cbiAgLy8gdHJpbSB1cmwgd2hpdGVzcGFjZSBhbmQgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwgKHVybCkge1xuICAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcywgYnV0IG5vdCBzcGFjZXMgaW5zaWRlIHRoZSB1cmxcbiAgdXJsID0gVXRpbC50cmltKHVybCk7XG5cbiAgLy8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8gdGhlIHVybCBpZiB0aGUgdXNlciBvbWl0dGVkIGl0XG4gIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICB1cmwgKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuLyogRXh0cmFjdCB1cmwgcGFyYW1zIGlmIGFueSBhbmQgc3RvcmUgdGhlbSBpbiByZXF1ZXN0UGFyYW1zIGF0dHJpYnV0ZS5cbiAgIFJldHVybiB0aGUgb3B0aW9ucyBwYXJhbXMgdXBkYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtcyAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucy51cmwuaW5kZXhPZignPycpICE9PSAtMSkge1xuICAgIG9wdGlvbnMucmVxdWVzdFBhcmFtcyA9IG9wdGlvbnMucmVxdWVzdFBhcmFtcyB8fCB7fTtcbiAgICB2YXIgcXVlcnlTdHJpbmcgPSBvcHRpb25zLnVybC5zdWJzdHJpbmcob3B0aW9ucy51cmwuaW5kZXhPZignPycpICsgMSk7XG4gICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybC5zcGxpdCgnPycpWzBdO1xuICAgIG9wdGlvbnMucmVxdWVzdFBhcmFtcyA9IEpTT04ucGFyc2UoJ3tcIicgKyBkZWNvZGVVUkkocXVlcnlTdHJpbmcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC8mL2csICdcIixcIicpLnJlcGxhY2UoLz0vZywgJ1wiOlwiJykgKyAnXCJ9Jyk7XG4gIH1cbiAgb3B0aW9ucy51cmwgPSBjbGVhblVybChvcHRpb25zLnVybC5zcGxpdCgnPycpWzBdKTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FyY2dpc09ubGluZSAodXJsKSB7XG4gIC8qIGhvc3RlZCBmZWF0dXJlIHNlcnZpY2VzIHN1cHBvcnQgZ2VvanNvbiBhcyBhbiBvdXRwdXQgZm9ybWF0XG4gIHV0aWxpdHkuYXJjZ2lzLmNvbSBzZXJ2aWNlcyBhcmUgcHJveGllZCBmcm9tIGEgdmFyaWV0eSBvZiBBcmNHSVMgU2VydmVyIHZpbnRhZ2VzLCBhbmQgbWF5IG5vdCAqL1xuICByZXR1cm4gKC9eKD8hLip1dGlsaXR5XFwuYXJjZ2lzXFwuY29tKS4qXFwuYXJjZ2lzXFwuY29tLipGZWF0dXJlU2VydmVyL2kpLnRlc3QodXJsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlb2pzb25UeXBlVG9BcmNHSVMgKGdlb0pzb25UeXBlKSB7XG4gIHZhciBhcmNnaXNHZW9tZXRyeVR5cGU7XG4gIHN3aXRjaCAoZ2VvSnNvblR5cGUpIHtcbiAgICBjYXNlICdQb2ludCc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9pbnQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTXVsdGlQb2ludCc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5TXVsdGlwb2ludCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdMaW5lU3RyaW5nJzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2x5bGluZSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlsaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlnb24nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2x5Z29uJztcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGFyY2dpc0dlb21ldHJ5VHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm4gKCkge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY0F0dHJpYnV0aW9uV2lkdGggKG1hcCkge1xuICAvLyBlaXRoZXIgY3JvcCBhdCA1NXB4IG9yIHVzZXIgZGVmaW5lZCBidWZmZXJcbiAgcmV0dXJuIChtYXAuZ2V0U2l6ZSgpLnggLSBvcHRpb25zLmF0dHJpYnV0aW9uV2lkdGhPZmZzZXQpICsgJ3B4Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEVzcmlBdHRyaWJ1dGlvbiAobWFwKSB7XG4gIGlmIChtYXAuYXR0cmlidXRpb25Db250cm9sICYmICFtYXAuYXR0cmlidXRpb25Db250cm9sLl9lc3JpQXR0cmlidXRpb25BZGRlZCkge1xuICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuc2V0UHJlZml4KCc8YSBocmVmPVwiaHR0cDovL2xlYWZsZXRqcy5jb21cIiB0aXRsZT1cIkEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwc1wiPkxlYWZsZXQ8L2E+IHwgUG93ZXJlZCBieSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuZXNyaS5jb21cIj5Fc3JpPC9hPicpO1xuXG4gICAgdmFyIGhvdmVyQXR0cmlidXRpb25TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgaG92ZXJBdHRyaWJ1dGlvblN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgIGhvdmVyQXR0cmlidXRpb25TdHlsZS5pbm5lckhUTUwgPSAnLmVzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uOmhvdmVyIHsnICtcbiAgICAgICd3aGl0ZS1zcGFjZTogbm9ybWFsOycgK1xuICAgICd9JztcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoaG92ZXJBdHRyaWJ1dGlvblN0eWxlKTtcbiAgICBEb21VdGlsLmFkZENsYXNzKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lciwgJ2VzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uOmhvdmVyJyk7XG5cbiAgICAvLyBkZWZpbmUgYSBuZXcgY3NzIGNsYXNzIGluIEpTIHRvIHRyaW0gYXR0cmlidXRpb24gaW50byBhIHNpbmdsZSBsaW5lXG4gICAgdmFyIGF0dHJpYnV0aW9uU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGF0dHJpYnV0aW9uU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgYXR0cmlidXRpb25TdHlsZS5pbm5lckhUTUwgPSAnLmVzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uIHsnICtcbiAgICAgICd2ZXJ0aWNhbC1hbGlnbjogLTNweDsnICtcbiAgICAgICd3aGl0ZS1zcGFjZTogbm93cmFwOycgK1xuICAgICAgJ292ZXJmbG93OiBoaWRkZW47JyArXG4gICAgICAndGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7JyArXG4gICAgICAnZGlzcGxheTogaW5saW5lLWJsb2NrOycgK1xuICAgICAgJ3RyYW5zaXRpb246IDBzIHdoaXRlLXNwYWNlOycgK1xuICAgICAgJ3RyYW5zaXRpb24tZGVsYXk6IDFzOycgK1xuICAgICAgJ21heC13aWR0aDogJyArIGNhbGNBdHRyaWJ1dGlvbldpZHRoKG1hcCkgKyAnOycgK1xuICAgICd9JztcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoYXR0cmlidXRpb25TdHlsZSk7XG4gICAgRG9tVXRpbC5hZGRDbGFzcyhtYXAuYXR0cmlidXRpb25Db250cm9sLl9jb250YWluZXIsICdlc3JpLXRydW5jYXRlZC1hdHRyaWJ1dGlvbicpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSB3aWR0aCB1c2VkIHRvIHRydW5jYXRlIHdoZW4gdGhlIG1hcCBpdHNlbGYgaXMgcmVzaXplZFxuICAgIG1hcC5vbigncmVzaXplJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCA9IGNhbGNBdHRyaWJ1dGlvbldpZHRoKGUudGFyZ2V0KTtcbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSBpbmplY3RlZCBzY3JpcHRzIGFuZCBzdHlsZSB0YWdzXG4gICAgbWFwLm9uKCd1bmxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBob3ZlckF0dHJpYnV0aW9uU3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChob3ZlckF0dHJpYnV0aW9uU3R5bGUpO1xuICAgICAgYXR0cmlidXRpb25TdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGF0dHJpYnV0aW9uU3R5bGUpO1xuICAgICAgdmFyIG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVzcmktbGVhZmxldC1qc29ucCcpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBub2RlTGlzdC5pdGVtKGkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZUxpc3QuaXRlbShpKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLl9lc3JpQXR0cmlidXRpb25BZGRlZCA9IHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9zZXRHZW9tZXRyeSAoZ2VvbWV0cnkpIHtcbiAgdmFyIHBhcmFtcyA9IHtcbiAgICBnZW9tZXRyeTogbnVsbCxcbiAgICBnZW9tZXRyeVR5cGU6IG51bGxcbiAgfTtcblxuICAvLyBjb252ZXJ0IGJvdW5kcyB0byBleHRlbnQgYW5kIGZpbmlzaFxuICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAvLyBzZXQgZ2VvbWV0cnkgKyBnZW9tZXRyeVR5cGVcbiAgICBwYXJhbXMuZ2VvbWV0cnkgPSBib3VuZHNUb0V4dGVudChnZW9tZXRyeSk7XG4gICAgcGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlFbnZlbG9wZSc7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8vIGNvbnZlcnQgTC5NYXJrZXIgPiBMLkxhdExuZ1xuICBpZiAoZ2VvbWV0cnkuZ2V0TGF0TG5nKSB7XG4gICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXRMbmcoKTtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgTC5MYXRMbmcgdG8gYSBnZW9qc29uIHBvaW50IGFuZCBjb250aW51ZTtcbiAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgTGF0TG5nKSB7XG4gICAgZ2VvbWV0cnkgPSB7XG4gICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgY29vcmRpbmF0ZXM6IFtnZW9tZXRyeS5sbmcsIGdlb21ldHJ5LmxhdF1cbiAgICB9O1xuICB9XG5cbiAgLy8gaGFuZGxlIEwuR2VvSlNPTiwgcHVsbCBvdXQgdGhlIGZpcnN0IGdlb21ldHJ5XG4gIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEdlb0pTT04pIHtcbiAgICAvLyByZWFzc2lnbiBnZW9tZXRyeSB0byB0aGUgR2VvSlNPTiB2YWx1ZSAgKHdlIGFyZSBhc3N1bWluZyB0aGF0IG9ubHkgb25lIGZlYXR1cmUgaXMgcHJlc2VudClcbiAgICBnZW9tZXRyeSA9IGdlb21ldHJ5LmdldExheWVycygpWzBdLmZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgcGFyYW1zLmdlb21ldHJ5ID0gZ2VvanNvblRvQXJjR0lTKGdlb21ldHJ5KTtcbiAgICBwYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBMLlBvbHlsaW5lIGFuZCBMLlBvbHlnb25cbiAgaWYgKGdlb21ldHJ5LnRvR2VvSlNPTikge1xuICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkudG9HZW9KU09OKCk7XG4gIH1cblxuICAvLyBoYW5kbGUgR2VvSlNPTiBmZWF0dXJlIGJ5IHB1bGxpbmcgb3V0IHRoZSBnZW9tZXRyeVxuICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgLy8gZ2V0IHRoZSBnZW9tZXRyeSBvZiB0aGUgZ2VvanNvbiBmZWF0dXJlXG4gICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZW9tZXRyeTtcbiAgfVxuXG4gIC8vIGNvbmZpcm0gdGhhdCBvdXIgR2VvSlNPTiBpcyBhIHBvaW50LCBsaW5lIG9yIHBvbHlnb25cbiAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgIHBhcmFtcy5nZW9tZXRyeSA9IGdlb2pzb25Ub0FyY0dJUyhnZW9tZXRyeSk7XG4gICAgcGFyYW1zLmdlb21ldHJ5VHlwZSA9IGdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8vIHdhcm4gdGhlIHVzZXIgaWYgd2UgaGF2bid0IGZvdW5kIGFuIGFwcHJvcHJpYXRlIG9iamVjdFxuICB3YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCB0byBzcGF0aWFsIHF1ZXJ5LiBTaG91bGQgYmUgTC5MYXRMbmcsIEwuTGF0TG5nQm91bmRzLCBMLk1hcmtlciBvciBhIEdlb0pTT04gUG9pbnQsIExpbmUsIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIG9iamVjdCcpO1xuXG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBdHRyaWJ1dGlvbkRhdGEgKHVybCwgbWFwKSB7XG4gIGpzb25wKHVybCwge30sIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGF0dHJpYnV0aW9ucykge1xuICAgIGlmIChlcnJvcikgeyByZXR1cm47IH1cbiAgICBtYXAuX2VzcmlBdHRyaWJ1dGlvbnMgPSBbXTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGF0dHJpYnV0aW9ucy5jb250cmlidXRvcnMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHZhciBjb250cmlidXRvciA9IGF0dHJpYnV0aW9ucy5jb250cmlidXRvcnNbY107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY292ZXJhZ2VBcmVhID0gY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhc1tpXTtcbiAgICAgICAgdmFyIHNvdXRoV2VzdCA9IGxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFswXSwgY292ZXJhZ2VBcmVhLmJib3hbMV0pO1xuICAgICAgICB2YXIgbm9ydGhFYXN0ID0gbGF0TG5nKGNvdmVyYWdlQXJlYS5iYm94WzJdLCBjb3ZlcmFnZUFyZWEuYmJveFszXSk7XG4gICAgICAgIG1hcC5fZXNyaUF0dHJpYnV0aW9ucy5wdXNoKHtcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogY29udHJpYnV0b3IuYXR0cmlidXRpb24sXG4gICAgICAgICAgc2NvcmU6IGNvdmVyYWdlQXJlYS5zY29yZSxcbiAgICAgICAgICBib3VuZHM6IGxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCksXG4gICAgICAgICAgbWluWm9vbTogY292ZXJhZ2VBcmVhLnpvb21NaW4sXG4gICAgICAgICAgbWF4Wm9vbTogY292ZXJhZ2VBcmVhLnpvb21NYXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwLl9lc3JpQXR0cmlidXRpb25zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBiLnNjb3JlIC0gYS5zY29yZTtcbiAgICB9KTtcblxuICAgIC8vIHBhc3MgdGhlIHNhbWUgYXJndW1lbnQgYXMgdGhlIG1hcCdzICdtb3ZlZW5kJyBldmVudFxuICAgIHZhciBvYmogPSB7IHRhcmdldDogbWFwIH07XG4gICAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKG9iaik7XG4gIH0sIHRoaXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF91cGRhdGVNYXBBdHRyaWJ1dGlvbiAoZXZ0KSB7XG4gIHZhciBtYXAgPSBldnQudGFyZ2V0O1xuICB2YXIgb2xkQXR0cmlidXRpb25zID0gbWFwLl9lc3JpQXR0cmlidXRpb25zO1xuXG4gIGlmIChtYXAgJiYgbWFwLmF0dHJpYnV0aW9uQ29udHJvbCAmJiBvbGRBdHRyaWJ1dGlvbnMpIHtcbiAgICB2YXIgbmV3QXR0cmlidXRpb25zID0gJyc7XG4gICAgdmFyIGJvdW5kcyA9IG1hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgd3JhcHBlZEJvdW5kcyA9IGxhdExuZ0JvdW5kcyhcbiAgICAgIGJvdW5kcy5nZXRTb3V0aFdlc3QoKS53cmFwKCksXG4gICAgICBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkud3JhcCgpXG4gICAgKTtcbiAgICB2YXIgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sZEF0dHJpYnV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGF0dHJpYnV0aW9uID0gb2xkQXR0cmlidXRpb25zW2ldO1xuICAgICAgdmFyIHRleHQgPSBhdHRyaWJ1dGlvbi5hdHRyaWJ1dGlvbjtcblxuICAgICAgaWYgKCFuZXdBdHRyaWJ1dGlvbnMubWF0Y2godGV4dCkgJiYgYXR0cmlidXRpb24uYm91bmRzLmludGVyc2VjdHMod3JhcHBlZEJvdW5kcykgJiYgem9vbSA+PSBhdHRyaWJ1dGlvbi5taW5ab29tICYmIHpvb20gPD0gYXR0cmlidXRpb24ubWF4Wm9vbSkge1xuICAgICAgICBuZXdBdHRyaWJ1dGlvbnMgKz0gKCcsICcgKyB0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdBdHRyaWJ1dGlvbnMgPSBuZXdBdHRyaWJ1dGlvbnMuc3Vic3RyKDIpO1xuICAgIHZhciBhdHRyaWJ1dGlvbkVsZW1lbnQgPSBtYXAuYXR0cmlidXRpb25Db250cm9sLl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLmVzcmktZHluYW1pYy1hdHRyaWJ1dGlvbicpO1xuXG4gICAgYXR0cmlidXRpb25FbGVtZW50LmlubmVySFRNTCA9IG5ld0F0dHJpYnV0aW9ucztcbiAgICBhdHRyaWJ1dGlvbkVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBjYWxjQXR0cmlidXRpb25XaWR0aChtYXApO1xuXG4gICAgbWFwLmZpcmUoJ2F0dHJpYnV0aW9udXBkYXRlZCcsIHtcbiAgICAgIGF0dHJpYnV0aW9uOiBuZXdBdHRyaWJ1dGlvbnNcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIEVzcmlVdGlsID0ge1xuICB3YXJuOiB3YXJuLFxuICBjbGVhblVybDogY2xlYW5VcmwsXG4gIGdldFVybFBhcmFtczogZ2V0VXJsUGFyYW1zLFxuICBpc0FyY2dpc09ubGluZTogaXNBcmNnaXNPbmxpbmUsXG4gIGdlb2pzb25UeXBlVG9BcmNHSVM6IGdlb2pzb25UeXBlVG9BcmNHSVMsXG4gIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbjogcmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uLFxuICBnZW9qc29uVG9BcmNHSVM6IGdlb2pzb25Ub0FyY0dJUyxcbiAgYXJjZ2lzVG9HZW9KU09OOiBhcmNnaXNUb0dlb0pTT04sXG4gIGJvdW5kc1RvRXh0ZW50OiBib3VuZHNUb0V4dGVudCxcbiAgZXh0ZW50VG9Cb3VuZHM6IGV4dGVudFRvQm91bmRzLFxuICBjYWxjQXR0cmlidXRpb25XaWR0aDogY2FsY0F0dHJpYnV0aW9uV2lkdGgsXG4gIHNldEVzcmlBdHRyaWJ1dGlvbjogc2V0RXNyaUF0dHJpYnV0aW9uLFxuICBfc2V0R2VvbWV0cnk6IF9zZXRHZW9tZXRyeSxcbiAgX2dldEF0dHJpYnV0aW9uRGF0YTogX2dldEF0dHJpYnV0aW9uRGF0YSxcbiAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBfdXBkYXRlTWFwQXR0cmlidXRpb24sXG4gIF9maW5kSWRBdHRyaWJ1dGVGcm9tRmVhdHVyZTogX2ZpbmRJZEF0dHJpYnV0ZUZyb21GZWF0dXJlLFxuICBfZmluZElkQXR0cmlidXRlRnJvbVJlc3BvbnNlOiBfZmluZElkQXR0cmlidXRlRnJvbVJlc3BvbnNlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBFc3JpVXRpbDtcbiIsImltcG9ydCB7IENsYXNzLCBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge2NvcnN9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgY2xlYW5VcmwsIGdldFVybFBhcmFtcyB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vUmVxdWVzdCc7XG5cbmV4cG9ydCB2YXIgVGFzayA9IENsYXNzLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHByb3h5OiBmYWxzZSxcbiAgICB1c2VDb3JzOiBjb3JzXG4gIH0sXG5cbiAgLy8gR2VuZXJhdGUgYSBtZXRob2QgZm9yIGVhY2ggbWV0aG9kTmFtZTpwYXJhbU5hbWUgaW4gdGhlIHNldHRlcnMgZm9yIHRoaXMgdGFzay5cbiAgZ2VuZXJhdGVTZXR0ZXI6IGZ1bmN0aW9uIChwYXJhbSwgY29udGV4dCkge1xuICAgIHJldHVybiBVdGlsLmJpbmQoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmFtc1twYXJhbV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChlbmRwb2ludCkge1xuICAgIC8vIGVuZHBvaW50IGNhbiBiZSBlaXRoZXIgYSB1cmwgKGFuZCBvcHRpb25zKSBmb3IgYW4gQXJjR0lTIFJlc3QgU2VydmljZSBvciBhbiBpbnN0YW5jZSBvZiBFc3JpTGVhZmxldC5TZXJ2aWNlXG4gICAgaWYgKGVuZHBvaW50LnJlcXVlc3QgJiYgZW5kcG9pbnQub3B0aW9ucykge1xuICAgICAgdGhpcy5fc2VydmljZSA9IGVuZHBvaW50O1xuICAgICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIGVuZHBvaW50Lm9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBVdGlsLnNldE9wdGlvbnModGhpcywgZW5kcG9pbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLnVybCA9IGNsZWFuVXJsKGVuZHBvaW50LnVybCk7XG4gICAgfVxuXG4gICAgLy8gY2xvbmUgZGVmYXVsdCBwYXJhbXMgaW50byB0aGlzIG9iamVjdFxuICAgIHRoaXMucGFyYW1zID0gVXRpbC5leHRlbmQoe30sIHRoaXMucGFyYW1zIHx8IHt9KTtcblxuICAgIC8vIGdlbmVyYXRlIHNldHRlciBtZXRob2RzIGJhc2VkIG9uIHRoZSBzZXR0ZXJzIG9iamVjdCBpbXBsaW1lbnRlZCBhIGNoaWxkIGNsYXNzXG4gICAgaWYgKHRoaXMuc2V0dGVycykge1xuICAgICAgZm9yICh2YXIgc2V0dGVyIGluIHRoaXMuc2V0dGVycykge1xuICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnNldHRlcnNbc2V0dGVyXTtcbiAgICAgICAgdGhpc1tzZXR0ZXJdID0gdGhpcy5nZW5lcmF0ZVNldHRlcihwYXJhbSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRva2VuOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodGhpcy5fc2VydmljZSkge1xuICAgICAgdGhpcy5fc2VydmljZS5hdXRoZW50aWNhdGUodG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtcy50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBBcmNHSVMgU2VydmVyIEZpbmQvSWRlbnRpZnkgMTAuNStcbiAgZm9ybWF0OiBmdW5jdGlvbiAoYm9vbGVhbikge1xuICAgIC8vIHVzZSBkb3VibGUgbmVnYXRpdmUgdG8gZXhwb3NlIGEgbW9yZSBpbnR1aXRpdmUgcG9zaXRpdmUgbWV0aG9kIG5hbWVcbiAgICB0aGlzLnBhcmFtcy5yZXR1cm5VbmZvcm1hdHRlZFZhbHVlcyA9ICFib29sZWFuO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlcXVlc3Q6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmVxdWVzdFBhcmFtcykge1xuICAgICAgVXRpbC5leHRlbmQodGhpcy5wYXJhbXMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdyZXF1ZXN0JywgdGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIF9yZXF1ZXN0OiBmdW5jdGlvbiAobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICByZXR1cm4gUmVxdWVzdC5nZXQuSlNPTlAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVxdWVzdFttZXRob2RdKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFzayAob3B0aW9ucykge1xuICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFRhc2sob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRhc2s7XG4iLCJpbXBvcnQgeyBwb2ludCwgbGF0TG5nIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcbmltcG9ydCB7XG4gIHdhcm4sXG4gIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbixcbiAgaXNBcmNnaXNPbmxpbmUsXG4gIGV4dGVudFRvQm91bmRzLFxuICBfc2V0R2VvbWV0cnlcbn0gZnJvbSAnLi4vVXRpbCc7XG5cbmV4cG9ydCB2YXIgUXVlcnkgPSBUYXNrLmV4dGVuZCh7XG4gIHNldHRlcnM6IHtcbiAgICAnb2Zmc2V0JzogJ3Jlc3VsdE9mZnNldCcsXG4gICAgJ2xpbWl0JzogJ3Jlc3VsdFJlY29yZENvdW50JyxcbiAgICAnZmllbGRzJzogJ291dEZpZWxkcycsXG4gICAgJ3ByZWNpc2lvbic6ICdnZW9tZXRyeVByZWNpc2lvbicsXG4gICAgJ2ZlYXR1cmVJZHMnOiAnb2JqZWN0SWRzJyxcbiAgICAncmV0dXJuR2VvbWV0cnknOiAncmV0dXJuR2VvbWV0cnknLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICd0cmFuc2Zvcm0nOiAnZGF0dW1UcmFuc2Zvcm1hdGlvbicsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdxdWVyeScsXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIG91dFNyOiA0MzI2LFxuICAgIG91dEZpZWxkczogJyonXG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZSBzZWFyY2ggZ2VvbWV0cnkuIFZhbGlkIGZvciBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnlQYXJhbXMoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxDb250YWlucyc7IC8vIHRvIHRoZSBSRVNUIGFwaSB0aGlzIHJlYWRzIGdlb21ldHJ5ICoqY29udGFpbnMqKiBsYXllclxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIGFueSBzcGF0aWFsIHJlbGF0aW9uc2hpcCBpcyBmb3VuZC4gQXBwbGllcyB0byBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIGludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5UGFyYW1zKGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIHdob2xseSBjb250YWlucyB0aGUgc2VhcmNoIGdlb21ldHJ5LiBWYWxpZCBmb3IgYWxsIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjb250YWluczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnlQYXJhbXMoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxXaXRoaW4nOyAvLyB0byB0aGUgUkVTVCBhcGkgdGhpcyByZWFkcyBnZW9tZXRyeSAqKndpdGhpbioqIGxheWVyXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaW50ZXJpb3JzIG9mIHRoZSB0d28gc2hhcGVzIGlzIG5vdCBlbXB0eSBhbmQgaGFzIGEgbG93ZXIgZGltZW5zaW9uIHRoYW4gdGhlIG1heGltdW0gZGltZW5zaW9uIG9mIHRoZSB0d28gc2hhcGVzLiBUd28gbGluZXMgdGhhdCBzaGFyZSBhbiBlbmRwb2ludCBpbiBjb21tb24gZG8gbm90IGNyb3NzLiBWYWxpZCBmb3IgTGluZS9MaW5lLCBMaW5lL0FyZWEsIE11bHRpLXBvaW50L0FyZWEsIGFuZCBNdWx0aS1wb2ludC9MaW5lIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjcm9zc2VzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbENyb3NzZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSB0d28gc2hhcGVzIHNoYXJlIGEgY29tbW9uIGJvdW5kYXJ5LiBIb3dldmVyLCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbnRlcmlvcnMgb2YgdGhlIHR3byBzaGFwZXMgbXVzdCBiZSBlbXB0eS4gSW4gdGhlIFBvaW50L0xpbmUgY2FzZSwgdGhlIHBvaW50IG1heSB0b3VjaCBhbiBlbmRwb2ludCBvbmx5IG9mIHRoZSBsaW5lLiBBcHBsaWVzIHRvIGFsbCBjb21iaW5hdGlvbnMgZXhjZXB0IFBvaW50L1BvaW50LlxuICB0b3VjaGVzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbFRvdWNoZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzaGFwZXMgcmVzdWx0cyBpbiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgZGltZW5zaW9uLCBidXQgZGlmZmVyZW50IGZyb20gYm90aCBvZiB0aGUgc2hhcGVzLiBBcHBsaWVzIHRvIEFyZWEvQXJlYSwgTGluZS9MaW5lLCBhbmQgTXVsdGktcG9pbnQvTXVsdGktcG9pbnQgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIG92ZXJsYXBzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbE92ZXJsYXBzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgZmVhdHVyZSBpZiB0aGUgZW52ZWxvcGUgb2YgdGhlIHR3byBzaGFwZXMgaW50ZXJzZWN0cy5cbiAgYmJveEludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5UGFyYW1zKGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsRW52ZWxvcGVJbnRlcnNlY3RzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBpZiBzb21lb25lIGNhbiBoZWxwIGRlY2lwaGVyIHRoZSBBcmNPYmplY3RzIGV4cGxhbmF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gcGxhaW4gc3BlYWssIHdlIHNob3VsZCBtZW50aW9uIHRoaXMgbWV0aG9kIGluIHRoZSBkb2NcbiAgaW5kZXhJbnRlcnNlY3RzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbEluZGV4SW50ZXJzZWN0cyc7IC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBlbnZlbG9wZSBvZiB0aGUgcXVlcnkgZ2VvbWV0cnkgaW50ZXJzZWN0cyB0aGUgaW5kZXggZW50cnkgZm9yIHRoZSB0YXJnZXQgZ2VvbWV0cnlcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBGZWF0dXJlIFNlcnZpY2VzIHJ1bm5pbmcgb24gQXJjR0lTIFNlcnZlciAxMC4zKyBvciBBcmNHSVMgT25saW5lXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF07XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgdGhpcy5wYXJhbXMudW5pdHMgPSAnZXNyaVNSVW5pdF9NZXRlcic7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSByYWRpdXM7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgd2hlcmU6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAvLyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgZG91YmxlLXF1b3RlcyB0byBzaW5nbGUgcXVvdGVzLCBwYXNzIGFzIGlzLCBhbmQgcHJvdmlkZSBhIG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZSBpZiBhIDQwMCBpcyBlbmNvdW50ZXJlZFxuICAgIHRoaXMucGFyYW1zLndoZXJlID0gc3RyaW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIG9yZGVyID0gb3JkZXIgfHwgJ0FTQyc7XG4gICAgdGhpcy5wYXJhbXMub3JkZXJCeUZpZWxkcyA9ICh0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzKSA/IHRoaXMucGFyYW1zLm9yZGVyQnlGaWVsZHMgKyAnLCcgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzICs9IChbZmllbGROYW1lLCBvcmRlcl0pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG5cbiAgICAvLyBzZXJ2aWNlcyBob3N0ZWQgb24gQXJjR0lTIE9ubGluZSBhbmQgQXJjR0lTIFNlcnZlciAxMC4zLjErIHN1cHBvcnQgcmVxdWVzdGluZyBnZW9qc29uIGRpcmVjdGx5XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc01vZGVybiB8fCBpc0FyY2dpc09ubGluZSh0aGlzLm9wdGlvbnMudXJsKSkge1xuICAgICAgdGhpcy5wYXJhbXMuZiA9ICdnZW9qc29uJztcblxuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX3RyYXBTUUxlcnJvcnMoZXJyb3IpO1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG5cbiAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCBpbiB0aGUgY2FsbGJhY2sgdGhlbiBwYXNzIGl0IG9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl90cmFwU1FMZXJyb3JzKGVycm9yKTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY291bnQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIChyZXNwb25zZSAmJiByZXNwb25zZS5jb3VudCksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpZHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0SWRzKSwgcmVzcG9uc2UpO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIEZlYXR1cmUgU2VydmljZXMgcnVubmluZyBvbiBBcmNHSVMgU2VydmVyIDEwLjMrIG9yIEFyY0dJUyBPbmxpbmVcbiAgYm91bmRzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9jbGVhblBhcmFtcygpO1xuICAgIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4dGVudCAmJiBleHRlbnRUb0JvdW5kcyhyZXNwb25zZS5leHRlbnQpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIGV4dGVudFRvQm91bmRzKHJlc3BvbnNlLmV4dGVudCksIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0ge1xuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIEJvdW5kcydcbiAgICAgICAgfTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGRpc3RpbmN0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZ2VvbWV0cnkgbXVzdCBiZSBvbWl0dGVkIGZvciBxdWVyaWVzIHJlcXVlc3RpbmcgZGlzdGluY3QgdmFsdWVzXG4gICAgdGhpcy5wYXJhbXMucmV0dXJuR2VvbWV0cnkgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmFtcy5yZXR1cm5EaXN0aW5jdFZhbHVlcyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gb25seSB2YWxpZCBmb3IgaW1hZ2Ugc2VydmljZXNcbiAgcGl4ZWxTaXplOiBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICB2YXIgY2FzdFBvaW50ID0gcG9pbnQocmF3UG9pbnQpO1xuICAgIHRoaXMucGFyYW1zLnBpeGVsU2l6ZSA9IFtjYXN0UG9pbnQueCwgY2FzdFBvaW50LnldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIG1hcCBzZXJ2aWNlc1xuICBsYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgdGhpcy5wYXRoID0gbGF5ZXIgKyAnL3F1ZXJ5JztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBfdHJhcFNRTGVycm9yczogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJzQwMCcpIHtcbiAgICAgICAgd2Fybignb25lIGNvbW1vbiBzeW50YXggZXJyb3IgaW4gcXVlcnkgcmVxdWVzdHMgaXMgZW5jYXNpbmcgc3RyaW5nIHZhbHVlcyBpbiBkb3VibGUgcXVvdGVzIGluc3RlYWQgb2Ygc2luZ2xlIHF1b3RlcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfY2xlYW5QYXJhbXM6IGZ1bmN0aW9uICgpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seTtcbiAgICBkZWxldGUgdGhpcy5wYXJhbXMucmV0dXJuRXh0ZW50T25seTtcbiAgICBkZWxldGUgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5O1xuICB9LFxuXG4gIF9zZXRHZW9tZXRyeVBhcmFtczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgdmFyIGNvbnZlcnRlZCA9IF9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBjb252ZXJ0ZWQuZ2VvbWV0cnk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gY29udmVydGVkLmdlb21ldHJ5VHlwZTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUXVlcnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHF1ZXJ5O1xuIiwiaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGaW5kID0gVGFzay5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgLy8gbWV0aG9kIG5hbWUgPiBwYXJhbSBuYW1lXG4gICAgJ2NvbnRhaW5zJzogJ2NvbnRhaW5zJyxcbiAgICAndGV4dCc6ICdzZWFyY2hUZXh0JyxcbiAgICAnZmllbGRzJzogJ3NlYXJjaEZpZWxkcycsIC8vIGRlbm90ZSBhbiBhcnJheSBvciBzaW5nbGUgc3RyaW5nXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiAnc3InLFxuICAgICdzcic6ICdzcicsXG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ21heEFsbG93YWJsZU9mZnNldCc6ICdtYXhBbGxvd2FibGVPZmZzZXQnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICdkeW5hbWljTGF5ZXJzJzogJ2R5bmFtaWNMYXllcnMnLFxuICAgICdyZXR1cm5aJzogJ3JldHVyblonLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICdnZGJWZXJzaW9uJzogJ2dkYlZlcnNpb24nLFxuICAgIC8vIHNraXBwZWQgaW1wbGVtZW50aW5nIHRoaXMgKGZvciBub3cpIGJlY2F1c2UgdGhlIFJFU1Qgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpc250IGNvbnNpc3RlbnQgYmV0d2VlbiBvcGVyYXRpb25zXG4gICAgLy8gJ3RyYW5zZm9ybSc6ICdkYXR1bVRyYW5zZm9ybWF0aW9ucycsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdmaW5kJyxcblxuICBwYXJhbXM6IHtcbiAgICBzcjogNDMyNixcbiAgICBjb250YWluczogdHJ1ZSxcbiAgICByZXR1cm5HZW9tZXRyeTogdHJ1ZSxcbiAgICByZXR1cm5aOiB0cnVlLFxuICAgIHJldHVybk06IGZhbHNlXG4gIH0sXG5cbiAgbGF5ZXJEZWZzOiBmdW5jdGlvbiAoaWQsIHdoZXJlKSB7XG4gICAgdGhpcy5wYXJhbXMubGF5ZXJEZWZzID0gKHRoaXMucGFyYW1zLmxheWVyRGVmcykgPyB0aGlzLnBhcmFtcy5sYXllckRlZnMgKyAnOycgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgKz0gKFtpZCwgd2hlcmVdKS5qb2luKCc6Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgc2ltcGxpZnk6IGZ1bmN0aW9uIChtYXAsIGZhY3Rvcikge1xuICAgIHZhciBtYXBXaWR0aCA9IE1hdGguYWJzKG1hcC5nZXRCb3VuZHMoKS5nZXRXZXN0KCkgLSBtYXAuZ2V0Qm91bmRzKCkuZ2V0RWFzdCgpKTtcbiAgICB0aGlzLnBhcmFtcy5tYXhBbGxvd2FibGVPZmZzZXQgPSAobWFwV2lkdGggLyBtYXAuZ2V0U2l6ZSgpLnkpICogZmFjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlKSksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmluZChvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZDtcbiIsImltcG9ydCB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5ID0gVGFzay5leHRlbmQoe1xuICBwYXRoOiAnaWRlbnRpZnknLFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5O1xuIiwiaW1wb3J0IHsgbGF0TG5nIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBJZGVudGlmeSB9IGZyb20gJy4vSWRlbnRpZnknO1xuaW1wb3J0IHsgcmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uLFxuICBib3VuZHNUb0V4dGVudCxcbiAgX3NldEdlb21ldHJ5XG59IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5RmVhdHVyZXMgPSBJZGVudGlmeS5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICd0b2xlcmFuY2UnOiAndG9sZXJhbmNlJyxcbiAgICAvLyBza2lwcGVkIGltcGxlbWVudGluZyB0aGlzIChmb3Igbm93KSBiZWNhdXNlIHRoZSBSRVNUIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gaXNudCBjb25zaXN0ZW50IGJldHdlZW4gb3BlcmF0aW9ucy5cbiAgICAvLyAndHJhbnNmb3JtJzogJ2RhdHVtVHJhbnNmb3JtYXRpb25zJ1xuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeSdcbiAgfSxcblxuICBwYXJhbXM6IHtcbiAgICBzcjogNDMyNixcbiAgICBsYXllcnM6ICdhbGwnLFxuICAgIHRvbGVyYW5jZTogMyxcbiAgICByZXR1cm5HZW9tZXRyeTogdHJ1ZVxuICB9LFxuXG4gIG9uOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdmFyIGV4dGVudCA9IGJvdW5kc1RvRXh0ZW50KG1hcC5nZXRCb3VuZHMoKSk7XG4gICAgdmFyIHNpemUgPSBtYXAuZ2V0U2l6ZSgpO1xuICAgIHRoaXMucGFyYW1zLmltYWdlRGlzcGxheSA9IFtzaXplLngsIHNpemUueSwgOTZdO1xuICAgIHRoaXMucGFyYW1zLm1hcEV4dGVudCA9IFtleHRlbnQueG1pbiwgZXh0ZW50LnltaW4sIGV4dGVudC54bWF4LCBleHRlbnQueW1heF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYXQ6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIC8vIGNhc3QgbGF0LCBsb25nIHBhaXJzIGluIHJhdyBhcnJheSBmb3JtIG1hbnVhbGx5XG4gICAgaWYgKGdlb21ldHJ5Lmxlbmd0aCA9PT0gMikge1xuICAgICAgZ2VvbWV0cnkgPSBsYXRMbmcoZ2VvbWV0cnkpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbGF5ZXJEZWY6IGZ1bmN0aW9uIChpZCwgd2hlcmUpIHtcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgPSAodGhpcy5wYXJhbXMubGF5ZXJEZWZzKSA/IHRoaXMucGFyYW1zLmxheWVyRGVmcyArICc7JyA6ICcnO1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyArPSAoW2lkLCB3aGVyZV0pLmpvaW4oJzonKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzaW1wbGlmeTogZnVuY3Rpb24gKG1hcCwgZmFjdG9yKSB7XG4gICAgdmFyIG1hcFdpZHRoID0gTWF0aC5hYnMobWFwLmdldEJvdW5kcygpLmdldFdlc3QoKSAtIG1hcC5nZXRCb3VuZHMoKS5nZXRFYXN0KCkpO1xuICAgIHRoaXMucGFyYW1zLm1heEFsbG93YWJsZU9mZnNldCA9IChtYXBXaWR0aCAvIG1hcC5nZXRTaXplKCkueSkgKiBmYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IGludm9rZSB3aXRoIGFuIGVycm9yXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgdW5kZWZpbmVkLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gb2sgbm8gZXJyb3IgbGV0cyBqdXN0IGFzc3VtZSB3ZSBoYXZlIGZlYXR1cmVzLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IHJlc3BvbnNlLnJlc3VsdHNbaV0ubGF5ZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHVuZGVmaW5lZCwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBfc2V0R2VvbWV0cnlQYXJhbXM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHZhciBjb252ZXJ0ZWQgPSBfc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5ID0gY29udmVydGVkLmdlb21ldHJ5O1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9IGNvbnZlcnRlZC5nZW9tZXRyeVR5cGU7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlGZWF0dXJlcyAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IElkZW50aWZ5RmVhdHVyZXMob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5RmVhdHVyZXM7XG4iLCJpbXBvcnQgeyBsYXRMbmcgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IElkZW50aWZ5IH0gZnJvbSAnLi9JZGVudGlmeSc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBJZGVudGlmeUltYWdlID0gSWRlbnRpZnkuZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdzZXRNb3NhaWNSdWxlJzogJ21vc2FpY1J1bGUnLFxuICAgICdzZXRSZW5kZXJpbmdSdWxlJzogJ3JlbmRlcmluZ1J1bGUnLFxuICAgICdzZXRQaXhlbFNpemUnOiAncGl4ZWxTaXplJyxcbiAgICAncmV0dXJuQ2F0YWxvZ0l0ZW1zJzogJ3JldHVybkNhdGFsb2dJdGVtcycsXG4gICAgJ3JldHVybkdlb21ldHJ5JzogJ3JldHVybkdlb21ldHJ5J1xuICB9LFxuXG4gIHBhcmFtczoge1xuICAgIHJldHVybkdlb21ldHJ5OiBmYWxzZVxuICB9LFxuXG4gIGF0OiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB4OiBsYXRsbmcubG5nLFxuICAgICAgeTogbGF0bG5nLmxhdCxcbiAgICAgIHNwYXRpYWxSZWZlcmVuY2U6IHtcbiAgICAgICAgd2tpZDogNDMyNlxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TW9zYWljUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5tb3NhaWNSdWxlO1xuICB9LFxuXG4gIGdldFJlbmRlcmluZ1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMucmVuZGVyaW5nUnVsZTtcbiAgfSxcblxuICBnZXRQaXhlbFNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMucGl4ZWxTaXplO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgdGhpcy5fcmVzcG9uc2VUb0dlb0pTT04ocmVzcG9uc2UpKSwgcmVzcG9uc2UpO1xuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIC8vIGdldCBwaXhlbCBkYXRhIGFuZCByZXR1cm4gYXMgZ2VvSlNPTiBwb2ludFxuICAvLyBwb3B1bGF0ZSBjYXRhbG9nIGl0ZW1zIChpZiBhbnkpXG4gIC8vIG1lcmdpbmcgaW4gYW55IGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzIGFzIGEgcHJvcGVyeSBvZiBlYWNoIGZlYXR1cmVcbiAgX3Jlc3BvbnNlVG9HZW9KU09OOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgbG9jYXRpb24gPSByZXNwb25zZS5sb2NhdGlvbjtcbiAgICB2YXIgY2F0YWxvZ0l0ZW1zID0gcmVzcG9uc2UuY2F0YWxvZ0l0ZW1zO1xuICAgIHZhciBjYXRhbG9nSXRlbVZpc2liaWxpdGllcyA9IHJlc3BvbnNlLmNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzO1xuICAgIHZhciBnZW9KU09OID0ge1xuICAgICAgJ3BpeGVsJzoge1xuICAgICAgICAndHlwZSc6ICdGZWF0dXJlJyxcbiAgICAgICAgJ2dlb21ldHJ5Jzoge1xuICAgICAgICAgICd0eXBlJzogJ1BvaW50JyxcbiAgICAgICAgICAnY29vcmRpbmF0ZXMnOiBbbG9jYXRpb24ueCwgbG9jYXRpb24ueV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2Nycyc6IHtcbiAgICAgICAgICAndHlwZSc6ICdFUFNHJyxcbiAgICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICdjb2RlJzogbG9jYXRpb24uc3BhdGlhbFJlZmVyZW5jZS53a2lkXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnT0JKRUNUSUQnOiByZXNwb25zZS5vYmplY3RJZCxcbiAgICAgICAgICAnbmFtZSc6IHJlc3BvbnNlLm5hbWUsXG4gICAgICAgICAgJ3ZhbHVlJzogcmVzcG9uc2UudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2lkJzogcmVzcG9uc2Uub2JqZWN0SWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHJlc3BvbnNlLnByb3BlcnRpZXMgJiYgcmVzcG9uc2UucHJvcGVydGllcy5WYWx1ZXMpIHtcbiAgICAgIGdlb0pTT04ucGl4ZWwucHJvcGVydGllcy52YWx1ZXMgPSByZXNwb25zZS5wcm9wZXJ0aWVzLlZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoY2F0YWxvZ0l0ZW1zICYmIGNhdGFsb2dJdGVtcy5mZWF0dXJlcykge1xuICAgICAgZ2VvSlNPTi5jYXRhbG9nSXRlbXMgPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24oY2F0YWxvZ0l0ZW1zKTtcbiAgICAgIGlmIChjYXRhbG9nSXRlbVZpc2liaWxpdGllcyAmJiBjYXRhbG9nSXRlbVZpc2liaWxpdGllcy5sZW5ndGggPT09IGdlb0pTT04uY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKHZhciBpID0gY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBnZW9KU09OLmNhdGFsb2dJdGVtcy5mZWF0dXJlc1tpXS5wcm9wZXJ0aWVzLmNhdGFsb2dJdGVtVmlzaWJpbGl0eSA9IGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZW9KU09OO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlJbWFnZSAocGFyYW1zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnlJbWFnZShwYXJhbXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGlmeUltYWdlO1xuIiwiaW1wb3J0IHsgVXRpbCwgRXZlbnRlZCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHtjb3JzfSBmcm9tICcuLi9TdXBwb3J0JztcbmltcG9ydCB7Y2xlYW5VcmwsIGdldFVybFBhcmFtc30gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9SZXF1ZXN0JztcblxuZXhwb3J0IHZhciBTZXJ2aWNlID0gRXZlbnRlZC5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICB0aW1lb3V0OiAwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMudXJsID0gY2xlYW5VcmwodGhpcy5vcHRpb25zLnVybCk7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdnZXQnLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfSxcblxuICBwb3N0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdwb3N0JywgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgncmVxdWVzdCcsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnZ2V0JywgJycsIHt9LCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX3J1blF1ZXVlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGltZW91dDtcbiAgfSxcblxuICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gdGltZW91dDtcbiAgfSxcblxuICBfcmVxdWVzdDogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuZmlyZSgncmVxdWVzdHN0YXJ0Jywge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICB9LCB0cnVlKTtcblxuICAgIHZhciB3cmFwcGVkQ2FsbGJhY2sgPSB0aGlzLl9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2sobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKSB7XG4gICAgICBVdGlsLmV4dGVuZChwYXJhbXMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F1dGhlbnRpY2F0aW5nKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0UXVldWUucHVzaChbbWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0XSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cmwgPSAodGhpcy5vcHRpb25zLnByb3h5KSA/IHRoaXMub3B0aW9ucy5wcm94eSArICc/JyArIHRoaXMub3B0aW9ucy51cmwgKyBwYXRoIDogdGhpcy5vcHRpb25zLnVybCArIHBhdGg7XG5cbiAgICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0LmdldC5KU09OUCh1cmwsIHBhcmFtcywgd3JhcHBlZENhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0W21ldGhvZF0odXJsLCBwYXJhbXMsIHdyYXBwZWRDYWxsYmFjaywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIF9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmIChlcnJvciAmJiAoZXJyb3IuY29kZSA9PT0gNDk5IHx8IGVycm9yLmNvZGUgPT09IDQ5OCkpIHtcbiAgICAgICAgdGhpcy5fYXV0aGVudGljYXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3JlcXVlc3RRdWV1ZS5wdXNoKFttZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHRdKTtcblxuICAgICAgICAvLyBmaXJlIGFuIGV2ZW50IGZvciB1c2VycyB0byBoYW5kbGUgYW5kIHJlLWF1dGhlbnRpY2F0ZVxuICAgICAgICB0aGlzLmZpcmUoJ2F1dGhlbnRpY2F0aW9ucmVxdWlyZWQnLCB7XG4gICAgICAgICAgYXV0aGVudGljYXRlOiBVdGlsLmJpbmQodGhpcy5hdXRoZW50aWNhdGUsIHRoaXMpXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGlmIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8gYSBjYWxsYmFjayB0aGV5IGNhbiBoYW5kbGUgdGhlIGF1dGggZXJyb3JcbiAgICAgICAgZXJyb3IuYXV0aGVudGljYXRlID0gVXRpbC5iaW5kKHRoaXMuYXV0aGVudGljYXRlLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5maXJlKCdyZXF1ZXN0ZXJyb3InLCB7XG4gICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RzdWNjZXNzJywge1xuICAgICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCArIHBhdGgsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RlbmQnLCB7XG4gICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCArIHBhdGgsXG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgX3J1blF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX3JlcXVlc3RRdWV1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLl9yZXF1ZXN0UXVldWVbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcmVxdWVzdC5zaGlmdCgpO1xuICAgICAgdGhpc1ttZXRob2RdLmFwcGx5KHRoaXMsIHJlcXVlc3QpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBnZXRVcmxQYXJhbXMob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2VydmljZTtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2UnO1xuaW1wb3J0IGlkZW50aWZ5RmVhdHVyZXMgZnJvbSAnLi4vVGFza3MvSWRlbnRpZnlGZWF0dXJlcyc7XG5pbXBvcnQgcXVlcnkgZnJvbSAnLi4vVGFza3MvUXVlcnknO1xuaW1wb3J0IGZpbmQgZnJvbSAnLi4vVGFza3MvRmluZCc7XG5cbmV4cG9ydCB2YXIgTWFwU2VydmljZSA9IFNlcnZpY2UuZXh0ZW5kKHtcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZGVudGlmeUZlYXR1cmVzKHRoaXMpO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmluZCh0aGlzKTtcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBxdWVyeSh0aGlzKTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBNYXBTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4vU2VydmljZSc7XG5pbXBvcnQgaWRlbnRpZnlJbWFnZSBmcm9tICcuLi9UYXNrcy9JZGVudGlmeUltYWdlJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5cbmV4cG9ydCB2YXIgSW1hZ2VTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9LFxuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkZW50aWZ5SW1hZ2UodGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VTZXJ2aWNlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSW1hZ2VTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbWFnZVNlcnZpY2U7XG4iLCJpbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5pbXBvcnQgeyBnZW9qc29uVG9BcmNHSVMgfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXJTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBpZEF0dHJpYnV0ZTogJ09CSkVDVElEJ1xuICB9LFxuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9LFxuXG4gIGFkZEZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGRlbGV0ZSBmZWF0dXJlLmlkO1xuXG4gICAgZmVhdHVyZSA9IGdlb2pzb25Ub0FyY0dJUyhmZWF0dXJlKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QoJ2FkZEZlYXR1cmVzJywge1xuICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UuYWRkUmVzdWx0cykgPyByZXNwb25zZS5hZGRSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UuYWRkUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICB1cGRhdGVGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICBmZWF0dXJlID0gZ2VvanNvblRvQXJjR0lTKGZlYXR1cmUsIHRoaXMub3B0aW9ucy5pZEF0dHJpYnV0ZSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KCd1cGRhdGVGZWF0dXJlcycsIHtcbiAgICAgIGZlYXR1cmVzOiBbZmVhdHVyZV1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlc3BvbnNlICYmIHJlc3BvbnNlLnVwZGF0ZVJlc3VsdHMpID8gcmVzcG9uc2UudXBkYXRlUmVzdWx0c1swXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yIHx8IHJlc3BvbnNlLnVwZGF0ZVJlc3VsdHNbMF0uZXJyb3IsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG4gIH0sXG5cbiAgZGVsZXRlRmVhdHVyZTogZnVuY3Rpb24gKGlkLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnBvc3QoJ2RlbGV0ZUZlYXR1cmVzJywge1xuICAgICAgb2JqZWN0SWRzOiBpZFxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGVsZXRlUmVzdWx0cykgPyByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UuZGVsZXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlczogZnVuY3Rpb24gKGlkcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KCdkZWxldGVGZWF0dXJlcycsIHtcbiAgICAgIG9iamVjdElkczogaWRzXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgLy8gcGFzcyBiYWNrIHRoZSBlbnRpcmUgYXJyYXlcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGVsZXRlUmVzdWx0cykgPyByZXNwb25zZS5kZWxldGVSZXN1bHRzIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UuZGVsZXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlTGF5ZXJTZXJ2aWNlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmVhdHVyZUxheWVyU2VydmljZTtcbiIsImltcG9ydCB7IFRpbGVMYXllciwgVXRpbCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgcG9pbnRlckV2ZW50cyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHtcbiAgc2V0RXNyaUF0dHJpYnV0aW9uLFxuICBfZ2V0QXR0cmlidXRpb25EYXRhLFxuICBfdXBkYXRlTWFwQXR0cmlidXRpb25cbn0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciB0aWxlUHJvdG9jb2wgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAnaHR0cHM6JykgPyAnaHR0cDonIDogJ2h0dHBzOic7XG5cbmV4cG9ydCB2YXIgQmFzZW1hcExheWVyID0gVGlsZUxheWVyLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICBUSUxFUzoge1xuICAgICAgU3RyZWV0czoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU3RyZWV0X01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRvcG9ncmFwaGljOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9Ub3BvX01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfVG9wb19NYXAnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBPY2VhbnM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL09jZWFuL1dvcmxkX09jZWFuX0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUywgTk9BQScsXG4gICAgICAgICAgYXR0cmlidXRpb25Vcmw6ICdodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL09jZWFuX0Jhc2VtYXAnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBPY2VhbnNMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL09jZWFuL1dvcmxkX09jZWFuX1JlZmVyZW5jZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE5hdGlvbmFsR2VvZ3JhcGhpYzoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvTmF0R2VvX1dvcmxkX01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdOYXRpb25hbCBHZW9ncmFwaGljLCBEZUxvcm1lLCBIRVJFLCBVTkVQLVdDTUMsIFVTR1MsIE5BU0EsIEVTQSwgTUVUSSwgTlJDQU4sIEdFQkNPLCBOT0FBLCBpbmNyZW1lbnQgUCBDb3JwLidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIERhcmtHcmF5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfRGFya19HcmF5X0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnSEVSRSwgRGVMb3JtZSwgTWFwbXlJbmRpYSwgJmNvcHk7IE9wZW5TdHJlZXRNYXAgY29udHJpYnV0b3JzJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRGFya0dyYXlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9EYXJrX0dyYXlfUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBwYW5lOiAocG9pbnRlckV2ZW50cykgPyAnZXNyaS1sYWJlbHMnIDogJ3RpbGVQYW5lJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJydcblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgR3JheToge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdIRVJFLCBEZUxvcm1lLCBNYXBteUluZGlhLCAmY29weTsgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBHcmF5TGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeToge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdEaWdpdGFsR2xvYmUsIEdlb0V5ZSwgaS1jdWJlZCwgVVNEQSwgVVNHUywgQUVYLCBHZXRtYXBwaW5nLCBBZXJvZ3JpZCwgSUdOLCBJR1AsIHN3aXNzdG9wbywgYW5kIHRoZSBHSVMgVXNlciBDb21tdW5pdHknLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9JbWFnZXJ5J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeUxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBJbWFnZXJ5VHJhbnNwb3J0YXRpb246IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9UcmFuc3BvcnRhdGlvbi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFNoYWRlZFJlbGllZjoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU2hhZGVkX1JlbGllZi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDEzLFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgU2hhZGVkUmVsaWVmTGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfQm91bmRhcmllc19hbmRfUGxhY2VzX0FsdGVybmF0ZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDEyLFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBUZXJyYWluOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9UZXJyYWluX0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUywgTk9BQSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRlcnJhaW5MYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9SZWZlcmVuY2VfT3ZlcmxheS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDEzLFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBVU0FUb3BvOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9VU0FfVG9wb19NYXBzL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTUsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5hdGlvbmFsIEdlb2dyYXBoaWMgU29jaWV0eSwgaS1jdWJlZCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEltYWdlcnlDbGFyaXR5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy9jbGFyaXR5Lm1hcHRpbGVzLmFyY2dpcy5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnRXNyaSwgRGlnaXRhbEdsb2JlLCBHZW9FeWUsIEVhcnRoc3RhciBHZW9ncmFwaGljcywgQ05FUy9BaXJidXMgRFMsIFVTREEsIFVTR1MsIEFlcm9HUklELCBJR04sIGFuZCB0aGUgR0lTIFVzZXIgQ29tbXVuaXR5J1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnO1xuXG4gICAgLy8gc2V0IHRoZSBjb25maWcgdmFyaWFibGUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29uZmlnIG9iamVjdFxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiBrZXkudXJsVGVtcGxhdGUgJiYga2V5Lm9wdGlvbnMpIHtcbiAgICAgIGNvbmZpZyA9IGtleTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIEJhc2VtYXBMYXllci5USUxFU1trZXldKSB7XG4gICAgICBjb25maWcgPSBCYXNlbWFwTGF5ZXIuVElMRVNba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMLmVzcmkuQmFzZW1hcExheWVyOiBJbnZhbGlkIHBhcmFtZXRlci4gVXNlIG9uZSBvZiBcIlN0cmVldHNcIiwgXCJUb3BvZ3JhcGhpY1wiLCBcIk9jZWFuc1wiLCBcIk9jZWFuc0xhYmVsc1wiLCBcIk5hdGlvbmFsR2VvZ3JhcGhpY1wiLCBcIkdyYXlcIiwgXCJHcmF5TGFiZWxzXCIsIFwiRGFya0dyYXlcIiwgXCJEYXJrR3JheUxhYmVsc1wiLCBcIkltYWdlcnlcIiwgXCJJbWFnZXJ5TGFiZWxzXCIsIFwiSW1hZ2VyeVRyYW5zcG9ydGF0aW9uXCIsIFwiSW1hZ2VyeUNsYXJpdHlcIiwgXCJTaGFkZWRSZWxpZWZcIiwgXCJTaGFkZWRSZWxpZWZMYWJlbHNcIiwgXCJUZXJyYWluXCIsIFwiVGVycmFpbkxhYmVsc1wiIG9yIFwiVVNBVG9wb1wiJyk7XG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgcGFzc2VkIG9wdGlvbnMgaW50byB0aGUgY29uZmlnIG9wdGlvbnNcbiAgICB2YXIgdGlsZU9wdGlvbnMgPSBVdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgdGlsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbikge1xuICAgICAgY29uZmlnLnVybFRlbXBsYXRlICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgIH1cblxuICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwXG4gICAgVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgY29uZmlnLnVybFRlbXBsYXRlLCB0aWxlT3B0aW9ucyk7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYW5lID09PSAnZXNyaS1sYWJlbHMnKSB7XG4gICAgICB0aGlzLl9pbml0UGFuZSgpO1xuICAgIH1cbiAgICAvLyBzb21lIGJhc2VtYXBzIGNhbiBzdXBwbHkgZHluYW1pYyBhdHRyaWJ1dGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25VcmwpIHtcbiAgICAgIF9nZXRBdHRyaWJ1dGlvbkRhdGEodGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uVXJsLCBtYXApO1xuICAgIH1cblxuICAgIG1hcC5vbignbW92ZWVuZCcsIF91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBfdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIF9pbml0UGFuZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwLmdldFBhbmUodGhpcy5vcHRpb25zLnBhbmUpKSB7XG4gICAgICB2YXIgcGFuZSA9IHRoaXMuX21hcC5jcmVhdGVQYW5lKHRoaXMub3B0aW9ucy5wYW5lKTtcbiAgICAgIHBhbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBhbmUuc3R5bGUuekluZGV4ID0gNTAwO1xuICAgIH1cbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24pIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9ICc8c3BhbiBjbGFzcz1cImVzcmktZHluYW1pYy1hdHRyaWJ1dGlvblwiPicgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwTGF5ZXIgKGtleSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlbWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBDUlMsIERvbUV2ZW50LCBUaWxlTGF5ZXIsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHdhcm4sIGdldFVybFBhcmFtcywgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgbWFwU2VydmljZSBmcm9tICcuLi9TZXJ2aWNlcy9NYXBTZXJ2aWNlJztcblxuZXhwb3J0IHZhciBUaWxlZE1hcExheWVyID0gVGlsZUxheWVyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICB6b29tT2Zmc2V0QWxsb3dhbmNlOiAwLjEsXG4gICAgZXJyb3JUaWxlVXJsOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFRQUFBQUVBQkFNQUFBQ3VYTFZWQUFBQUExQk1WRVV6TkRWc3psSEhBQUFBQVhSU1RsTUFRT2JZWmdBQUFBbHdTRmx6QUFBQUFBQUFBQUFCNm1VV3BBQUFBRFpKUkVGVWVKenR3UUVCQUFBQWdpRC9yMjVJUUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE3d2FCQUFBQncwOFJ3QUFBQUFCSlJVNUVya0pnZ2c9PSdcbiAgfSxcblxuICBzdGF0aWNzOiB7XG4gICAgTWVyY2F0b3Jab29tTGV2ZWxzOiB7XG4gICAgICAnMCc6IDE1NjU0My4wMzM5Mjc5OTk5OSxcbiAgICAgICcxJzogNzgyNzEuNTE2OTYzOTk5ODkzLFxuICAgICAgJzInOiAzOTEzNS43NTg0ODIwMDAwOTksXG4gICAgICAnMyc6IDE5NTY3Ljg3OTI0MDk5OTkwMSxcbiAgICAgICc0JzogOTc4My45Mzk2MjA0OTk5NTkzLFxuICAgICAgJzUnOiA0ODkxLjk2OTgxMDI0OTk3OTcsXG4gICAgICAnNic6IDI0NDUuOTg0OTA1MTI0OTg5OCxcbiAgICAgICc3JzogMTIyMi45OTI0NTI1NjI0ODk5LFxuICAgICAgJzgnOiA2MTEuNDk2MjI2MjgxMzgwMDIsXG4gICAgICAnOSc6IDMwNS43NDgxMTMxNDA1NTgwMixcbiAgICAgICcxMCc6IDE1Mi44NzQwNTY1NzA0MTEsXG4gICAgICAnMTEnOiA3Ni40MzcwMjgyODUwNzMxOTcsXG4gICAgICAnMTInOiAzOC4yMTg1MTQxNDI1MzY1OTgsXG4gICAgICAnMTMnOiAxOS4xMDkyNTcwNzEyNjgyOTksXG4gICAgICAnMTQnOiA5LjU1NDYyODUzNTYzNDE0OTYsXG4gICAgICAnMTUnOiA0Ljc3NzMxNDI2Nzk0OTM2OTksXG4gICAgICAnMTYnOiAyLjM4ODY1NzEzMzk3NDY4LFxuICAgICAgJzE3JzogMS4xOTQzMjg1NjY4NTUwNTAxLFxuICAgICAgJzE4JzogMC41OTcxNjQyODM1NTk4MTY5OSxcbiAgICAgICcxOSc6IDAuMjk4NTgyMTQxNjQ3NjE2OTgsXG4gICAgICAnMjAnOiAwLjE0OTI5MTA3MDgyMzgxLFxuICAgICAgJzIxJzogMC4wNzQ2NDU1MzU0MTE5MSxcbiAgICAgICcyMic6IDAuMDM3MzIyNzY3NzA1OTUyNSxcbiAgICAgICcyMyc6IDAuMDE4NjYxMzgzODUyOTc2M1xuICAgIH1cbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAvLyBzZXQgdGhlIHVybHNcbiAgICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICAgIHRoaXMudGlsZVVybCA9IChvcHRpb25zLnByb3h5ID8gb3B0aW9ucy5wcm94eSArICc/JyA6ICcnKSArIG9wdGlvbnMudXJsICsgJ3RpbGUve3p9L3t5fS97eH0nICsgKG9wdGlvbnMucmVxdWVzdFBhcmFtcyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLnJlcXVlc3RQYXJhbXMpLmxlbmd0aCA+IDAgPyBVdGlsLmdldFBhcmFtU3RyaW5nKG9wdGlvbnMucmVxdWVzdFBhcmFtcykgOiAnJyk7XG4gICAgLy8gUmVtb3ZlIHN1YmRvbWFpbiBpbiB1cmxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQvaXNzdWVzLzk5MVxuICAgIGlmIChvcHRpb25zLnVybC5pbmRleE9mKCd7c30nKSAhPT0gLTEgJiYgb3B0aW9ucy5zdWJkb21haW5zKSB7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsLnJlcGxhY2UoJ3tzfScsIG9wdGlvbnMuc3ViZG9tYWluc1swXSk7XG4gICAgfVxuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgdmFyIGFyY2dpc29ubGluZSA9IG5ldyBSZWdFeHAoL3RpbGVzLmFyY2dpcyhvbmxpbmUpP1xcLmNvbS9nKTtcbiAgICBpZiAoYXJjZ2lzb25saW5lLnRlc3Qob3B0aW9ucy51cmwpKSB7XG4gICAgICB0aGlzLnRpbGVVcmwgPSB0aGlzLnRpbGVVcmwucmVwbGFjZSgnOi8vdGlsZXMnLCAnOi8vdGlsZXN7c30nKTtcbiAgICAgIG9wdGlvbnMuc3ViZG9tYWlucyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHRoaXMudGlsZVVybCArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICB9XG5cbiAgICAvLyBpbml0IGxheWVyIGJ5IGNhbGxpbmcgVGlsZUxheWVycyBpbml0aWFsaXplIG1ldGhvZFxuICAgIFRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMudGlsZVVybCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgZ2V0VGlsZVVybDogZnVuY3Rpb24gKHRpbGVQb2ludCkge1xuICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbUZvclVybCgpO1xuXG4gICAgcmV0dXJuIFV0aWwudGVtcGxhdGUodGhpcy50aWxlVXJsLCBVdGlsLmV4dGVuZCh7XG4gICAgICBzOiB0aGlzLl9nZXRTdWJkb21haW4odGlsZVBvaW50KSxcbiAgICAgIHg6IHRpbGVQb2ludC54LFxuICAgICAgeTogdGlsZVBvaW50LnksXG4gICAgICAvLyB0cnkgbG9kIG1hcCBmaXJzdCwgdGhlbiBqdXN0IGRlZmF1bHQgdG8gem9vbSBsZXZlbFxuICAgICAgejogKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbem9vbV0pID8gdGhpcy5fbG9kTWFwW3pvb21dIDogem9vbVxuICAgIH0sIHRoaXMub3B0aW9ucykpO1xuICB9LFxuXG4gIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMsIGRvbmUpIHtcbiAgICB2YXIgdGlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuXG4gICAgRG9tRXZlbnQub24odGlsZSwgJ2xvYWQnLCBVdGlsLmJpbmQodGhpcy5fdGlsZU9uTG9hZCwgdGhpcywgZG9uZSwgdGlsZSkpO1xuICAgIERvbUV2ZW50Lm9uKHRpbGUsICdlcnJvcicsIFV0aWwuYmluZCh0aGlzLl90aWxlT25FcnJvciwgdGhpcywgZG9uZSwgdGlsZSkpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbikge1xuICAgICAgdGlsZS5jcm9zc09yaWdpbiA9ICcnO1xuICAgIH1cblxuICAgIC8qXG4gICAgIEFsdCB0YWcgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyB0byBrZWVwIHNjcmVlbiByZWFkZXJzIGZyb20gcmVhZGluZyBVUkwgYW5kIGZvciBjb21wbGlhbmNlIHJlYXNvbnNcbiAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLVRFQ0hTL0g2N1xuICAgICovXG4gICAgdGlsZS5hbHQgPSAnJztcblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGxvZCBtYXAgb3IgYW4gbG9kIG1hcCB3aXRoIGEgcHJvcGVyIHpvb20gbG9hZCB0aGUgdGlsZVxuICAgIC8vIG90aGVyd2lzZSB3YWl0IGZvciB0aGUgbG9kIG1hcCB0byBiZWNvbWUgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLl9sb2RNYXAgfHwgKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbdGhpcy5fZ2V0Wm9vbUZvclVybCgpXSkpIHtcbiAgICAgIHRpbGUuc3JjID0gdGhpcy5nZXRUaWxlVXJsKGNvb3Jkcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jZSgnbG9kbWFwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aWxlLnNyYyA9IHRoaXMuZ2V0VGlsZVVybChjb29yZHMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGU7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKCF0aGlzLl9sb2RNYXApIHtcbiAgICAgIHRoaXMubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgICBpZiAoIWVycm9yICYmIG1ldGFkYXRhLnNwYXRpYWxSZWZlcmVuY2UpIHtcbiAgICAgICAgICB2YXIgc3IgPSBtZXRhZGF0YS5zcGF0aWFsUmVmZXJlbmNlLmxhdGVzdFdraWQgfHwgbWV0YWRhdGEuc3BhdGlhbFJlZmVyZW5jZS53a2lkO1xuICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIGNvcHlyaWdodCB0ZXh0IGZyb20gdGhlIHNlcnZpY2UgdXNpbmcgbGVhZmxldCdzIGF0dHJpYnV0aW9uIGNvbnRyb2xcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgdGhlIHNlcnZpY2UgdGlsZXMgd2VyZSBwdWJsaXNoZWQgaW4gd2ViIG1lcmNhdG9yIHVzaW5nIGNvbnZlbnRpb25hbCBMT0RzIGJ1dCBtaXNzaW5nIGxldmVscywgd2UgY2FuIHRyeSBhbmQgcmVtYXAgdGhlbVxuICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5jcnMgPT09IENSUy5FUFNHMzg1NyAmJiAoc3IgPT09IDEwMjEwMCB8fCBzciA9PT0gMzg1NykpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZE1hcCA9IHt9O1xuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB6b29tIGxldmVsIGRhdGFcbiAgICAgICAgICAgIHZhciBhcmNnaXNMT0RzID0gbWV0YWRhdGEudGlsZUluZm8ubG9kcztcbiAgICAgICAgICAgIHZhciBjb3JyZWN0UmVzb2x1dGlvbnMgPSBUaWxlZE1hcExheWVyLk1lcmNhdG9yWm9vbUxldmVscztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmNnaXNMT0RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBhcmNnaXNMT0QgPSBhcmNnaXNMT0RzW2ldO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjaSBpbiBjb3JyZWN0UmVzb2x1dGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ycmVjdFJlcyA9IGNvcnJlY3RSZXNvbHV0aW9uc1tjaV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2l0aGluUGVyY2VudGFnZShhcmNnaXNMT0QucmVzb2x1dGlvbiwgY29ycmVjdFJlcywgdGhpcy5vcHRpb25zLnpvb21PZmZzZXRBbGxvd2FuY2UpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9sb2RNYXBbY2ldID0gYXJjZ2lzTE9ELmxldmVsO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9kbWFwJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtYXAub3B0aW9ucy5jcnMgJiYgbWFwLm9wdGlvbnMuY3JzLmNvZGUgJiYgKG1hcC5vcHRpb25zLmNycy5jb2RlLmluZGV4T2Yoc3IpID4gLTEpKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgcHJvamVjdGlvbiBpcyBXR1M4NCwgb3IgdGhlIGRldmVsb3BlciBpcyB1c2luZyBQcm9qNCB0byBkZWZpbmUgYSBjdXN0b20gQ1JTLCBubyBhY3Rpb24gaXMgcmVxdWlyZWRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHNlcnZpY2Ugd2FzIGNhY2hlZCBpbiBhIGN1c3RvbSBwcm9qZWN0aW9uIGFuZCBhbiBhcHByb3ByaWF0ZSBMT0QgaGFzbid0IGJlZW4gZGVmaW5lZCBpbiB0aGUgbWFwLCBndWlkZSB0aGUgZGV2ZWxvcGVyIHRvIG91ciBQcm9qNCBzYW1wbGVcbiAgICAgICAgICAgIHdhcm4oJ0wuZXNyaS5UaWxlZE1hcExheWVyIGlzIHVzaW5nIGEgbm9uLW1lcmNhdG9yIHNwYXRpYWwgcmVmZXJlbmNlLiBTdXBwb3J0IG1heSBiZSBhdmFpbGFibGUgdGhyb3VnaCBQcm9qNExlYWZsZXQgaHR0cDovL2VzcmkuZ2l0aHViLmlvL2VzcmktbGVhZmxldC9leGFtcGxlcy9ub24tbWVyY2F0b3ItcHJvamVjdGlvbi5odG1sJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBmaW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5maW5kKCk7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgdG9rZW5RcyA9ICc/dG9rZW49JyArIHRva2VuO1xuICAgIHRoaXMudGlsZVVybCA9ICh0aGlzLm9wdGlvbnMudG9rZW4pID8gdGhpcy50aWxlVXJsLnJlcGxhY2UoL1xcP3Rva2VuPSguKykvZywgdG9rZW5RcykgOiB0aGlzLnRpbGVVcmwgKyB0b2tlblFzO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuc2VydmljZS5hdXRoZW50aWNhdGUodG9rZW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF93aXRoaW5QZXJjZW50YWdlOiBmdW5jdGlvbiAoYSwgYiwgcGVyY2VudGFnZSkge1xuICAgIHZhciBkaWZmID0gTWF0aC5hYnMoKGEgLyBiKSAtIDEpO1xuICAgIHJldHVybiBkaWZmIDwgcGVyY2VudGFnZTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlZE1hcExheWVyICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBUaWxlZE1hcExheWVyKHVybCwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRpbGVkTWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBJbWFnZU92ZXJsYXksIENSUywgRG9tVXRpbCwgVXRpbCwgTGF5ZXIsIHBvcHVwLCBsYXRMbmcsIGJvdW5kcyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgY29ycyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciBPdmVybGF5ID0gSW1hZ2VPdmVybGF5LmV4dGVuZCh7XG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdGhpcy5fdG9wTGVmdCA9IG1hcC5nZXRQaXhlbEJvdW5kcygpLm1pbjtcbiAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcbiAgX3Jlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLmNycyA9PT0gQ1JTLkVQU0czODU3KSB7XG4gICAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBEb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2ltYWdlLCB0aGlzLl90b3BMZWZ0LnN1YnRyYWN0KHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpKSk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IHZhciBSYXN0ZXJMYXllciA9IExheWVyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBvcGFjaXR5OiAxLFxuICAgIHBvc2l0aW9uOiAnZnJvbnQnLFxuICAgIGY6ICdpbWFnZScsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICBhdHRyaWJ1dGlvbjogbnVsbCxcbiAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgYWx0OiAnJ1xuICB9LFxuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuX3VwZGF0ZSA9IFV0aWwudGhyb3R0bGUodGhpcy5fdXBkYXRlLCB0aGlzLm9wdGlvbnMudXBkYXRlSW50ZXJ2YWwsIHRoaXMpO1xuXG4gICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlLCB0aGlzKTtcblxuICAgIC8vIGlmIHdlIGhhZCBhbiBpbWFnZSBsb2FkZWQgYW5kIGl0IG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBib3VuZHMgc2hvdyB0aGUgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSBpdFxuICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UgJiYgdGhpcy5fY3VycmVudEltYWdlLl9ib3VuZHMuZXF1YWxzKHRoaXMuX21hcC5nZXRCb3VuZHMoKSkpIHtcbiAgICAgIG1hcC5hZGRMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9uKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGNvcHlyaWdodCB0ZXh0IGxpc3RlZCBpbiBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgdGhpcy5tZXRhZGF0YShmdW5jdGlvbiAoZXJyLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKCFlcnIgJiYgIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uID0gbWV0YWRhdGEuY29weXJpZ2h0VGV4dDtcbiAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICB0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX2dldFBvcHVwRGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLl9tYXAub2ZmKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZSwgdGhpcyk7XG4gIH0sXG5cbiAgYmluZFBvcHVwOiBmdW5jdGlvbiAoZm4sIHBvcHVwT3B0aW9ucykge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5fcG9wdXAgPSBwb3B1cChwb3B1cE9wdGlvbnMpO1xuICAgIHRoaXMuX3BvcHVwRnVuY3Rpb24gPSBmbjtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vbignZGJsY2xpY2snLCB0aGlzLl9yZXNldFBvcHVwU3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICB1bmJpbmRQb3B1cDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX21hcC5jbG9zZVBvcHVwKHRoaXMuX3BvcHVwKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5fcG9wdXAgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBicmluZ1RvRnJvbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSAnZnJvbnQnO1xuICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvRnJvbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYnJpbmdUb0JhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSAnYmFjayc7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9CYWNrKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEF0dHJpYnV0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbjtcbiAgfSxcblxuICBnZXRPcGFjaXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5O1xuICB9LFxuXG4gIHNldE9wYWNpdHk6IGZ1bmN0aW9uIChvcGFjaXR5KSB7XG4gICAgdGhpcy5vcHRpb25zLm9wYWNpdHkgPSBvcGFjaXR5O1xuICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5zZXRPcGFjaXR5KG9wYWNpdHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gW3RoaXMub3B0aW9ucy5mcm9tLCB0aGlzLm9wdGlvbnMudG9dO1xuICB9LFxuXG4gIHNldFRpbWVSYW5nZTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgdGhpcy5vcHRpb25zLmZyb20gPSBmcm9tO1xuICAgIHRoaXMub3B0aW9ucy50byA9IHRvO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGF1dGhlbnRpY2F0ZTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmF1dGhlbnRpY2F0ZSh0b2tlbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVkcmF3OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH0sXG5cbiAgX3JlbmRlckltYWdlOiBmdW5jdGlvbiAodXJsLCBib3VuZHMsIGNvbnRlbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgLy8gaWYgbm8gb3V0cHV0IGRpcmVjdG9yeSBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGEgc2VydmljZSwgTUlNRSBkYXRhIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgIGlmIChjb250ZW50VHlwZSkge1xuICAgICAgICB1cmwgPSAnZGF0YTonICsgY29udGVudFR5cGUgKyAnO2Jhc2U2NCwnICsgdXJsO1xuICAgICAgfVxuICAgICAgLy8gY3JlYXRlIGEgbmV3IGltYWdlIG92ZXJsYXkgYW5kIGFkZCBpdCB0byB0aGUgbWFwXG4gICAgICAvLyB0byBzdGFydCBsb2FkaW5nIHRoZSBpbWFnZVxuICAgICAgLy8gb3BhY2l0eSBpcyAwIHdoaWxlIHRoZSBpbWFnZSBpcyBsb2FkaW5nXG4gICAgICB2YXIgaW1hZ2UgPSBuZXcgT3ZlcmxheSh1cmwsIGJvdW5kcywge1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBjcm9zc09yaWdpbjogdGhpcy5vcHRpb25zLnVzZUNvcnMsXG4gICAgICAgIGFsdDogdGhpcy5vcHRpb25zLmFsdCxcbiAgICAgICAgcGFuZTogdGhpcy5vcHRpb25zLnBhbmUgfHwgdGhpcy5nZXRQYW5lKCksXG4gICAgICAgIGludGVyYWN0aXZlOiB0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmVcbiAgICAgIH0pLmFkZFRvKHRoaXMuX21hcCk7XG5cbiAgICAgIHZhciBvbk92ZXJsYXlFcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGltYWdlKTtcbiAgICAgICAgdGhpcy5maXJlKCdlcnJvcicpO1xuICAgICAgICBpbWFnZS5vZmYoJ2xvYWQnLCBvbk92ZXJsYXlMb2FkLCB0aGlzKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBvbk92ZXJsYXlMb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaW1hZ2Uub2ZmKCdlcnJvcicsIG9uT3ZlcmxheUxvYWQsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIG5ld0ltYWdlID0gZS50YXJnZXQ7XG4gICAgICAgICAgdmFyIG9sZEltYWdlID0gdGhpcy5fY3VycmVudEltYWdlO1xuXG4gICAgICAgICAgLy8gaWYgdGhlIGJvdW5kcyBvZiB0aGlzIGltYWdlIG1hdGNoZXMgdGhlIGJvdW5kcyB0aGF0XG4gICAgICAgICAgLy8gX3JlbmRlckltYWdlIHdhcyBjYWxsZWQgd2l0aCBhbmQgd2UgaGF2ZSBhIG1hcCB3aXRoIHRoZSBzYW1lIGJvdW5kc1xuICAgICAgICAgIC8vIGhpZGUgdGhlIG9sZCBpbWFnZSBpZiB0aGVyZSBpcyBvbmUgYW5kIHNldCB0aGUgb3BhY2l0eVxuICAgICAgICAgIC8vIG9mIHRoZSBuZXcgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSB0aGUgbmV3IGltYWdlXG4gICAgICAgICAgaWYgKG5ld0ltYWdlLl9ib3VuZHMuZXF1YWxzKGJvdW5kcykgJiYgbmV3SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbmV3SW1hZ2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdmcm9udCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYnJpbmdUb0JhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcCkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2Uuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkSW1hZ2UgJiYgdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcihvbGRJbWFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRJbWFnZSAmJiBvbGRJbWFnZS5fbWFwKSB7XG4gICAgICAgICAgICAgIG9sZEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIob2xkSW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobmV3SW1hZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcsIHtcbiAgICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIGxvYWRpbmcgdGhlIGltYWdlIGZhaWxzXG4gICAgICBpbWFnZS5vbmNlKCdlcnJvcicsIG9uT3ZlcmxheUVycm9yLCB0aGlzKTtcblxuICAgICAgLy8gb25jZSB0aGUgaW1hZ2UgbG9hZHNcbiAgICAgIGltYWdlLm9uY2UoJ2xvYWQnLCBvbk92ZXJsYXlMb2FkLCB0aGlzKTtcblxuICAgICAgdGhpcy5maXJlKCdsb2FkaW5nJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF91cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX21hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldEJvdW5kcygpO1xuXG4gICAgaWYgKHRoaXMuX2FuaW1hdGluZ1pvb20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWFwLl9wYW5UcmFuc2l0aW9uICYmIHRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbi5faW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh6b29tID4gdGhpcy5vcHRpb25zLm1heFpvb20gfHwgem9vbSA8IHRoaXMub3B0aW9ucy5taW5ab29tKSB7XG4gICAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IHRoaXMuX2J1aWxkRXhwb3J0UGFyYW1zKCk7XG4gICAgVXRpbC5leHRlbmQocGFyYW1zLCB0aGlzLm9wdGlvbnMucmVxdWVzdFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0RXhwb3J0KHBhcmFtcywgYm91bmRzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgfVxuICB9LFxuXG4gIF9yZW5kZXJQb3B1cDogZnVuY3Rpb24gKGxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgaWYgKHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwICYmIHRoaXMuX2xhc3RDbGljay5lcXVhbHMobGF0bG5nKSkge1xuICAgICAgLy8gYWRkIHRoZSBwb3B1cCB0byB0aGUgbWFwIHdoZXJlIHRoZSBtb3VzZSB3YXMgY2xpY2tlZCBhdFxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9wb3B1cEZ1bmN0aW9uKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICB0aGlzLl9wb3B1cC5zZXRMYXRMbmcobGF0bG5nKS5zZXRDb250ZW50KGNvbnRlbnQpLm9wZW5Pbih0aGlzLl9tYXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVzZXRQb3B1cFN0YXRlOiBmdW5jdGlvbiAoZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2NhbGN1bGF0ZUJib3g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGl4ZWxCb3VuZHMgPSB0aGlzLl9tYXAuZ2V0UGl4ZWxCb3VuZHMoKTtcblxuICAgIHZhciBzdyA9IHRoaXMuX21hcC51bnByb2plY3QocGl4ZWxCb3VuZHMuZ2V0Qm90dG9tTGVmdCgpKTtcbiAgICB2YXIgbmUgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHBpeGVsQm91bmRzLmdldFRvcFJpZ2h0KCkpO1xuXG4gICAgdmFyIG5lUHJvamVjdGVkID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QobmUpO1xuICAgIHZhciBzd1Byb2plY3RlZCA9IHRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KHN3KTtcblxuICAgIC8vIHRoaXMgZW5zdXJlcyBuZS9zdyBhcmUgc3dpdGNoZWQgaW4gcG9sYXIgbWFwcyB3aGVyZSBub3J0aC90b3AgYm90dG9tL3NvdXRoIGlzIGludmVydGVkXG4gICAgdmFyIGJvdW5kc1Byb2plY3RlZCA9IGJvdW5kcyhuZVByb2plY3RlZCwgc3dQcm9qZWN0ZWQpO1xuXG4gICAgcmV0dXJuIFtib3VuZHNQcm9qZWN0ZWQuZ2V0Qm90dG9tTGVmdCgpLngsIGJvdW5kc1Byb2plY3RlZC5nZXRCb3R0b21MZWZ0KCkueSwgYm91bmRzUHJvamVjdGVkLmdldFRvcFJpZ2h0KCkueCwgYm91bmRzUHJvamVjdGVkLmdldFRvcFJpZ2h0KCkueV0uam9pbignLCcpO1xuICB9LFxuXG4gIF9jYWxjdWxhdGVJbWFnZVNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlbnN1cmUgdGhhdCB3ZSBkb24ndCBhc2sgQXJjR0lTIFNlcnZlciBmb3IgYSB0YWxsZXIgaW1hZ2UgdGhhbiB3ZSBoYXZlIGFjdHVhbCBtYXAgZGlzcGxheWluZyB3aXRoaW4gdGhlIGRpdlxuICAgIHZhciBib3VuZHMgPSB0aGlzLl9tYXAuZ2V0UGl4ZWxCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG5cbiAgICB2YXIgc3cgPSB0aGlzLl9tYXAudW5wcm9qZWN0KGJvdW5kcy5nZXRCb3R0b21MZWZ0KCkpO1xuICAgIHZhciBuZSA9IHRoaXMuX21hcC51bnByb2plY3QoYm91bmRzLmdldFRvcFJpZ2h0KCkpO1xuXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobmUpLnk7XG4gICAgdmFyIGJvdHRvbSA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoc3cpLnk7XG5cbiAgICBpZiAodG9wID4gMCB8fCBib3R0b20gPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbSAtIHRvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZS54ICsgJywnICsgc2l6ZS55O1xuICB9XG59KTtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBpbWFnZVNlcnZpY2UgZnJvbSAnLi4vU2VydmljZXMvSW1hZ2VTZXJ2aWNlJztcblxuZXhwb3J0IHZhciBJbWFnZU1hcExheWVyID0gUmFzdGVyTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MCxcbiAgICBmb3JtYXQ6ICdqcGdwbmcnLFxuICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgIGY6ICdpbWFnZSdcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZXRVcmxQYXJhbXMob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlID0gaW1hZ2VTZXJ2aWNlKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZS5hZGRFdmVudFBhcmVudCh0aGlzKTtcblxuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICBzZXRQaXhlbFR5cGU6IGZ1bmN0aW9uIChwaXhlbFR5cGUpIHtcbiAgICB0aGlzLm9wdGlvbnMucGl4ZWxUeXBlID0gcGl4ZWxUeXBlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFBpeGVsVHlwZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucGl4ZWxUeXBlO1xuICB9LFxuXG4gIHNldEJhbmRJZHM6IGZ1bmN0aW9uIChiYW5kSWRzKSB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShiYW5kSWRzKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmJhbmRJZHMgPSBiYW5kSWRzLmpvaW4oJywnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zLmJhbmRJZHMgPSBiYW5kSWRzLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEJhbmRJZHM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gIH0sXG5cbiAgc2V0Tm9EYXRhOiBmdW5jdGlvbiAobm9EYXRhLCBub0RhdGFJbnRlcnByZXRhdGlvbikge1xuICAgIGlmIChVdGlsLmlzQXJyYXkobm9EYXRhKSkge1xuICAgICAgdGhpcy5vcHRpb25zLm5vRGF0YSA9IG5vRGF0YS5qb2luKCcsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ub0RhdGEgPSBub0RhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKG5vRGF0YUludGVycHJldGF0aW9uKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24gPSBub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0Tm9EYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub0RhdGE7XG4gIH0sXG5cbiAgZ2V0Tm9EYXRhSW50ZXJwcmV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm5vRGF0YUludGVycHJldGF0aW9uO1xuICB9LFxuXG4gIHNldFJlbmRlcmluZ1J1bGU6IGZ1bmN0aW9uIChyZW5kZXJpbmdSdWxlKSB7XG4gICAgdGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUgPSByZW5kZXJpbmdSdWxlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIGdldFJlbmRlcmluZ1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGU7XG4gIH0sXG5cbiAgc2V0TW9zYWljUnVsZTogZnVuY3Rpb24gKG1vc2FpY1J1bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMubW9zYWljUnVsZSA9IG1vc2FpY1J1bGU7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH0sXG5cbiAgZ2V0TW9zYWljUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubW9zYWljUnVsZTtcbiAgfSxcblxuICBfZ2V0UG9wdXBEYXRhOiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBjYWxsYmFjayA9IFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKTtcbiAgICAgIH0sIHRoaXMpLCAzMDApO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgdmFyIGlkZW50aWZ5UmVxdWVzdCA9IHRoaXMuaWRlbnRpZnkoKS5hdChlLmxhdGxuZyk7XG5cbiAgICAvLyBzZXQgbW9zYWljIHJ1bGUgZm9yIGlkZW50aWZ5IHRhc2sgaWYgaXQgaXMgc2V0IGZvciBsYXllclxuICAgIGlmICh0aGlzLm9wdGlvbnMubW9zYWljUnVsZSkge1xuICAgICAgaWRlbnRpZnlSZXF1ZXN0LnNldE1vc2FpY1J1bGUodGhpcy5vcHRpb25zLm1vc2FpY1J1bGUpO1xuICAgICAgLy8gQFRPRE86IGZvcmNlIHJldHVybiBjYXRhbG9nIGl0ZW1zIHRvbz9cbiAgICB9XG5cbiAgICAvLyBAVE9ETzogc2V0IHJlbmRlcmluZyBydWxlPyBOb3Qgc3VyZSxcbiAgICAvLyBzb21ldGltZXMgeW91IHdhbnQgcmF3IHBpeGVsIHZhbHVlc1xuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgIC8vICAgaWRlbnRpZnlSZXF1ZXN0LnNldFJlbmRlcmluZ1J1bGUodGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUpO1xuICAgIC8vIH1cblxuICAgIGlkZW50aWZ5UmVxdWVzdC5ydW4oY2FsbGJhY2spO1xuXG4gICAgLy8gc2V0IHRoZSBmbGFncyB0byBzaG93IHRoZSBwb3B1cFxuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gdHJ1ZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBlLmxhdGxuZztcbiAgfSxcblxuICBfYnVpbGRFeHBvcnRQYXJhbXM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3IgPSBwYXJzZUludCh0aGlzLl9tYXAub3B0aW9ucy5jcnMuY29kZS5zcGxpdCgnOicpWzFdLCAxMCk7XG5cbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgYmJveDogdGhpcy5fY2FsY3VsYXRlQmJveCgpLFxuICAgICAgc2l6ZTogdGhpcy5fY2FsY3VsYXRlSW1hZ2VTaXplKCksXG4gICAgICBmb3JtYXQ6IHRoaXMub3B0aW9ucy5mb3JtYXQsXG4gICAgICB0cmFuc3BhcmVudDogdGhpcy5vcHRpb25zLnRyYW5zcGFyZW50LFxuICAgICAgYmJveFNSOiBzcixcbiAgICAgIGltYWdlU1I6IHNyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHBhcmFtcy50aW1lID0gdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpICsgJywnICsgdGhpcy5vcHRpb25zLnRvLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBpeGVsVHlwZSkge1xuICAgICAgcGFyYW1zLnBpeGVsVHlwZSA9IHRoaXMub3B0aW9ucy5waXhlbFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICBwYXJhbXMuaW50ZXJwb2xhdGlvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcHJlc3Npb25RdWFsaXR5KSB7XG4gICAgICBwYXJhbXMuY29tcHJlc3Npb25RdWFsaXR5ID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uUXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJhbmRJZHMpIHtcbiAgICAgIHBhcmFtcy5iYW5kSWRzID0gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gICAgfVxuXG4gICAgLy8gMCBpcyBmYWxzeSAqYW5kKiBhIHZhbGlkIGlucHV0IHBhcmFtZXRlclxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhID09PSAwIHx8IHRoaXMub3B0aW9ucy5ub0RhdGEpIHtcbiAgICAgIHBhcmFtcy5ub0RhdGEgPSB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICAgIHBhcmFtcy5ub0RhdGFJbnRlcnByZXRhdGlvbiA9IHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgICAgcGFyYW1zLnJlbmRlcmluZ1J1bGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKSB7XG4gICAgICBwYXJhbXMubW9zYWljUnVsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydEltYWdlJywgcGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH0gLy8gd2UgcmVhbGx5IGNhbid0IGRvIGFueXRoaW5nIGhlcmUgYnV0IGF1dGhlbnRpY2F0ZSBvciByZXF1ZXN0ZXJyb3Igd2lsbCBmaXJlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLmYgPSAnaW1hZ2UnO1xuICAgICAgdGhpcy5fcmVuZGVySW1hZ2UodGhpcy5vcHRpb25zLnVybCArICdleHBvcnRJbWFnZScgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEltYWdlTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW1hZ2VNYXBMYXllcjtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBtYXBTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL01hcFNlcnZpY2UnO1xuXG5leHBvcnQgdmFyIER5bmFtaWNNYXBMYXllciA9IFJhc3RlckxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHVwZGF0ZUludGVydmFsOiAxNTAsXG4gICAgbGF5ZXJzOiBmYWxzZSxcbiAgICBsYXllckRlZnM6IGZhbHNlLFxuICAgIHRpbWVPcHRpb25zOiBmYWxzZSxcbiAgICBmb3JtYXQ6ICdwbmcyNCcsXG4gICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgZjogJ2pzb24nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgaWYgKChvcHRpb25zLnByb3h5IHx8IG9wdGlvbnMudG9rZW4pICYmIG9wdGlvbnMuZiAhPT0gJ2pzb24nKSB7XG4gICAgICBvcHRpb25zLmYgPSAnanNvbic7XG4gICAgfVxuXG4gICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIGdldER5bmFtaWNMYXllcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gIH0sXG5cbiAgc2V0RHluYW1pY0xheWVyczogZnVuY3Rpb24gKGR5bmFtaWNMYXllcnMpIHtcbiAgICB0aGlzLm9wdGlvbnMuZHluYW1pY0xheWVycyA9IGR5bmFtaWNMYXllcnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TGF5ZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYXllcnM7XG4gIH0sXG5cbiAgc2V0TGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzKSB7XG4gICAgdGhpcy5vcHRpb25zLmxheWVycyA9IGxheWVycztcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRMYXllckRlZnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxheWVyRGVmcztcbiAgfSxcblxuICBzZXRMYXllckRlZnM6IGZ1bmN0aW9uIChsYXllckRlZnMpIHtcbiAgICB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzID0gbGF5ZXJEZWZzO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucztcbiAgfSxcblxuICBzZXRUaW1lT3B0aW9uczogZnVuY3Rpb24gKHRpbWVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbWVPcHRpb25zID0gdGltZU9wdGlvbnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmlkZW50aWZ5KCk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZmluZCgpO1xuICB9LFxuXG4gIF9nZXRQb3B1cERhdGE6IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3Q7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wb3B1cCkge1xuICAgICAgaWRlbnRpZnlSZXF1ZXN0ID0gdGhpcy5vcHRpb25zLnBvcHVwLm9uKHRoaXMuX21hcCkuYXQoZS5sYXRsbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkub24odGhpcy5fbWFwKS5hdChlLmxhdGxuZyk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGV4dHJhbmVvdXMgdmVydGljZXMgZnJvbSByZXNwb25zZSBmZWF0dXJlcyBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lXG4gICAgaWRlbnRpZnlSZXF1ZXN0LnBhcmFtcy5tYXhBbGxvd2FibGVPZmZzZXQgPyB0cnVlIDogaWRlbnRpZnlSZXF1ZXN0LnNpbXBsaWZ5KHRoaXMuX21hcCwgMC41KTtcblxuICAgIGlmICghKHRoaXMub3B0aW9ucy5wb3B1cCAmJiB0aGlzLm9wdGlvbnMucG9wdXAucGFyYW1zICYmIHRoaXMub3B0aW9ucy5wb3B1cC5wYXJhbXMubGF5ZXJzKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgICAgaWRlbnRpZnlSZXF1ZXN0LmxheWVycygndmlzaWJsZTonICsgdGhpcy5vcHRpb25zLmxheWVycy5qb2luKCcsJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWRlbnRpZnlSZXF1ZXN0LmxheWVycygndmlzaWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHByZXNlbnQsIHBhc3MgbGF5ZXIgaWRzIGFuZCBzcWwgZmlsdGVycyB0aHJvdWdoIHRvIHRoZSBpZGVudGlmeSB0YXNrXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllckRlZnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5sYXllckRlZnMgIT09ICdzdHJpbmcnICYmICFpZGVudGlmeVJlcXVlc3QucGFyYW1zLmxheWVyRGVmcykge1xuICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5vcHRpb25zLmxheWVyRGVmcykge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxheWVyRGVmcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICBpZGVudGlmeVJlcXVlc3QubGF5ZXJEZWYoaWQsIHRoaXMub3B0aW9ucy5sYXllckRlZnNbaWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlkZW50aWZ5UmVxdWVzdC5ydW4oY2FsbGJhY2spO1xuXG4gICAgLy8gc2V0IHRoZSBmbGFncyB0byBzaG93IHRoZSBwb3B1cFxuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gdHJ1ZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBlLmxhdGxuZztcbiAgfSxcblxuICBfYnVpbGRFeHBvcnRQYXJhbXM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3IgPSBwYXJzZUludCh0aGlzLl9tYXAub3B0aW9ucy5jcnMuY29kZS5zcGxpdCgnOicpWzFdLCAxMCk7XG5cbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgYmJveDogdGhpcy5fY2FsY3VsYXRlQmJveCgpLFxuICAgICAgc2l6ZTogdGhpcy5fY2FsY3VsYXRlSW1hZ2VTaXplKCksXG4gICAgICBkcGk6IDk2LFxuICAgICAgZm9ybWF0OiB0aGlzLm9wdGlvbnMuZm9ybWF0LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRoaXMub3B0aW9ucy50cmFuc3BhcmVudCxcbiAgICAgIGJib3hTUjogc3IsXG4gICAgICBpbWFnZVNSOiBzclxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnMpIHtcbiAgICAgIHBhcmFtcy5keW5hbWljTGF5ZXJzID0gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMubGF5ZXJzID0gJ3Nob3c6JyArIHRoaXMub3B0aW9ucy5sYXllcnMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJEZWZzKSB7XG4gICAgICBwYXJhbXMubGF5ZXJEZWZzID0gdHlwZW9mIHRoaXMub3B0aW9ucy5sYXllckRlZnMgPT09ICdzdHJpbmcnID8gdGhpcy5vcHRpb25zLmxheWVyRGVmcyA6IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5sYXllckRlZnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZU9wdGlvbnMpIHtcbiAgICAgIHBhcmFtcy50aW1lT3B0aW9ucyA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5mcm9tICYmIHRoaXMub3B0aW9ucy50bykge1xuICAgICAgcGFyYW1zLnRpbWUgPSB0aGlzLm9wdGlvbnMuZnJvbS52YWx1ZU9mKCkgKyAnLCcgKyB0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlcnZpY2Uub3B0aW9ucy50b2tlbikge1xuICAgICAgcGFyYW1zLnRva2VuID0gdGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eSkge1xuICAgICAgcGFyYW1zLnByb3h5ID0gdGhpcy5vcHRpb25zLnByb3h5O1xuICAgIH1cblxuICAgIC8vIHVzZSBhIHRpbWVzdGFtcCB0byBidXN0IHNlcnZlciBjYWNoZVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUNhY2hlKSB7XG4gICAgICBwYXJhbXMuX3RzID0gRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydCcsIHBhcmFtcywgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkpIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmID0gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgcmVzcG9uc2UuaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2UuaHJlZikge1xuICAgICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVuZGVySW1hZ2UocmVzcG9uc2UuaW1hZ2VEYXRhLCBib3VuZHMsIHJlc3BvbnNlLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcy5mID0gJ2ltYWdlJztcbiAgICAgIHRoaXMuX3JlbmRlckltYWdlKHRoaXMub3B0aW9ucy51cmwgKyAnZXhwb3J0JyArIFV0aWwuZ2V0UGFyYW1TdHJpbmcocGFyYW1zKSwgYm91bmRzKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY01hcExheWVyICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEeW5hbWljTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZHluYW1pY01hcExheWVyO1xuIiwiaW1wb3J0IHtcbiAgYm91bmRzLFxuICBsYXRMbmdCb3VuZHMsXG4gIHBvaW50LFxuICBMYXllcixcbiAgc2V0T3B0aW9ucyxcbiAgVXRpbFxufSBmcm9tICdsZWFmbGV0JztcblxudmFyIFZpcnR1YWxHcmlkID0gTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgY2VsbFNpemU6IDUxMixcbiAgICB1cGRhdGVJbnRlcnZhbDogMTUwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fdXBkYXRlID0gVXRpbC50aHJvdHRsZSh0aGlzLl91cGRhdGUsIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCwgdGhpcyk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX21hcC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuZ2V0RXZlbnRzKCksIHRoaXMpO1xuICAgIHRoaXMuX3JlbW92ZUNlbGxzKCk7XG4gIH0sXG5cbiAgZ2V0RXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50cyA9IHtcbiAgICAgIG1vdmVlbmQ6IHRoaXMuX3VwZGF0ZSxcbiAgICAgIHpvb21zdGFydDogdGhpcy5fem9vbXN0YXJ0LFxuICAgICAgem9vbWVuZDogdGhpcy5fcmVzZXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfSxcblxuICBhZGRUbzogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5hZGRMYXllcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICByZW1vdmVGcm9tOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLnJlbW92ZUxheWVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF96b29tc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl96b29taW5nID0gdHJ1ZTtcbiAgfSxcblxuICBfcmVzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9yZW1vdmVDZWxscygpO1xuXG4gICAgdGhpcy5fY2VsbHMgPSB7fTtcbiAgICB0aGlzLl9hY3RpdmVDZWxscyA9IHt9O1xuICAgIHRoaXMuX2NlbGxzVG9Mb2FkID0gMDtcbiAgICB0aGlzLl9jZWxsc1RvdGFsID0gMDtcbiAgICB0aGlzLl9jZWxsTnVtQm91bmRzID0gdGhpcy5fZ2V0Q2VsbE51bUJvdW5kcygpO1xuXG4gICAgdGhpcy5fcmVzZXRXcmFwKCk7XG4gICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xuICB9LFxuXG4gIF9yZXNldFdyYXA6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuICAgIHZhciBjcnMgPSBtYXAub3B0aW9ucy5jcnM7XG5cbiAgICBpZiAoY3JzLmluZmluaXRlKSB7IHJldHVybjsgfVxuXG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5fZ2V0Q2VsbFNpemUoKTtcblxuICAgIGlmIChjcnMud3JhcExuZykge1xuICAgICAgdGhpcy5fd3JhcExuZyA9IFtcbiAgICAgICAgTWF0aC5mbG9vcihtYXAucHJvamVjdChbMCwgY3JzLndyYXBMbmdbMF1dKS54IC8gY2VsbFNpemUpLFxuICAgICAgICBNYXRoLmNlaWwobWFwLnByb2plY3QoWzAsIGNycy53cmFwTG5nWzFdXSkueCAvIGNlbGxTaXplKVxuICAgICAgXTtcbiAgICB9XG5cbiAgICBpZiAoY3JzLndyYXBMYXQpIHtcbiAgICAgIHRoaXMuX3dyYXBMYXQgPSBbXG4gICAgICAgIE1hdGguZmxvb3IobWFwLnByb2plY3QoW2Nycy53cmFwTGF0WzBdLCAwXSkueSAvIGNlbGxTaXplKSxcbiAgICAgICAgTWF0aC5jZWlsKG1hcC5wcm9qZWN0KFtjcnMud3JhcExhdFsxXSwgMF0pLnkgLyBjZWxsU2l6ZSlcbiAgICAgIF07XG4gICAgfVxuICB9LFxuXG4gIF9nZXRDZWxsU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2VsbFNpemU7XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRQaXhlbEJvdW5kcygpO1xuICAgIHZhciBjZWxsU2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICAvLyBjZWxsIGNvb3JkaW5hdGVzIHJhbmdlIGZvciB0aGUgY3VycmVudCB2aWV3XG4gICAgdmFyIGNlbGxCb3VuZHMgPSBib3VuZHMoXG4gICAgICBtYXBCb3VuZHMubWluLmRpdmlkZUJ5KGNlbGxTaXplKS5mbG9vcigpLFxuICAgICAgbWFwQm91bmRzLm1heC5kaXZpZGVCeShjZWxsU2l6ZSkuZmxvb3IoKSk7XG5cbiAgICB0aGlzLl9yZW1vdmVPdGhlckNlbGxzKGNlbGxCb3VuZHMpO1xuICAgIHRoaXMuX2FkZENlbGxzKGNlbGxCb3VuZHMpO1xuXG4gICAgdGhpcy5maXJlKCdjZWxsc3VwZGF0ZWQnKTtcbiAgfSxcblxuICBfYWRkQ2VsbHM6IGZ1bmN0aW9uIChjZWxsQm91bmRzKSB7XG4gICAgdmFyIHF1ZXVlID0gW107XG4gICAgdmFyIGNlbnRlciA9IGNlbGxCb3VuZHMuZ2V0Q2VudGVyKCk7XG4gICAgdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpO1xuXG4gICAgdmFyIGosIGksIGNvb3JkcztcbiAgICAvLyBjcmVhdGUgYSBxdWV1ZSBvZiBjb29yZGluYXRlcyB0byBsb2FkIGNlbGxzIGZyb21cbiAgICBmb3IgKGogPSBjZWxsQm91bmRzLm1pbi55OyBqIDw9IGNlbGxCb3VuZHMubWF4Lnk7IGorKykge1xuICAgICAgZm9yIChpID0gY2VsbEJvdW5kcy5taW4ueDsgaSA8PSBjZWxsQm91bmRzLm1heC54OyBpKyspIHtcbiAgICAgICAgY29vcmRzID0gcG9pbnQoaSwgaik7XG4gICAgICAgIGNvb3Jkcy56ID0gem9vbTtcblxuICAgICAgICBpZiAodGhpcy5faXNWYWxpZENlbGwoY29vcmRzKSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsc1RvTG9hZCA9IHF1ZXVlLmxlbmd0aDtcblxuICAgIGlmIChjZWxsc1RvTG9hZCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMuX2NlbGxzVG9Mb2FkICs9IGNlbGxzVG9Mb2FkO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgKz0gY2VsbHNUb0xvYWQ7XG5cbiAgICAvLyBzb3J0IGNlbGwgcXVldWUgdG8gbG9hZCBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBkaXN0YW5jZSB0byBjZW50ZXJcbiAgICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5kaXN0YW5jZVRvKGNlbnRlcikgLSBiLmRpc3RhbmNlVG8oY2VudGVyKTtcbiAgICB9KTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsc1RvTG9hZDsgaSsrKSB7XG4gICAgICB0aGlzLl9hZGRDZWxsKHF1ZXVlW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgX2lzVmFsaWRDZWxsOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgdmFyIGNycyA9IHRoaXMuX21hcC5vcHRpb25zLmNycztcblxuICAgIGlmICghY3JzLmluZmluaXRlKSB7XG4gICAgICAvLyBkb24ndCBsb2FkIGNlbGwgaWYgaXQncyBvdXQgb2YgYm91bmRzIGFuZCBub3Qgd3JhcHBlZFxuICAgICAgdmFyIGNlbGxOdW1Cb3VuZHMgPSB0aGlzLl9jZWxsTnVtQm91bmRzO1xuICAgICAgaWYgKFxuICAgICAgICAoIWNycy53cmFwTG5nICYmIChjb29yZHMueCA8IGNlbGxOdW1Cb3VuZHMubWluLnggfHwgY29vcmRzLnggPiBjZWxsTnVtQm91bmRzLm1heC54KSkgfHxcbiAgICAgICAgKCFjcnMud3JhcExhdCAmJiAoY29vcmRzLnkgPCBjZWxsTnVtQm91bmRzLm1pbi55IHx8IGNvb3Jkcy55ID4gY2VsbE51bUJvdW5kcy5tYXgueSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLmJvdW5kcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZG9uJ3QgbG9hZCBjZWxsIGlmIGl0IGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBib3VuZHMgaW4gb3B0aW9uc1xuICAgIHZhciBjZWxsQm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgcmV0dXJuIGxhdExuZ0JvdW5kcyh0aGlzLm9wdGlvbnMuYm91bmRzKS5pbnRlcnNlY3RzKGNlbGxCb3VuZHMpO1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY29vcmRpbmF0ZXMgdG8gaXRzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgX2NlbGxDb29yZHNUb0JvdW5kczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5vcHRpb25zLmNlbGxTaXplO1xuICAgIHZhciBud1BvaW50ID0gY29vcmRzLm11bHRpcGx5QnkoY2VsbFNpemUpO1xuICAgIHZhciBzZVBvaW50ID0gbndQb2ludC5hZGQoW2NlbGxTaXplLCBjZWxsU2l6ZV0pO1xuICAgIHZhciBudyA9IG1hcC53cmFwTGF0TG5nKG1hcC51bnByb2plY3QobndQb2ludCwgY29vcmRzLnopKTtcbiAgICB2YXIgc2UgPSBtYXAud3JhcExhdExuZyhtYXAudW5wcm9qZWN0KHNlUG9pbnQsIGNvb3Jkcy56KSk7XG5cbiAgICByZXR1cm4gbGF0TG5nQm91bmRzKG53LCBzZSk7XG4gIH0sXG5cbiAgLy8gY29udmVydHMgY2VsbCBjb29yZGluYXRlcyB0byBrZXkgZm9yIHRoZSBjZWxsIGNhY2hlXG4gIF9jZWxsQ29vcmRzVG9LZXk6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKyAnOicgKyBjb29yZHMueTtcbiAgfSxcblxuICAvLyBjb252ZXJ0cyBjZWxsIGNhY2hlIGtleSB0byBjb29yZGlhbnRlc1xuICBfa2V5VG9DZWxsQ29vcmRzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGtBcnIgPSBrZXkuc3BsaXQoJzonKTtcbiAgICB2YXIgeCA9IHBhcnNlSW50KGtBcnJbMF0sIDEwKTtcbiAgICB2YXIgeSA9IHBhcnNlSW50KGtBcnJbMV0sIDEwKTtcblxuICAgIHJldHVybiBwb2ludCh4LCB5KTtcbiAgfSxcblxuICAvLyByZW1vdmUgYW55IHByZXNlbnQgY2VsbHMgdGhhdCBhcmUgb2ZmIHRoZSBzcGVjaWZpZWQgYm91bmRzXG4gIF9yZW1vdmVPdGhlckNlbGxzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuX2NlbGxzKSB7XG4gICAgICBpZiAoIWJvdW5kcy5jb250YWlucyh0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KSkpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ2VsbChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVtb3ZlQ2VsbDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBjZWxsID0gdGhpcy5fYWN0aXZlQ2VsbHNba2V5XTtcblxuICAgIGlmIChjZWxsKSB7XG4gICAgICBkZWxldGUgdGhpcy5fYWN0aXZlQ2VsbHNba2V5XTtcblxuICAgICAgaWYgKHRoaXMuY2VsbExlYXZlKSB7XG4gICAgICAgIHRoaXMuY2VsbExlYXZlKGNlbGwuYm91bmRzLCBjZWxsLmNvb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgnY2VsbGxlYXZlJywge1xuICAgICAgICBib3VuZHM6IGNlbGwuYm91bmRzLFxuICAgICAgICBjb29yZHM6IGNlbGwuY29vcmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZUNlbGxzOiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuX2NlbGxzKSB7XG4gICAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxzW2tleV0uYm91bmRzO1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2NlbGxzW2tleV0uY29vcmRzO1xuXG4gICAgICBpZiAodGhpcy5jZWxsTGVhdmUpIHtcbiAgICAgICAgdGhpcy5jZWxsTGVhdmUoY2VsbEJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsbGVhdmUnLCB7XG4gICAgICAgIGJvdW5kczogY2VsbEJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfYWRkQ2VsbDogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIC8vIHdyYXAgY2VsbCBjb29yZHMgaWYgbmVjZXNzYXJ5IChkZXBlbmRpbmcgb24gQ1JTKVxuICAgIHRoaXMuX3dyYXBDb29yZHMoY29vcmRzKTtcblxuICAgIC8vIGdlbmVyYXRlIHRoZSBjZWxsIGtleVxuICAgIHZhciBrZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcblxuICAgIC8vIGdldCB0aGUgY2VsbCBmcm9tIHRoZSBjYWNoZVxuICAgIHZhciBjZWxsID0gdGhpcy5fY2VsbHNba2V5XTtcbiAgICAvLyBpZiB0aGlzIGNlbGwgc2hvdWxkIGJlIHNob3duIGFzIGlzbnQgYWN0aXZlIHlldCAoZW50ZXIpXG5cbiAgICBpZiAoY2VsbCAmJiAhdGhpcy5fYWN0aXZlQ2VsbHNba2V5XSkge1xuICAgICAgaWYgKHRoaXMuY2VsbEVudGVyKSB7XG4gICAgICAgIHRoaXMuY2VsbEVudGVyKGNlbGwuYm91bmRzLCBjb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxlbnRlcicsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9hY3RpdmVDZWxsc1trZXldID0gY2VsbDtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBkb250IGhhdmUgdGhpcyBjZWxsIGluIHRoZSBjYWNoZSB5ZXQgKGNyZWF0ZSlcbiAgICBpZiAoIWNlbGwpIHtcbiAgICAgIGNlbGwgPSB7XG4gICAgICAgIGNvb3JkczogY29vcmRzLFxuICAgICAgICBib3VuZHM6IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9jZWxsc1trZXldID0gY2VsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZUNlbGxzW2tleV0gPSBjZWxsO1xuXG4gICAgICBpZiAodGhpcy5jcmVhdGVDZWxsKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2VsbChjZWxsLmJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsY3JlYXRlJywge1xuICAgICAgICBib3VuZHM6IGNlbGwuYm91bmRzLFxuICAgICAgICBjb29yZHM6IGNvb3Jkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF93cmFwQ29vcmRzOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgY29vcmRzLnggPSB0aGlzLl93cmFwTG5nID8gVXRpbC53cmFwTnVtKGNvb3Jkcy54LCB0aGlzLl93cmFwTG5nKSA6IGNvb3Jkcy54O1xuICAgIGNvb3Jkcy55ID0gdGhpcy5fd3JhcExhdCA/IFV0aWwud3JhcE51bShjb29yZHMueSwgdGhpcy5fd3JhcExhdCkgOiBjb29yZHMueTtcbiAgfSxcblxuICAvLyBnZXQgdGhlIGdsb2JhbCBjZWxsIGNvb3JkaW5hdGVzIHJhbmdlIGZvciB0aGUgY3VycmVudCB6b29tXG4gIF9nZXRDZWxsTnVtQm91bmRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHdvcmxkQm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICByZXR1cm4gd29ybGRCb3VuZHMgPyBib3VuZHMoXG4gICAgICB3b3JsZEJvdW5kcy5taW4uZGl2aWRlQnkoc2l6ZSkuZmxvb3IoKSxcbiAgICAgIHdvcmxkQm91bmRzLm1heC5kaXZpZGVCeShzaXplKS5jZWlsKCkuc3VidHJhY3QoWzEsIDFdKSkgOiBudWxsO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVmlydHVhbEdyaWQ7XG4iLCJmdW5jdGlvbiBCaW5hcnlTZWFyY2hJbmRleCAodmFsdWVzKSB7XG4gIHRoaXMudmFsdWVzID0gW10uY29uY2F0KHZhbHVlcyB8fCBbXSk7XG59XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHZhbHVlKTtcbiAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uIGdldEluZGV4ICh2YWx1ZSkge1xuICBpZiAodGhpcy5kaXJ0eSkge1xuICAgIHRoaXMuc29ydCgpO1xuICB9XG5cbiAgdmFyIG1pbkluZGV4ID0gMDtcbiAgdmFyIG1heEluZGV4ID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIGN1cnJlbnRJbmRleDtcbiAgdmFyIGN1cnJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChtaW5JbmRleCA8PSBtYXhJbmRleCkge1xuICAgIGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSAvIDIgfCAwO1xuICAgIGN1cnJlbnRFbGVtZW50ID0gdGhpcy52YWx1ZXNbTWF0aC5yb3VuZChjdXJyZW50SW5kZXgpXTtcbiAgICBpZiAoK2N1cnJlbnRFbGVtZW50LnZhbHVlIDwgK3ZhbHVlKSB7XG4gICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICgrY3VycmVudEVsZW1lbnQudmFsdWUgPiArdmFsdWUpIHtcbiAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0aC5hYnMofm1heEluZGV4KTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5iZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2VlbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZ2V0SW5kZXgoc3RhcnQpO1xuICB2YXIgZW5kSW5kZXggPSB0aGlzLmdldEluZGV4KGVuZCk7XG5cbiAgaWYgKHN0YXJ0SW5kZXggPT09IDAgJiYgZW5kSW5kZXggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbc3RhcnRJbmRleCAtIDFdICYmIHRoaXMudmFsdWVzW3N0YXJ0SW5kZXggLSAxXS52YWx1ZSA9PT0gc3RhcnQpIHtcbiAgICBzdGFydEluZGV4LS07XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbZW5kSW5kZXggKyAxXSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdLnZhbHVlID09PSBlbmQpIHtcbiAgICBlbmRJbmRleCsrO1xuICB9XG5cbiAgaWYgKHRoaXMudmFsdWVzW2VuZEluZGV4XSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleF0udmFsdWUgPT09IGVuZCAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdKSB7XG4gICAgZW5kSW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiB0aGlzLnZhbHVlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0IChpdGVtKSB7XG4gIHRoaXMudmFsdWVzLnNwbGljZSh0aGlzLmdldEluZGV4KGl0ZW0udmFsdWUpLCAwLCBpdGVtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuYnVsa0FkZCA9IGZ1bmN0aW9uIGJ1bGtBZGQgKGl0ZW1zLCBzb3J0KSB7XG4gIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXMuY29uY2F0KFtdLmNvbmNhdChpdGVtcyB8fCBbXSkpO1xuXG4gIGlmIChzb3J0KSB7XG4gICAgdGhpcy5zb3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoKSB7XG4gIHRoaXMudmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gK2IudmFsdWUgLSArYS52YWx1ZTtcbiAgfSkucmV2ZXJzZSgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmluYXJ5U2VhcmNoSW5kZXg7XG4iLCJpbXBvcnQgeyBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgZmVhdHVyZUxheWVyU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9GZWF0dXJlTGF5ZXJTZXJ2aWNlJztcbmltcG9ydCB7IGdldFVybFBhcmFtcywgd2Fybiwgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgVmlydHVhbEdyaWQgZnJvbSAnbGVhZmxldC12aXJ0dWFsLWdyaWQnO1xuaW1wb3J0IEJpbmFyeVNlYXJjaEluZGV4IGZyb20gJ3RpbnktYmluYXJ5LXNlYXJjaCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZU1hbmFnZXIgPSBWaXJ0dWFsR3JpZC5leHRlbmQoe1xuICAvKipcbiAgICogT3B0aW9uc1xuICAgKi9cblxuICBvcHRpb25zOiB7XG4gICAgYXR0cmlidXRpb246IG51bGwsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIGZpZWxkczogWycqJ10sXG4gICAgZnJvbTogZmFsc2UsXG4gICAgdG86IGZhbHNlLFxuICAgIHRpbWVGaWVsZDogZmFsc2UsXG4gICAgdGltZUZpbHRlck1vZGU6ICdzZXJ2ZXInLFxuICAgIHNpbXBsaWZ5RmFjdG9yOiAwLFxuICAgIHByZWNpc2lvbjogNlxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMgPSBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnNlcnZpY2UgPSBmZWF0dXJlTGF5ZXJTZXJ2aWNlKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZS5hZGRFdmVudFBhcmVudCh0aGlzKTtcblxuICAgIC8vIHVzZSBjYXNlIGluc2Vuc2l0aXZlIHJlZ2V4IHRvIGxvb2sgZm9yIGNvbW1vbiBmaWVsZG5hbWVzIHVzZWQgZm9yIGluZGV4aW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucy5maWVsZHNbMF0gIT09ICcqJykge1xuICAgICAgdmFyIG9pZENoZWNrID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWVsZHNbaV0ubWF0Y2goL14oT0JKRUNUSUR8RklEfE9JRHxJRCkkL2kpKSB7XG4gICAgICAgICAgb2lkQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2lkQ2hlY2sgPT09IGZhbHNlKSB7XG4gICAgICAgIHdhcm4oJ25vIGtub3duIGVzcmlGaWVsZFR5cGVPSUQgZmllbGQgZGV0ZWN0ZWQgaW4gZmllbGRzIEFycmF5LiAgUGxlYXNlIGFkZCBhbiBhdHRyaWJ1dGUgZmllbGQgY29udGFpbmluZyB1bmlxdWUgSURzIHRvIGVuc3VyZSB0aGUgbGF5ZXIgY2FuIGJlIGRyYXduIGNvcnJlY3RseS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdGhpcy5fc3RhcnRUaW1lSW5kZXggPSBuZXcgQmluYXJ5U2VhcmNoSW5kZXgoKTtcbiAgICAgIHRoaXMuX2VuZFRpbWVJbmRleCA9IG5ldyBCaW5hcnlTZWFyY2hJbmRleCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCkge1xuICAgICAgdGhpcy5fdGltZUluZGV4ID0gbmV3IEJpbmFyeVNlYXJjaEluZGV4KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTsgLy8gY2FjaGUgb2Ygd2hhdCBsYXllcnMgc2hvdWxkIGJlIGFjdGl2ZVxuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzID0gMDtcbiAgfSxcblxuICAvKipcbiAgICogTGF5ZXIgSW50ZXJmYWNlXG4gICAqL1xuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuc2VydmljZS5tZXRhZGF0YShmdW5jdGlvbiAoZXJyLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgdmFyIHN1cHBvcnRlZEZvcm1hdHMgPSBtZXRhZGF0YS5zdXBwb3J0ZWRRdWVyeUZvcm1hdHM7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgc29tZW9uZSBoYXMgcmVxdWVzdGVkIHRoYXQgd2UgZG9uJ3QgdXNlIGdlb0pTT04sIGV2ZW4gaWYgaXQncyBhdmFpbGFibGVcbiAgICAgICAgdmFyIGZvcmNlSnNvbkZvcm1hdCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMuaXNNb2Rlcm4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgZm9yY2VKc29uRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVubGVzcyB3ZSd2ZSBiZWVuIHRvbGQgb3RoZXJ3aXNlLCBjaGVjayB0byBzZWUgd2hldGhlciBzZXJ2aWNlIGNhbiBlbWl0IEdlb0pTT04gbmF0aXZlbHlcbiAgICAgICAgaWYgKCFmb3JjZUpzb25Gb3JtYXQgJiYgc3VwcG9ydGVkRm9ybWF0cyAmJiBzdXBwb3J0ZWRGb3JtYXRzLmluZGV4T2YoJ2dlb0pTT04nKSAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLnNlcnZpY2Uub3B0aW9ucy5pc01vZGVybiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgY29weXJpZ2h0IHRleHQgbGlzdGVkIGluIHNlcnZpY2UgbWV0YWRhdGFcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gJiYgbWFwLmF0dHJpYnV0aW9uQ29udHJvbCAmJiBtZXRhZGF0YS5jb3B5cmlnaHRUZXh0KSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uID0gbWV0YWRhdGEuY29weXJpZ2h0VGV4dDtcbiAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIG1hcC5vbignem9vbWVuZCcsIHRoaXMuX2hhbmRsZVpvb21DaGFuZ2UsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsIG1hcCk7XG4gIH0sXG5cbiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBtYXAub2ZmKCd6b29tZW5kJywgdGhpcy5faGFuZGxlWm9vbUNoYW5nZSwgdGhpcyk7XG5cbiAgICByZXR1cm4gVmlydHVhbEdyaWQucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb247XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZlYXR1cmUgTWFuYWdlbWVudFxuICAgKi9cblxuICBjcmVhdGVDZWxsOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICAvLyBkb250IGZldGNoIGZlYXR1cmVzIG91dHNpZGUgdGhlIHNjYWxlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllclxuICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBjb29yZHMpO1xuICAgIH1cbiAgfSxcblxuICBfcmVxdWVzdEZlYXR1cmVzOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fYWN0aXZlUmVxdWVzdHMrKztcblxuICAgIC8vIG91ciBmaXJzdCBhY3RpdmUgcmVxdWVzdCBmaXJlcyBsb2FkaW5nXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVJlcXVlc3RzID09PSAxKSB7XG4gICAgICB0aGlzLmZpcmUoJ2xvYWRpbmcnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYnVpbGRRdWVyeShib3VuZHMpLnJ1bihmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4Y2VlZGVkVHJhbnNmZXJMaW1pdCkge1xuICAgICAgICB0aGlzLmZpcmUoJ2RyYXdsaW1pdGV4Y2VlZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGVycm9yLCBmZWF0dXJlc1xuICAgICAgaWYgKCFlcnJvciAmJiBmZWF0dXJlQ29sbGVjdGlvbiAmJiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9hZGRGZWF0dXJlcyhmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcywgY29vcmRzKTtcbiAgICAgICAgICB0aGlzLl9wb3N0UHJvY2Vzc0ZlYXR1cmVzKGJvdW5kcyk7XG4gICAgICAgIH0sIHRoaXMpKTtcbiAgICAgIH1cblxuICAgICAgLy8gbm8gZXJyb3IsIG5vIGZlYXR1cmVzXG4gICAgICBpZiAoIWVycm9yICYmIGZlYXR1cmVDb2xsZWN0aW9uICYmICFmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24pO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIF9wb3N0UHJvY2Vzc0ZlYXR1cmVzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgLy8gZGVpbmNyZW1lbnQgdGhlIHJlcXVlc3QgY291bnRlciBub3cgdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBmZWF0dXJlc1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzLS07XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgcmVxdWVzdHMgZmlyZSBhIGxvYWQgZXZlbnQgZm9yIHRoaXMgdmlld1xuICAgIGlmICh0aGlzLl9hY3RpdmVSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICB0aGlzLmZpcmUoJ2xvYWQnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2NhY2hlS2V5OiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvb3Jkcy56ICsgJzonICsgY29vcmRzLnggKyAnOicgKyBjb29yZHMueTtcbiAgfSxcblxuICBfYWRkRmVhdHVyZXM6IGZ1bmN0aW9uIChmZWF0dXJlcywgY29vcmRzKSB7XG4gICAgdmFyIGtleSA9IHRoaXMuX2NhY2hlS2V5KGNvb3Jkcyk7XG4gICAgdGhpcy5fY2FjaGVba2V5XSA9IHRoaXMuX2NhY2hlW2tleV0gfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBpZCA9IGZlYXR1cmVzW2ldLmlkO1xuXG4gICAgICBpZiAodGhpcy5fY3VycmVudFNuYXBzaG90LmluZGV4T2YoaWQpID09PSAtMSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QucHVzaChpZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY2FjaGVba2V5XS5pbmRleE9mKGlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVba2V5XS5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCkge1xuICAgICAgdGhpcy5fYnVpbGRUaW1lSW5kZXhlcyhmZWF0dXJlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVMYXllcnMoZmVhdHVyZXMpO1xuICB9LFxuXG4gIF9idWlsZFF1ZXJ5OiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5zZXJ2aWNlLnF1ZXJ5KClcbiAgICAgIC5pbnRlcnNlY3RzKGJvdW5kcylcbiAgICAgIC53aGVyZSh0aGlzLm9wdGlvbnMud2hlcmUpXG4gICAgICAuZmllbGRzKHRoaXMub3B0aW9ucy5maWVsZHMpXG4gICAgICAucHJlY2lzaW9uKHRoaXMub3B0aW9ucy5wcmVjaXNpb24pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKSB7XG4gICAgICBVdGlsLmV4dGVuZChxdWVyeS5wYXJhbXMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNpbXBsaWZ5RmFjdG9yKSB7XG4gICAgICBxdWVyeS5zaW1wbGlmeSh0aGlzLl9tYXAsIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3Rvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmlsdGVyTW9kZSA9PT0gJ3NlcnZlcicgJiYgdGhpcy5vcHRpb25zLmZyb20gJiYgdGhpcy5vcHRpb25zLnRvKSB7XG4gICAgICBxdWVyeS5iZXR3ZWVuKHRoaXMub3B0aW9ucy5mcm9tLCB0aGlzLm9wdGlvbnMudG8pO1xuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfSxcblxuICAvKipcbiAgICogV2hlcmUgTWV0aG9kc1xuICAgKi9cblxuICBzZXRXaGVyZTogZnVuY3Rpb24gKHdoZXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMub3B0aW9ucy53aGVyZSA9ICh3aGVyZSAmJiB3aGVyZS5sZW5ndGgpID8gd2hlcmUgOiAnMT0xJztcblxuICAgIHZhciBvbGRTbmFwc2hvdCA9IFtdO1xuICAgIHZhciBuZXdTbmFwc2hvdCA9IFtdO1xuICAgIHZhciBwZW5kaW5nUmVxdWVzdHMgPSAwO1xuICAgIHZhciByZXF1ZXN0RXJyb3IgPSBudWxsO1xuICAgIHZhciByZXF1ZXN0Q2FsbGJhY2sgPSBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmVhdHVyZUNvbGxlY3Rpb24pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgbmV3U25hcHNob3QucHVzaChmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlc1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGVuZGluZ1JlcXVlc3RzLS07XG5cbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdHMgPD0gMCAmJiB0aGlzLl92aXNpYmxlWm9vbSgpKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90O1xuICAgICAgICAvLyBzY2hlZHVsZSBhZGRpbmcgZmVhdHVyZXMgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxheWVycyhvbGRTbmFwc2hvdCk7XG4gICAgICAgICAgdGhpcy5hZGRMYXllcnMobmV3U25hcHNob3QpO1xuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXF1ZXN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgb2xkU25hcHNob3QucHVzaCh0aGlzLl9jdXJyZW50U25hcHNob3RbaV0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICB2YXIgY29vcmRzID0gdGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSk7XG4gICAgICB2YXIgYm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0V2hlcmU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndoZXJlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaW1lIFJhbmdlIE1ldGhvZHNcbiAgICovXG5cbiAgZ2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt0aGlzLm9wdGlvbnMuZnJvbSwgdGhpcy5vcHRpb25zLnRvXTtcbiAgfSxcblxuICBzZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uIChmcm9tLCB0bywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgb2xkRnJvbSA9IHRoaXMub3B0aW9ucy5mcm9tO1xuICAgIHZhciBvbGRUbyA9IHRoaXMub3B0aW9ucy50bztcbiAgICB2YXIgcGVuZGluZ1JlcXVlc3RzID0gMDtcbiAgICB2YXIgcmVxdWVzdEVycm9yID0gbnVsbDtcbiAgICB2YXIgcmVxdWVzdENhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlsdGVyRXhpc3RpbmdGZWF0dXJlcyhvbGRGcm9tLCBvbGRUbywgZnJvbSwgdG8pO1xuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVxdWVzdEVycm9yKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMub3B0aW9ucy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLm9wdGlvbnMudG8gPSB0bztcblxuICAgIHRoaXMuX2ZpbHRlckV4aXN0aW5nRmVhdHVyZXMob2xkRnJvbSwgb2xkVG8sIGZyb20sIHRvKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpbHRlck1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fYWN0aXZlQ2VsbHMpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KTtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2tleVRvQ2VsbENvb3JkcyhrZXkpO1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywga2V5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWRyYXcpIHtcbiAgICAgIHRoaXMub25jZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLl9yZWRyYXcobGF5ZXIuZmVhdHVyZS5pZCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIF9maWx0ZXJFeGlzdGluZ0ZlYXR1cmVzOiBmdW5jdGlvbiAob2xkRnJvbSwgb2xkVG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIGxheWVyc1RvUmVtb3ZlID0gKG9sZEZyb20gJiYgb2xkVG8pID8gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShvbGRGcm9tLCBvbGRUbykgOiB0aGlzLl9jdXJyZW50U25hcHNob3Q7XG4gICAgdmFyIGxheWVyc1RvQWRkID0gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShuZXdGcm9tLCBuZXdUbyk7XG5cbiAgICBpZiAobGF5ZXJzVG9BZGQuaW5kZXhPZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlTGF5ZXIgPSBsYXllcnNUb1JlbW92ZS5pbmRleE9mKGxheWVyc1RvQWRkW2ldKTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxheWVyID49IDApIHtcbiAgICAgICAgICBsYXllcnNUb1JlbW92ZS5zcGxpY2Uoc2hvdWxkUmVtb3ZlTGF5ZXIsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzVG9SZW1vdmUpO1xuICAgICAgdGhpcy5hZGRMYXllcnMobGF5ZXJzVG9BZGQpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBfZ2V0RmVhdHVyZXNJblRpbWVSYW5nZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaWRzID0gW107XG4gICAgdmFyIHNlYXJjaDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lcyA9IHRoaXMuX3N0YXJ0VGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgICB2YXIgZW5kVGltZXMgPSB0aGlzLl9lbmRUaW1lSW5kZXguYmV0d2VlbihzdGFydCwgZW5kKTtcbiAgICAgIHNlYXJjaCA9IHN0YXJ0VGltZXMuY29uY2F0KGVuZFRpbWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoID0gdGhpcy5fdGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWRzLnB1c2goc2VhcmNoW2ldLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzO1xuICB9LFxuXG4gIF9idWlsZFRpbWVJbmRleGVzOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBpO1xuICAgIHZhciBmZWF0dXJlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lRW50cmllcyA9IFtdO1xuICAgICAgdmFyIGVuZFRpbWVFbnRyaWVzID0gW107XG4gICAgICBmb3IgKGkgPSBnZW9qc29uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZlYXR1cmUgPSBnZW9qc29uW2ldO1xuICAgICAgICBzdGFydFRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF0pXG4gICAgICAgIH0pO1xuICAgICAgICBlbmRUaW1lRW50cmllcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFRpbWVJbmRleC5idWxrQWRkKHN0YXJ0VGltZUVudHJpZXMpO1xuICAgICAgdGhpcy5fZW5kVGltZUluZGV4LmJ1bGtBZGQoZW5kVGltZUVudHJpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGltZUVudHJpZXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IGdlb2pzb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgZmVhdHVyZSA9IGdlb2pzb25baV07XG4gICAgICAgIHRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90aW1lSW5kZXguYnVsa0FkZCh0aW1lRW50cmllcyk7XG4gICAgfVxuICB9LFxuXG4gIF9mZWF0dXJlV2l0aGluVGltZVJhbmdlOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmZyb20gfHwgIXRoaXMub3B0aW9ucy50bykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSArdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpO1xuICAgIHZhciB0byA9ICt0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudGltZUZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRhdGUgPSArZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGRdO1xuICAgICAgcmV0dXJuIChkYXRlID49IGZyb20pICYmIChkYXRlIDw9IHRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdmFyIHN0YXJ0RGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF07XG4gICAgICB2YXIgZW5kRGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmRdO1xuICAgICAgcmV0dXJuICgoc3RhcnREYXRlID49IGZyb20pICYmIChzdGFydERhdGUgPD0gdG8pKSB8fCAoKGVuZERhdGUgPj0gZnJvbSkgJiYgKGVuZERhdGUgPD0gdG8pKTtcbiAgICB9XG4gIH0sXG5cbiAgX3Zpc2libGVab29tOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgbWFwIGlzIHdpdGhpbiB0aGUgb3B0aW9uYWwgbGltaXQgZGVmaW5lZCBmb3IgdGhlIEZlYXR1cmVMYXllclxuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICBpZiAoem9vbSA+IHRoaXMub3B0aW9ucy5tYXhab29tIHx8IHpvb20gPCB0aGlzLm9wdGlvbnMubWluWm9vbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gIH0sXG5cbiAgX2hhbmRsZVpvb21DaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3Zpc2libGVab29tKCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHRoaXMuX2N1cnJlbnRTbmFwc2hvdCk7XG4gICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLypcbiAgICAgIGZvciBldmVyeSBjZWxsIGluIHRoaXMuX2FjdGl2ZUNlbGxzXG4gICAgICAgIDEuIEdldCB0aGUgY2FjaGUga2V5IGZvciB0aGUgY29vcmRzIG9mIHRoZSBjZWxsXG4gICAgICAgIDIuIElmIHRoaXMuX2NhY2hlW2tleV0gZXhpc3RzIGl0IHdpbGwgYmUgYW4gYXJyYXkgb2YgZmVhdHVyZSBJRHMuXG4gICAgICAgIDMuIENhbGwgdGhpcy5hZGRMYXllcnModGhpcy5fY2FjaGVba2V5XSkgdG8gaW5zdHJ1Y3QgdGhlIGZlYXR1cmUgbGF5ZXIgdG8gYWRkIHRoZSBsYXllcnMgYmFjay5cbiAgICAgICovXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2FjdGl2ZUNlbGxzKSB7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9hY3RpdmVDZWxsc1tpXS5jb29yZHM7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVba2V5XSkge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKHRoaXMuX2NhY2hlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIE1ldGhvZHNcbiAgICovXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBfZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9tZXRhZGF0YSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRoaXMuX21ldGFkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgdGhpcy5fbWV0YWRhdGEpO1xuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICBhZGRGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9nZXRNZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCBudWxsKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VydmljZS5hZGRGZWF0dXJlKGZlYXR1cmUsIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAvLyBhc3NpZ24gSUQgZnJvbSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgb2JqZWN0aWQgZmllbGQgZnJvbSBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW21ldGFkYXRhLm9iamVjdElkRmllbGRdID0gcmVzcG9uc2Uub2JqZWN0SWQ7XG5cbiAgICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBnZW9qc29uIGlkIGZvciBjcmVhdGVMYXllcnMoKSB0byBmdW5jdGlvblxuICAgICAgICAgIGZlYXR1cmUuaWQgPSByZXNwb25zZS5vYmplY3RJZDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxheWVycyhbZmVhdHVyZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKSk7XG4gICAgfSwgdGhpcykpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVGZWF0dXJlKGZlYXR1cmUsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW2ZlYXR1cmUuaWRdLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcnMoW2ZlYXR1cmVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZUZlYXR1cmUoaWQsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2Uub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW3Jlc3BvbnNlLm9iamVjdElkXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsZXRlRmVhdHVyZXMoaWRzLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWVycm9yICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKFtyZXNwb25zZVtpXS5vYmplY3RJZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcbiIsImltcG9ydCB7IFBhdGgsIFV0aWwsIEdlb0pTT04sIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgRmVhdHVyZU1hbmFnZXIgfSBmcm9tICcuL0ZlYXR1cmVNYW5hZ2VyJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXIgPSBGZWF0dXJlTWFuYWdlci5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBjYWNoZUxheWVyczogdHJ1ZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX29yaWdpbmFsU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2ldKTtcbiAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IHdoZW4gdGhlIGVudGlyZSBmZWF0dXJlTGF5ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBcbiAgICAgIHRoaXMuZmlyZSgncmVtb3ZlZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogdGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUsXG4gICAgICAgIHBlcm1hbmVudDogZmFsc2VcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIGNyZWF0ZU5ld0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBsYXllciA9IEdlb0pTT04uZ2VvbWV0cnlUb0xheWVyKGdlb2pzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgbGF5ZXIuZGVmYXVsdE9wdGlvbnMgPSBsYXllci5vcHRpb25zO1xuICAgIHJldHVybiBsYXllcjtcbiAgfSxcblxuICBfdXBkYXRlTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgZ2VvanNvbikge1xuICAgIC8vIGNvbnZlcnQgdGhlIGdlb2pzb24gY29vcmRpbmF0ZXMgaW50byBhIExlYWZsZXQgTGF0TG5nIGFycmF5L25lc3RlZCBhcnJheXNcbiAgICAvLyBwYXNzIGl0IHRvIHNldExhdExuZ3MgdG8gdXBkYXRlIGxheWVyIGdlb21ldHJpZXNcbiAgICB2YXIgbGF0bG5ncyA9IFtdO1xuICAgIHZhciBjb29yZHNUb0xhdExuZyA9IHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZyB8fCBHZW9KU09OLmNvb3Jkc1RvTGF0TG5nO1xuXG4gICAgLy8gY29weSBuZXcgYXR0cmlidXRlcywgaWYgcHJlc2VudFxuICAgIGlmIChnZW9qc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllcyA9IGdlb2pzb24ucHJvcGVydGllcztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdlb2pzb24uZ2VvbWV0cnkudHlwZSkge1xuICAgICAgY2FzZSAnUG9pbnQnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcywgMCwgY29vcmRzVG9MYXRMbmcpO1xuICAgICAgICBsYXllci5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgbGF0bG5ncyA9IEdlb0pTT04uY29vcmRzVG9MYXRMbmdzKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIDIsIGNvb3Jkc1RvTGF0TG5nKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5ncyhsYXRsbmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnQgTWV0aG9kc1xuICAgKi9cblxuICBjcmVhdGVMYXllcnM6IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGdlb2pzb24gPSBmZWF0dXJlc1tpXTtcblxuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuICAgICAgdmFyIG5ld0xheWVyO1xuXG4gICAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSAmJiBsYXllciAmJiAhdGhpcy5fbWFwLmhhc0xheWVyKGxheWVyKSkge1xuICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobGF5ZXIpO1xuICAgICAgICB0aGlzLmZpcmUoJ2FkZGZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIGdlb21ldHJ5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKGxheWVyICYmIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3RvciA+IDAgJiYgKGxheWVyLnNldExhdExuZ3MgfHwgbGF5ZXIuc2V0TGF0TG5nKSkge1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllciwgZ2VvanNvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgbmV3TGF5ZXIgPSB0aGlzLmNyZWF0ZU5ld0xheWVyKGdlb2pzb24pO1xuICAgICAgICBuZXdMYXllci5mZWF0dXJlID0gZ2VvanNvbjtcblxuICAgICAgICAvLyBidWJibGUgZXZlbnRzIGZyb20gaW5kaXZpZHVhbCBsYXllcnMgdG8gdGhlIGZlYXR1cmUgbGF5ZXJcbiAgICAgICAgbmV3TGF5ZXIuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9uRWFjaEZlYXR1cmUobmV3TGF5ZXIuZmVhdHVyZSwgbmV3TGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FjaGUgdGhlIGxheWVyXG4gICAgICAgIHRoaXMuX2xheWVyc1tuZXdMYXllci5mZWF0dXJlLmlkXSA9IG5ld0xheWVyO1xuXG4gICAgICAgIC8vIHN0eWxlIHRoZSBsYXllclxuICAgICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBpbnNpZGUgdGhlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllciwgaXQgaXMgd2l0aGluIHRoZSBjdXJyZW50IHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpICYmICghdGhpcy5vcHRpb25zLnRpbWVGaWVsZCB8fCAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCAmJiB0aGlzLl9mZWF0dXJlV2l0aGluVGltZVJhbmdlKGdlb2pzb24pKSkpIHtcbiAgICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFkZExheWVyczogZnVuY3Rpb24gKGlkcykge1xuICAgIGZvciAodmFyIGkgPSBpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZHNbaV1dO1xuICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgIHRoaXMuX21hcC5hZGRMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IGlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIGlmIChsYXllcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZWZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZSxcbiAgICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciAmJiBwZXJtYW5lbnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNlbGxFbnRlcjogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgaWYgKHRoaXMuX3Zpc2libGVab29tKCkgJiYgIXRoaXMuX3pvb21pbmcgJiYgdGhpcy5fbWFwKSB7XG4gICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGNlbGxLZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGxheWVycyA9IHRoaXMuX2NhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY2VsbExlYXZlOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICBpZiAoIXRoaXMuX3pvb21pbmcpIHtcbiAgICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgICB2YXIgY2VsbEtleSA9IHRoaXMuX2NlbGxDb29yZHNUb0tleShjb29yZHMpO1xuICAgICAgICAgIHZhciBsYXllcnMgPSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgICAgdmFyIHJlbW92YWJsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcnNbaV1dO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuZ2V0Qm91bmRzICYmIG1hcEJvdW5kcy5pbnRlcnNlY3RzKGxheWVyLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW1vdmFibGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzLCAhdGhpcy5vcHRpb25zLmNhY2hlTGF5ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FjaGVMYXllcnMgJiYgcmVtb3ZhYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jZWxsc1tjZWxsS2V5XTtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3R5bGluZyBNZXRob2RzXG4gICAqL1xuXG4gIHJlc2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSB0aGlzLl9vcmlnaW5hbFN0eWxlO1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICB0aGlzLnJlc2V0RmVhdHVyZVN0eWxlKGxheWVyLmZlYXR1cmUuaWQpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuX29yaWdpbmFsU3R5bGUgfHwgUGF0aC5wcm90b3R5cGUub3B0aW9ucztcbiAgICBpZiAobGF5ZXIpIHtcbiAgICAgIFV0aWwuZXh0ZW5kKGxheWVyLm9wdGlvbnMsIGxheWVyLmRlZmF1bHRPcHRpb25zKTtcbiAgICAgIHRoaXMuc2V0RmVhdHVyZVN0eWxlKGlkLCBzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldEZlYXR1cmVTdHlsZTogZnVuY3Rpb24gKGlkLCBzdHlsZSkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3R5bGUgPSBzdHlsZShsYXllci5mZWF0dXJlKTtcbiAgICB9XG4gICAgaWYgKGxheWVyLnNldFN0eWxlKSB7XG4gICAgICBsYXllci5zZXRTdHlsZShzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IE1ldGhvZHNcbiAgICovXG5cbiAgZWFjaEFjdGl2ZUZlYXR1cmU6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkge1xuICAgIC8vIGZpZ3VyZSBvdXQgKHJvdWdobHkpIHdoaWNoIGxheWVycyBhcmUgaW4gdmlld1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHZhciBhY3RpdmVCb3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7XG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFNuYXBzaG90LmluZGV4T2YodGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUuaWQpICE9PSAtMSkge1xuICAgICAgICAgIC8vIGEgc2ltcGxlIHBvaW50IGluIHBvbHkgdGVzdCBmb3IgcG9pbnQgZ2VvbWV0cmllc1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbGF5ZXJzW2ldLmdldExhdExuZyA9PT0gJ2Z1bmN0aW9uJyAmJiBhY3RpdmVCb3VuZHMuY29udGFpbnModGhpcy5fbGF5ZXJzW2ldLmdldExhdExuZygpKSkge1xuICAgICAgICAgICAgZm4uY2FsbChjb250ZXh0LCB0aGlzLl9sYXllcnNbaV0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2xheWVyc1tpXS5nZXRCb3VuZHMgPT09ICdmdW5jdGlvbicgJiYgYWN0aXZlQm91bmRzLmludGVyc2VjdHModGhpcy5fbGF5ZXJzW2ldLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0aW5nIGJvdW5kcyBjaGVjayBmb3IgcG9seWxpbmUgYW5kIHBvbHlnb24gZ2VvbWV0cmllc1xuICAgICAgICAgICAgZm4uY2FsbChjb250ZXh0LCB0aGlzLl9sYXllcnNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBlYWNoRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgIGZuLmNhbGwoY29udGV4dCwgdGhpcy5fbGF5ZXJzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0RmVhdHVyZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gIH0sXG5cbiAgYnJpbmdUb0JhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgaWYgKGxheWVyLmJyaW5nVG9CYWNrKSB7XG4gICAgICAgIGxheWVyLmJyaW5nVG9CYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgYnJpbmdUb0Zyb250OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgIGlmIChsYXllci5icmluZ1RvRnJvbnQpIHtcbiAgICAgICAgbGF5ZXIuYnJpbmdUb0Zyb250KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgcmVkcmF3OiBmdW5jdGlvbiAoaWQpIHtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuX3JlZHJhdyhpZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF9yZWRyYXc6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgdmFyIGdlb2pzb24gPSBsYXllci5mZWF0dXJlO1xuXG4gICAgLy8gaWYgdGhpcyBsb29rcyBsaWtlIGEgbWFya2VyXG4gICAgaWYgKGxheWVyICYmIGxheWVyLnNldEljb24gJiYgdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcikge1xuICAgICAgLy8gdXBkYXRlIGN1c3RvbSBzeW1ib2xvZ3ksIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb2ludFRvTGF5ZXIpIHtcbiAgICAgICAgdmFyIGdldEljb24gPSB0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKGdlb2pzb24sIGxhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKSk7XG4gICAgICAgIHZhciB1cGRhdGVkSWNvbiA9IGdldEljb24ub3B0aW9ucy5pY29uO1xuICAgICAgICBsYXllci5zZXRJY29uKHVwZGF0ZWRJY29uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb29rcyBsaWtlIGEgdmVjdG9yIG1hcmtlciAoY2lyY2xlTWFya2VyKVxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRTdHlsZSAmJiB0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKSB7XG4gICAgICB2YXIgZ2V0U3R5bGUgPSB0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKGdlb2pzb24sIGxhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKSk7XG4gICAgICB2YXIgdXBkYXRlZFN0eWxlID0gZ2V0U3R5bGUub3B0aW9ucztcbiAgICAgIHRoaXMuc2V0RmVhdHVyZVN0eWxlKGdlb2pzb24uaWQsIHVwZGF0ZWRTdHlsZSk7XG4gICAgfVxuXG4gICAgLy8gbG9va3MgbGlrZSBhIHBhdGggKHBvbHlnb24vcG9seWxpbmUpXG4gICAgaWYgKGxheWVyICYmIGxheWVyLnNldFN0eWxlICYmIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgdGhpcy5yZXNldFN0eWxlKGdlb2pzb24uaWQpO1xuICAgIH1cbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlTGF5ZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlTGF5ZXIob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZlYXR1cmVMYXllcjtcbiIsIi8vIGV4cG9ydCB2ZXJzaW9uXG5leHBvcnQge3ZlcnNpb24gYXMgVkVSU0lPTn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuLy8gaW1wb3J0IGJhc2VcbmV4cG9ydCB7IFN1cHBvcnQgfSBmcm9tICcuL1N1cHBvcnQnO1xuZXhwb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vT3B0aW9ucyc7XG5leHBvcnQgeyBFc3JpVXRpbCBhcyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcbmV4cG9ydCB7IGdldCwgcG9zdCwgcmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XG5cbi8vIGV4cG9ydCB0YXNrc1xuZXhwb3J0IHsgVGFzaywgdGFzayB9IGZyb20gJy4vVGFza3MvVGFzayc7XG5leHBvcnQgeyBRdWVyeSwgcXVlcnkgfSBmcm9tICcuL1Rhc2tzL1F1ZXJ5JztcbmV4cG9ydCB7IEZpbmQsIGZpbmQgfSBmcm9tICcuL1Rhc2tzL0ZpbmQnO1xuZXhwb3J0IHsgSWRlbnRpZnksIGlkZW50aWZ5IH0gZnJvbSAnLi9UYXNrcy9JZGVudGlmeSc7XG5leHBvcnQgeyBJZGVudGlmeUZlYXR1cmVzLCBpZGVudGlmeUZlYXR1cmVzIH0gZnJvbSAnLi9UYXNrcy9JZGVudGlmeUZlYXR1cmVzJztcbmV4cG9ydCB7IElkZW50aWZ5SW1hZ2UsIGlkZW50aWZ5SW1hZ2UgfSBmcm9tICcuL1Rhc2tzL0lkZW50aWZ5SW1hZ2UnO1xuXG4vLyBleHBvcnQgc2VydmljZXNcbmV4cG9ydCB7IFNlcnZpY2UsIHNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL1NlcnZpY2UnO1xuZXhwb3J0IHsgTWFwU2VydmljZSwgbWFwU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMvTWFwU2VydmljZSc7XG5leHBvcnQgeyBJbWFnZVNlcnZpY2UsIGltYWdlU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMvSW1hZ2VTZXJ2aWNlJztcbmV4cG9ydCB7IEZlYXR1cmVMYXllclNlcnZpY2UsIGZlYXR1cmVMYXllclNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL0ZlYXR1cmVMYXllclNlcnZpY2UnO1xuXG4vLyBleHBvcnQgbGF5ZXJzXG5leHBvcnQgeyBCYXNlbWFwTGF5ZXIsIGJhc2VtYXBMYXllciB9IGZyb20gJy4vTGF5ZXJzL0Jhc2VtYXBMYXllcic7XG5leHBvcnQgeyBUaWxlZE1hcExheWVyLCB0aWxlZE1hcExheWVyIH0gZnJvbSAnLi9MYXllcnMvVGlsZWRNYXBMYXllcic7XG5leHBvcnQgeyBSYXN0ZXJMYXllciB9IGZyb20gJy4vTGF5ZXJzL1Jhc3RlckxheWVyJztcbmV4cG9ydCB7IEltYWdlTWFwTGF5ZXIsIGltYWdlTWFwTGF5ZXIgfSBmcm9tICcuL0xheWVycy9JbWFnZU1hcExheWVyJztcbmV4cG9ydCB7IER5bmFtaWNNYXBMYXllciwgZHluYW1pY01hcExheWVyIH0gZnJvbSAnLi9MYXllcnMvRHluYW1pY01hcExheWVyJztcbmV4cG9ydCB7IEZlYXR1cmVNYW5hZ2VyIH0gZnJvbSAnLi9MYXllcnMvRmVhdHVyZUxheWVyL0ZlYXR1cmVNYW5hZ2VyJztcbmV4cG9ydCB7IEZlYXR1cmVMYXllciwgZmVhdHVyZUxheWVyIH0gZnJvbSAnLi9MYXllcnMvRmVhdHVyZUxheWVyL0ZlYXR1cmVMYXllcic7XG4iXSwibmFtZXMiOlsiVXRpbCIsIkRvbVV0aWwiLCJnZW9qc29uVG9BcmNHSVMiLCJnMmEiLCJhcmNnaXNUb0dlb0pTT04iLCJhMmciLCJsYXRMbmciLCJsYXRMbmdCb3VuZHMiLCJvcHRpb25zIiwiTGF0TG5nQm91bmRzIiwiTGF0TG5nIiwiR2VvSlNPTiIsIkNsYXNzIiwicG9pbnQiLCJFdmVudGVkIiwicmVxdWVzdCIsIlRpbGVMYXllciIsIkRvbUV2ZW50IiwiQ1JTIiwiSW1hZ2VPdmVybGF5IiwiTGF5ZXIiLCJwb3B1cCIsImJvdW5kcyIsInNldE9wdGlvbnMiLCJQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFPLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxjQUFjLElBQUksaUJBQWlCLElBQUksSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztBQUNoRyxBQUFPLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxFQUFFLENBQUM7O0FBRS9FLEFBQVUsSUFBQyxPQUFPLEdBQUc7RUFDbkIsSUFBSSxFQUFFLElBQUk7RUFDVixhQUFhLEVBQUUsYUFBYTtDQUM3Qjs7QUNOUyxJQUFDLE9BQU8sR0FBRztFQUNuQixzQkFBc0IsRUFBRSxFQUFFO0NBQzNCOztBQ0VELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQzs7QUFFbEIsU0FBUyxTQUFTLEVBQUUsTUFBTSxFQUFFO0VBQzFCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQzs7RUFFZCxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDOztFQUU5QixLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtJQUN0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDOUIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFD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Q0FBQztHQUNYO0VBQ0QsUUFBUSxLQUFLLElBQUksQ0FBQyxFQUFFO0NBQ3JCOzs7QUFHRCxTQUFTLHNCQUFzQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUMvQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BGLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEYsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFbkYsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0lBQ1os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\n"],"sourceRoot":""}